Перейти на главную   
  helloworld.ru - документация и книги по программированию  
helloworld.ru - документация и книги по программированию
    главная     хостинг    
Поиск по сайту:  
Смотрите также
Языки программирования
C#
MS Visual C++
Borland C++
C++ Builder
Visual Basic
Quick Basic
Turbo Pascal
Delphi
JavaScript
Java
PHP
Perl
Assembler
AutoLisp
Fortran
Python
1C

Интернет-технологии
HTML
VRML
HTTP
CGI
FTP
Proxy
DNS
протоколы TCP/IP
Apache

Web-дизайн
HTML
Дизайн
VRML
PhotoShop
Cookie
CGI
SSI
CSS
ASP
PHP
Perl

Программирование игр
DirectDraw
DirectSound
Direct3D
OpenGL
3D-графика
Графика под DOS

Алгоритмы
Численные методы
Обработка данных

Сис. программирование
Драйверы

Базы данных
MySQL
SQL

Другое

Хостинг


Друзья
demaker.ru
Реклама

Лучший хостинг. Аренда серверов




helloworld.ru

Создание окна

Основные шаги при создании окна:
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).











helloworld.ru © 2001-2021
Все права защищены