Створення вікна, Assembler, Програмування, статті

Основні кроки при створення вікна:

1. Отримати дискриптор Вашої програми (обов’язково)
2. Отримати покажчик на командний рядок (не обов’язково)
3. Зареєструвати клас вікна (не вимагається, якщо Ви використовуєте
вбудований тип вікна, наприклад
MessageBox)
4. Створити вікно (обов’язково)
5. Показати вікно (якщо хочете негайно показати вікно)
6. Оновити вікно
7. Утворити нескінченний цикл, обробляє повідомлення вікна
8. Якщо є повідомлення, то обробити спеціалізованої функцією
відповідальної за вікно
9. Вийти з програми, якщо користувач закрив вікно

Розберемо просту програму, яка виводить тільки вікно.
Я взяв приклад програми Wap32.asm з пакету TASM і кілька упостіл її.

.386
.model flat, stdcall
include win32.inc
Файл win32.inc містить деякі потрібні константи і структури

extrn CreateWindowExA:PROC
extrn DefWindowProcA:PROC
extrn DispatchMessageA:PROC
extrn ExitProcess:PROC
extrn GetMessageA:PROC
extrn GetModuleHandleA:PROC
extrn LoadCursorA:PROC
extrn LoadIconA:PROC
extrn PostQuitMessage:PROC
extrn RegisterClassA:PROC
extrn ShowWindow:PROC
extrn TranslateMessage:PROC
extrn UpdateWindow:PROC

.data

newhwnd dd 0
msg MSGSTRUCT <?>
wc WNDCLASS <?>
hInst dd 0
szTitleName db ‘Win32 Assembly Program’,0
szClassName db ‘ASMCLASS32’,0

.code
start:

push 0
call GetModuleHandleA
mov [hInst], eax
Отримаємо дискриптор програми.
Далі инициализируем структуру WndClass для реєстрації вікна

mov [wc.clsStyle], CS_HREDRAW + CS_VREDRAW +
CS_GLOBALCLASS
clsStyle – визначає стиль класу

mov [wc.clsLpfnWndProc], offset WndProc
clsLpfnWndProc – вказує на процедуру вікна

mov [wc.clsCbClsExtra], 0
mov [wc.clsCbWndExtra], 0

mov eax, [hInst]
mov [wc.clsHInstance], eax
clsHInstance – містить дискриптор програми

push IDI_APPLICATION
push 0
call LoadIconA
mov [wc.clsHIcon], eax

push IDC_ARROW
push 0
call LoadCursorA
mov [wc.clsHCursor], eax

mov [wc.clsHbrBackground], COLOR_WINDOW + 1
mov dword ptr [wc.clsLpszMenuName], 0
mov dword ptr [wc.clsLpszClassName], offset szClassName
clsLpszClassName – визначає ім’я класу вікна

push offset wc
call RegisterClassA
Створюємо вікно:

push 0
push [hInst]; дискриптор вікна
push 0
push 0
push CW_USEDEFAULT; висота
push CW_USEDEFAULT; ширина
push CW_USEDEFAULT ; y
push CW_USEDEFAULT ; x
push WS_OVERLAPPEDWINDOW; стиль
push offset szTitleName; заголовок вікна
push offset szClassName; ім’я класу
push 0; додатковий стиль

call CreateWindowExA

mov [newhwnd], eax
newhwnd – дискриптор вікна
Покажемо вікно:

push SW_SHOWNORMAL
push [newhwnd]
call ShowWindow
Оновимо вікно:

push [newhwnd]
call UpdateWindow
Створюємо цикл для обробки повідомлень вікна

msg_loop:
push 0
push 0
push 0
push offset msg
call GetMessageA

cmp ax, 0
je end_loop

push offset msg
call TranslateMessage

push offset msg
call DispatchMessageA

jmp msg_loop

end_loop:
вихід з програми:

push [msg.msWPARAM]
call ExitProcess
Процедура вікна:

WndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD,\
wparam:DWORD, lparam:DWORD
Win32 вимагає, щоб EBX, EDI, і ESI були збережені

cmp [wmsg], WM_DESTROY
je wmdestroy

push [lparam]
push [wparam]
push [wmsg]
push [hwnd]
call DefWindowProcA
jmp finish

wmdestroy:
push 0
call PostQuitMessage
mov eax, 0
finish:
ret
WndProc endp
ends
end start

На перший погляд здається, що занадто багато написано для простої програми. На самому ж справі писати все повністю не потрібно, достатньо написати файл один раз, а потім використовувати його як шаблон для своїх нових програм. Можна створити об’єктний файл і використовувати його як завантажувальний код, а писати тільки процедуру вікна (WinProc).

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*