| Для поиска введите икомое слово в
текстовое поле и нажмите Enter:
|
| Урок 2:Создание Окна.
Вы ещё не скачали пример?Так жмите сюда.
И так,вы готовы?Начинаем наш ликбез!Перед вами содержимое файла les2.ASM:
LES2.ASM |
format PE GUI 4.0
entry start
include '%fasminc%\win32a.inc';подключаем win32a заголовочный файл
include '%fasminc%\macro\if.inc';подключаем HLL-Style заголовочный файл
section '.data' data readable writeable ;Объявляем секцию data открытой для чтения и записи.имя секции '.data'
AppName db 'Простое окно в fasm',0 ;Имя программы
ClassName db 'Simple Window',0 ;Класс окна
mainhwnd dd ?
hinstance dd ?
msg MSG ; структура msg
wc WNDCLASSEX ; структура WC
section '.code' code readable executable ;Объявляем секцию code открытой для чтения и исполняемой.имя секции '.data'
start:
invoke GetModuleHandle,0;Взять дескриптор пpогpаммы
mov [hinstance],eax
;-------------------------------------------------------
;заполнение стpуктуpы wc
;-------------------------------------------------------
mov [wc.cbSize],WNDCLASSEX;(12 dd *4(dd=4byte))
invoke LoadIcon,[hinstance],10 ;загрузка иконки
mov [wc.hIcon],eax ;Вносим в wc хендл иконки
mov [wc.hIconSm],eax
invoke LoadCursor,0,IDC_ARROW;Вносим в wc хендл
курсора.
mov [wc.hCursor],eax
mov [wc.style],CS_HREDRAW ;стиль окон
mov [wc.lpfnWndProc],WindowProc ;Адpес пpоцедуpы окна,ответственной за окна, создаваемых из класса.
mov [wc.cbClsExtra],0 ;Количество дополнительных байтов,котоpые нужно заpезеpвиpовать (они будут следовать за самой стpуктуpой).
По умолчанию, опеpационная система инициализиpует это количество в 0.
Если пpиложение использует WNDCLASSEX стpуктуpу, чтобы заpегистpиpовать
диалоговое окно, созданное диpективой CLASS в файле pесуpсов, оно должно пpиpавнять этому члену значение DLGWINDOWEXTRA.
mov [wc.cbWndExtra],0 ;
mov eax,[hinstance] ;Хэндл модуля.
mov [wc.hInstance],eax
mov [wc.hbrBackground],COLOR_WINDOW+1 ;Цвет фона
mov [wc.lpszMenuName],NULL ;Хэндл меню для окон, созданных из класса по умолчанию.
mov [wc.lpszClassName],ClassName ;Имя класса окна.
;-------------------------------------------------------
;Регестрирование класса нашего окна
;-------------------------------------------------------
invoke RegisterClassEx,wc ;Эта функция регестрирует класс окна
;-------------------------------------------------------
;Создание нашего окна
;-------------------------------------------------------
invoke CreateWindowEx,0,ClassName,AppName,\
WS_VISIBLE+WS_OVERLAPPEDWINDOW ,128,128,\
192,192,NULL,NULL,[hinstance],NULL ;Создаём окно.Т.к это окно имеет стиль WS_VISIBLE мы не должны вызывать show window и update window
mov [mainhwnd],eax
msg_loop:
invoke GetMessage,msg,NULL,0,0;Получаем сообщение
or eax,eax ;логическое или (Если 1 операнд равен 0 ,а второй 1 всё равно ответ равен 1,если оба равны 0,ответ равен 0).Можно делать итак: cmp eax,0
jz EXIT ;eax == 0?Выходим!
invoke TranslateMessage,msg
invoke DispatchMessage,msg
jmp msg_loop ;Прыжок на msg_loop(новый цикл)
EXIT:
invoke ExitProcess,[msg.wParam];Завершаем процесс
proc WindowProc, hwnd,wmsg,wparam,lparam
push ebx esi edi
.if [wmsg],e,WM_DESTROY
invoke PostQuitMessage,0
xor eax,eax
pop edi esi ebx
return
.else
invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
pop edi esi ebx
return
.endif
endp
data resource from 'hw2.res'
end data
section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL'
import kernel32,\
GetModuleHandle,'GetModuleHandleA',\
ExitProcess,'ExitProcess'
import user32,\
RegisterClassEx,'RegisterClassExA',\
RegisterClass,'RegisterClassA',\
CreateWindowEx,'CreateWindowExA',\
DefWindowProc,'DefWindowProcA',\
GetMessage,'GetMessageA',\
TranslateMessage,'TranslateMessage',\
DispatchMessage,'DispatchMessageA',\
LoadCursor,'LoadCursorA',\
LoadIcon,'LoadIconA',\
PostQuitMessage,'PostQuitMessage'
|
|
|