Ассемблерное программирование в Windows |
23.09.2004 |
||
Глава 8. Диалоги.В этой главе мы познакомимся с диалогами. Диалогами называют дополнительные окна, предназначенные для общения программы с пользователем. Диалоги, как правило, включают в себя кнопки, поля ввода, графические изображения и другие объекты. Как и у главного окна, у диалога есть своя процедура обработки сообщений. В этой главе мы допишем к нашей программе диалоговое окно «О программе». Прежде всего допишем в файл «user32.inc» еще 2 функции: extrn __imp__EndDialog@8:dword extrn __imp__DialogBoxParamA@20:dword EndDialog equ __imp__EndDialog@8 DialogBoxParam equ __imp__DialogBoxParamA@20 Теперь нарисуем окно диалога. Для этого в меню выберем «Project → Add New → Dialog». Назовем файл диалога «about.dlg» и нажмем кнопку «Сохранить». Перед нами откроется среда визуальной разработки диалога. На окно, возникшее по умолчанию, нанесём текст, щелкнув по кнопке «А» в левом вертикальном меню компонентов, а затем на поверхности окна. Растянем область текста за угол. В правом нижнем углу отображается окно свойств выделенных компонентов. В нашем случае там отображаются свойства нашей надписи. Изменим свойство «Caption», записав в него текст, который мы хотим видеть в созданной нами области текста. Думаю, что с визуальным конструированием у вас проблем не возникнет. Сделаем на окне несколько разных надписей. Теперь вставим туда кнопку. В меню компонентов под кнопкой с буквой «А» расположена кнопка с изображением кнопки. С помощью нее создадим кнопку в нашем окне и в её свойстве «ID» впишем «1». Это число будет посылаться в нашу программу при её нажатии. В свойстве «Caption» напишем «ОК». Теперь вставим в наше окно изображение (например, вашу фотографию). Подготовьте небольшое изображение, например, 100х140 точек. Сохраните его в формате «bmp» в папке «/Res». Теперь пропишем его в ресурсы. Для этого нажимаем «Project → Resource» и в появившееся окно добавляем ресурс «BITMAP» с именем, например, «IAM» и идентификатором «0». В поле «File» прописываем путь и имя файла изображения. Нажимаем «OK». Теперь в меню компонентов находим кнопку «Image» (с красным логотипом RadASM'a). С помощью нее создаем на диалоговом окне поле изображение. В свойстве «Image» прописываем имя рисунка, прописанное нами в ресурсах «IAM» или путь и имя файла изображения. Всё сохраняем. Итак, у нас есть файл ресурсов с описанием диалога. Теперь подключим диалог к программе. Пусть он у нас вызывается при щелчке на пункте меню «О программе». Вносим исправления в основной файл. Из сегмента данных удаляем строчку «about_msg db "О программе",0» Находим метку «menu_about:», и вместо двух строчек, следующих за ней вписываем следующее: push ebx ;0 — значение параметра сообщения WM_INITDIALOG, ;отправляемого в процедуру при отображении диалога. push offset about_proc ;Смещение к процедуре обработки сообщений диалога. push wp_hWnd ;Идентификатор окна-предка. push 3 ;Идентификатор диалога. push wc.hInstance ;Идентификатор программы. call DialogBoxParam ;запустим диалог. jmp short end_wm_check ;Выйдем из оконной процедуры. Теперь дописываем еще одну процедуру — процедуру обработки сообщений от диалога (аналог оконной процедуры главного окна): about_proc proc near ap_hDlg equ dword ptr [ebp+08h] ;Присвоить названия разным глубинам стека, ap_uMsg equ dword ptr [ebp+0ch] ;в которых при вызове этой процедуры будут ap_wParam equ dword ptr [ebp+10h] ;лежать переданные ей параметры. ap_lParam equ dword ptr [ebp+14h] ;Четыре параметра этой процедуры идентичны ;первым четырем параметрам ;структуры передачи сообщений msg_. push ebp ;Сохранить регистр ebp mov ebp,esp ;Сохранить регистр указателя стека pusha ;Сохранить все регистры в стеке сmp ap_uMsg,WM_COMMAND ;Пришло сообщение WM_COMMAND? jne dont_proceed ;Нет, выйти из диалоговой процедуры. cmp ap_wParam,1 ;Это сообщение от нашей кнопки? jne dont_proceed ;Нет, выйти из диалоговой процедуры. push 1 ;иначе код возврата = 1 push ap_hDlg ;Идентификатор диалога call EndDialog ;Закрыть диалог dont_proceed: popa ;Восстановить все регистры leave ;Восстановить esp и ebp xor eax,eax ;В качестве кодв аозврата вернуть ноль ret 16 ;Очистить стек от параметров и выйти about_proc endp Вот и всё. Компилируем программу и запускаем. Теперь, при нажатии на кнопку «О программе» у нас возникает диалоговое окно, а при нажатии на кнопку окно закрывается. |
|||
[Вернуться в начало] |
Глава
6–7 |
Глава 9 | [Оставить отзыв в гостевой] |