Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Анализ программного кода начнем с рассмотрения процесса создания элементов управления. Все ОНИ СОЗДаЮТСЯ При ПОМОЩИ фуНКЦИИ CreateWindowEx по схожему сценарию, поэтому достаточно подробно остановиться на только одном элементе, например кнопке. Кнопка создается при выполнении следующего фрагмента кода:
invoke CreateWindowEx, NULL, ADDR ButtonClassName, ADDR ButtonText,\ WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\
140, 95, 130, 25, hWin, ButtonID, hlnstance, NULL
mov hwndButton, EAX

Среди параметров вызова функции следует выделить:
• ADDR ButtonClassName — указатель на строку с именем класса (Button);
• WSCHILD — информирует о том, что создаваемое окно является дочерним;
• HWin — дескриптор родительского окна;
• ButtonID — идентификатор элемента управления.

Дескриптор вновь созданного окна сохраняем в переменной hwndButton.
При нажатии на кнопку приложению посылается сообщение WMCOMMAND. Оконная процедура анализирует это сообщение, как показано в следующем фрагменте программного кода:
cmp uMsg, WM_COMMAND
j ne next_2
mov EAX,wParam
cmp lParam, 0
j e ex_wmcom
cmp AX, ButtonID
jne ex_wmcom
shr EAX, 16
cmp AX, BN_CLICKED
jne ex_wmcom
invoke GetWindowText, hwndEditl, ADDR buffer, 512
mov bytesWritten, EAX
call ReplaceSpace
invoke SetWindowText, hwndEdit2, ADDR buffer
ex_wmcom:
ret

Вначале анализируем, содержит ли параметр lParam значение, отличное от 0. Если да, то сообщение инициировано элементом управления, и мы идем дальше. Значение lParam, равное 0, говорит о том, что сообщение вызвано, например, выбором пункта меню, что нас не интересует.
mov ЕАХ,wParam
cmp lParam, 0
j e ex_wmcom

Предположим, что сообщение вызвано элементом управления, т. е. переменная lParam отлична от 0. Дальше необходимо определить, кнопка ли это. Здесь нам пригодится идентификатор кнопки ButtoniD, определенный ранее:
ButtoniD EQU 1
Вспомним, что в регистре ЕАХ К этому моменту находится значение wParam, причем регистр АХ содержит идентификатор элемента управления (lParam не равен 0). Следующий фрагмент кода определяет, является ли элемент управления кнопкой и, если да, то была ли кнопка нажата (BNCLICKED):
cmp АХ, ButtoniD
jne ex_wmcom ; нет, это не кнопка.Выходим из обработчика shr ЕАХ, 16 ; если это кнопка, то сдвигаем старшие биты ; в АХ для последующего анализа cmp АХ, BN_CLICKED jne ex_wmcom ; если кнопка нажата, обрабатываем нажатие invoke mov call

GetWindowText, hwndEditl, ADDR buffer, 512
bytesWritten, EAX
ReplaceSpace
invoke SetWindowText, hwndEdit2, ADDR buffer
ex_wmcom:
ret

Текст из поля редактирования с дескриптором hwndEditi копируется в буфер с максимальным размером в 512 байт при помощи функции WIN API GetwindowText. В качестве результата функция возвращает количество байт, фактически скопированных в буфер. Это значение сохраняется в переменной byteswritten. Далее вызываем процедуру ReplaceSpace, которая использует адрес буфера и число скопированных байт в качестве параметров.
После преобразования текст выводится из буфера памяти в окно второго поля редактирования (дескриптор hwndEdit2).

5.9. Диалоговые окна и их использование
Диалоговое окно во многом напоминает обычное выпадающее окно Windows. Основное различие между ними состоит в том, что в диалоговых окнах применяются шаблоны, определяющие элементы управления, создаваемые в них. Все такие шаблоны определяются в файле описания ресурса для типа DIALOGEX. Можно сказать и так: диалоговое окно — это обычное окно Windows, которое разработано с дочерними окнами (элементами управления) для дальнейшего использования. Кроме того, операционная система снабжает диалоговое окно возможностями обработки клавиатурного ввода, например нажатий клавиш сдвига, <Таb> и , чего нет в обычном окне.


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru