Для того чтобы вывести на экран любое окно, программа обычно должна сначала описать его внешний вид и все свойства, то есть то, что называется классом окна. О том, как это сделать, — немного позже, а для начала выведем одно из окон с предопределенным классом — окно типа MessageBox. MessageBox — это маленькое окно с указанным текстовым сообщением и одной или несколькими кнопками. В нашем примере сообщением будет традиционное «Hello world!», и кнопка будет всего одна — ОК.
; winhello.asm ; Графическое win32-приложениe ; Выводит окно типа mesagebox с текстом "Hello world!" ; include def32.inc include kernel32.inc include user32.inc
.386 .model flat .const ; заголовок окна hello_title db "First win32 GUI program",0 ; сообщение hello_message db "Hello world!",0 .code _start: push MB_ICONINFORMATION ; стиль окна push offset hello_title ; адрес строки с заголовком push offset hello_message ; адрес строки с сообщением push 0 ; идентификатор предка call MessageBox
push 0 ; код выхода call ExitProcess ; завершение программы end _start
Естественно, нам потребуется добавить к файлу def32.inc строку:
; из winuser.h MB_ICONINFORMATION equ 40h
и создать новый файл, user32.inc, в который будут входить определения функций из user32.dll — библиотеки, куда входят все основные функции, отвечающие за оконный интерфейс:
; user32.inc ; включаемый файл с определениями функций из user32.dll ; ifdef _TASM_ includelib import32.lib ; имена используемых функций extrn MessageBoxA:near ; присваивания для облегчения читаемости кода MessageBox equ MessageBoxA else includelib user32.lib ; истинные имена используемых функций extrn __imp__MessageBoxA@16:dword ; присваивания для облегчения читаемости кода MessageBox equ __imp__MessageBoxA@16
Теперь можно скомпилировать эту программу аналогично тому, как мы компилировали winurl.asm, и запустить — на экране появится маленькое окно с нашим сообщением и кнопкой ОК, которое пропадет после того, как будет нажата эта кнопка. Если скомпилировать winhello.asm как консольное приложение, ничего не изменится, текстовое окно с именем программы будет открыто до тех пор, пока окно с нашим сообщением не будет закрыто.