Ассемблерное программирование в 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 [Оставить отзыв в гостевой]
Hosted by uCoz