 |
Когда пользователь выбирает элемент меню, Windows посылает
сообщение WM_COMAND тому окну, которому данное меню принадлежит.
Параметр сообщения wParam содержит идентификатор выбираемого эле-
мента меню. Когда окно ObjectWindows получает сообщение
WM_COMMAND, оно просматривает индексы диспетчеризации объекта ок-
на в поиске значения CM_FIRST + wParam. SelectBlackPen имеет ин-
декс CM_FIRST + CM_BLACK, где CM_BLACK имеет значение 104.
Чтобы определить, каким является параметр wParam командного
сообщения PenіBlack, вам нужно сообщить TDW, что он должен оста-
навливать выполнение при получении сообщения WM_COMMAND. Тогда вы
можете запустить программу, сделать выбор в меню и проверить па-
раметр wParam, чтобы посмотреть, не совпадает ли он с константой
TDeb 3.0 #3-3 = 73 =
CM_BLACK.
Перед тем, как установить точку останова, вам нужно вернуть-
ся обратно в TDW. Закройте окно прикладной программы
ColorScribble, затем, когда вы вернетесь в окно Module, для пере-
загрузки программы TDODEMOB используйте клавиши Ctrl-F2. Когда
выведется окно Module, следующим шагом будет установка точки ост-
анова по сообщению окна с помощью одного из двух методов, в зави-
симости от того, разрешена или запрещена поддержка
ObjectWondows.
По умолчанию специальная поддержка сообщений окон
ObjectWondows отсутствует. Вы не можете использовать описанный в
вашей программе объект окна для установки точки останова по сооб-
щению. Вместо этого нужно использовать описатель окна. Если вы
хотите использовать оконный объект (что легче, но может замедлить
отладку при наличии точки останова по сообщению), то нужно запус-
тить утилиту TDINST с параметром командной строки -w, выбрать ко-
манду OptionsіSource Debugging (ПараметрыіОтладка исходного кода)
и проверить параметр OWL Message Window.
Примечание: Информация о TDINST содержится в Приложении
D.
TDeb 3.0 #3-3 = 74 =
Задание точки останова по сообщению окна по описателю
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Если поддержка ObjectWindows у вас не разрешена, вы должны
установить точку прерывания по сообщению окна с помощью описате-
ля. Поскольку большинство установок окон выполняются в
ObjectWindow, для получения указателя придется пойти окольным пу-
тем.
Начальные установки окна выполняются функцией
InitMainWindow, но описатель устанавливается позднее. Чтобы уп-
равление снова вернулось в TWD, вы можете установить точку оста-
нова на одной из функций работы с "мышью" (например,
WMLButtonDown), запустить программу, затем использовать "мышь",
чтобы программу остановилась на точке останова. (Если точка оста-
нова находится на WMLButtonDown, вы можете нажать левую кнопку
"мыши".)
Другой метод заключается в переопределении функции
ObjectWindows SetupWindow, которая инициализирует описатель, бла-
годаря чему вы можете получить управление после каждой инициали-
зации указателя. Данная функция переопределяется в TDODEMOB, как
виртуальная функция. Она определяется следующим образом:
void ScribbleWindow::SetupWindow():
{
TWindow::SetupWindow();
}
Чтобы воспользоваться этим, позиционируйте курсор на закры-
вающей скобке функции SetupWindow, затем нажмите клавишу F4 для
выполнения программы до этой точки.
Независимо от используемого метода, когда TDW вновь получает
управление, для установки точек останова по сообщению WM_COMMAND
сделайте следующее:
1. Выберите команду DataіInspect (ДанныеіПроверка) и прове-
рьте объект окна MainWindow. Поскольку он в данный момент
находится вне области действия, вам нужно использовать
следующий синтаксис переопределения:
WinMain#MyAppMainWindow
Так как MyApp имеет тип SCribbleWindow (порожденный от
класса TApplication, элементом данных которого является
MainWindow), MainWindow является элементом MyApp.
2. Увеличьте окно Inspector, благодаря чему в верхней облас-
ти вы можете видеть элементы данных. HWindow - это эле-
менты данных, который содержит описатель окна.
3. Позиционируйте курсор на HWindow, затем нажмите клавиши
TDeb 3.0 #3-3 = 75 =
Shift-F3 и скопируйте его в окно Clipboard.
4. Выберите команду ViewіWindows Message (ОбзоріСообщения
Windows) для вывода диалогового окна Windows Massage (Со-
общения Windows).
5. Для вывода диалогового окна Add (Добавление) в верхней
левой области нажмите клавиши Ctrl-A. Выберите "кнопку"
Handle (Описатель), затем позиционируйте курсор на текс-
товом поле ввода.
6. Нажмите для вывода окна Clipboard клавиши Shift-F4. Пози-
ционируйте курсор на HWindow, выберите "кнопку" Contents
(для копирования HWindow - значения описателя), затем вы-
берите "кнопку" OK для копирования описателя в текстовое
поле ввода.
7. В текстовом поле ввода добавьте перед значением описателя
Ox, чтобы указать, что это шестнадцатиричное число, затем
нажмите Enter.
8. Перейдите в правую верхнюю область и наберите WM_COMMAND.
Вы увидите, что как только вы начнете набор символов, вы-
выдается диалоговое окно Set Message Filter (Установка
фильтра сообщения).
9. Установить параметр Action (Действие) для данного сообще-
ния в значение Break (Прерывание), затем для установки
точки прерывания по данному сообщению нажмите клавишу
Enter.
Программа будет возвращать управление в TDW всякий раз, ког-
да вы делаете выбор меню, поскольку при этом генерируется команда
WM_COMMAND.
TDeb 3.0 #3-3 = 76 =
Установка точки прерывания по сообщению на объекте окна
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Если вы используете для разрешения поддержки точки прерыва-
ния по сообщению окна в ObjectWindows программу TDINST, то можете
использовать для установки точки останова по сообщению оконный
объект MainWindow.
1. Переместите курсор на закрывающую фигурную скобку функции
InitMainWindow и нажмите клавишу F4 для выполнения прог-
раммы до этой точки.
2. Когда вы снова увидите окно Module, для вывода диалогово-
го окна OWL Windows Messages используйте команду
ViewіWindows Messagges (ОбзоріСообщения Windows).
3. В левой верхней области наберите MainWindow и нажмите
клавишу F4.
4. В верхней правой области наберите WM_COMMAND, выберите
"кнопку" Break, затем нажмите клавишу Enter, чтобы уста-
новить точку останова по данному сообщению.
Теперь программа будет возвращать управление в TDW каждый
раз когда вы делаете выбор меню, поскольку при этом генерируется
сообщение WM_COMMAND.
Проверка wParam
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Вы можете возобновить выполнение программы, нажав клавишу
F9.
Выберите в меню команду PenіBlack (Черный цвет пера). После
того, как вы выберите черное перо, TDW останавливает выполнение и
выводит на экран окно CPU, показывая, что в момент прерывания
программа выполняла код ядра Windows. Закройте окно CPU, нажав
клавиши Alt-F3.
Если это необходимо, снова выведите окно Windows Messages
(Сообщения Windows). Увеличьте окно до полного размера, благодаря
чему вы сможете видеть в нижней области все сообщение. Вы можете
видеть, что окно получает сообщение WM_COMMAND со значением в
wParam 204 (шестнадцатиричное значение 00CC). Но константа
CM_BLACK имеет значение 104, а не 204. Это является причиной то-
го, что не вызывалась виртуальная функция - прикладная программа
искала идентификатор CM_FIRST + 204, а его действительным значе-
нием было CM_FIRST + 104.
Значение 204 было задано в определении файла TDODEMO.RC.
Данной ошибки можно было бы избежать, используя для меню тот же
идентификатор, что и в файле заголовка, и поместив оператор
#INCLUDE для этого файла заголовка в начало файла .RC. Вместо
TDeb 3.0 #3-3 = 77 =
этого значения были использованы в определении меню. При этом от-
ветственность за перекрестную проверку значений возлагается на
программиста.
Если вы отредактируете TDODEMOB.H измените CM_BLACK на 204,
|