Программа демонстрирующая иерархию окон Windows
Информация - Компьютеры, программирование
Другие материалы по предмету Компьютеры, программирование
уль.
;далее hInst будет использоваться в качестве дескриптора данного приложения
;конец стартового кода
WinMain:
;определить класс окна ATOM RegisterClassEx(CONST WNDCLASSEX *lpWndClassEx),
; где *lpWndClassEx - адрес структуры WndClassEx
;для начала инициализируем поля структуры WndClassEx
movwcl.cbSize,typeWNDCLASSEX-."> mov wcl.cbSize,typeWNDCLASSEX -.размер структуры
:в wcl.cbCIZE
movwcl.style,CS_HREDRAW+CS_VREDRAW"> mov wcl.style,CS_HREDRAW+CS_VREDRAW
movwcl.pfnWndProg,offsetWindowProg;"> mov wcl.pfnWndProg,offsetWindowProg ;адрес оконной процедуры
movwcl.cbCisExtra,0"> mov wcl.cbCisExtra,0
movwcl.cbWndExtra,0"> mov wcl.cbWndExtra,0
mov eax,hInst
mov ;дискриптор приложения в поле hInstance структуры wcl
movwcl.hInstance,eax"> mov wcl.hInstance, eax
;готовим вызов HICON LoadIcon (HINSTANCE hInstance, LPCTSTR lpIconName)
push IDI_APPLICATION ,-стандартный значок
push 0 ;NULL
саП LoadIconA
movwcl.hIcon,eax,-hIconI"> mov wcl.hIcon, eax ,-дескриптор значка в поле hIcon I
;структуры wcl
;готовим вызов HCURSOR LoadCursorA (HINSTANCE hInstance, LPCTSTR M ;lpCursorName)
push IDC_ARROW ,-стандартный курсор - стрелка
push 0
саll LoadCursorA
movwcl.hCursor,eax;hCursor"> mov wcl.hCursor,eax ;дескриптор курсора в поле hCursor
;структуры wc1
;определим цвет фона окна - белый
;готовим вызов HGDIOBJ GetStockObject(int fnObject)
push WHITE_BRUSH
саП GetStockObject
movwcl.hbrBackground,eax"> mov wcl.hbrBackground, eax
movdwordptrwcl.lpszMenuName,0;"> mov dword ptrwcl.lpszMenuName, 0 ;без главного меню
movdwordptrwcl.lpszClassName,offsetszC1assName;"> mov dwordptrwcl.lpszClassName,offsetszC1assName; имя
;класса окна
movwcl.hIconSm,0"> mov wcl.hIconSm, 0
;регистрируем класс окна - готовим вызов RegisterClassExA (&wndclass)
push offset wcl
саП RegisterClassExA
test ax, ах;проверить на успех регистрации класса окна
jz end_cyc1_msg ;неудача
;создаем окно:
;готовим вызовHWND CreateWindowExA(DWORDdwExStyle,
LPCTSTR1pClassName,
; LPCTSTR 1pW1ndowName, DWORD dwStyle, int x, int у, int nWidth,
|;int nHeight,
; HWND hWndParent, HMENU hMenu, HANDLE hInstance, LPVOID
;lpParam)
push 0 ;lpParam
push hInst ;hInstance
push NULL ;menu
push NULL ;parent hwnd
push CW_USEDEFAULT ;высота окна
push CW_USEDEFAULT ;ширина окна
push CW_USEDEFAULT ;координата у левого верхнего угла
;окна
push CW_USEDEFAULT ;координата х левого верхнего угла
push WS_OVERLAPPEDWINDOW ;стиль окна
push offset szTitleName ;строка заголовка окна
push offset szClassName ;имя класса окна
push NULL
саll CreateWindowExA
mov hwnd,eax ;-дескриптор окна
;показать окно:
;готовим вызов BOOL ShowWindow( HWND hWnd, int nCmdShow )
push SW_SHOWNORMAL
push hwnd
call ShowWindow
;перерисовываем содержимое окна
;готовим вызов BOOL UpdateWindow( HWND hWnd )
push hwnd
call UpdateWindow
;запускаем цикл сообщений:
;готовим вызов BOOL GetMessageA( LPMSG lpMsg, HWND hWnd,
; UINTwMsgFilterMin,UINTwMsgFilterMax)
cycl_msg:
push 0
push 0
push NULL
push offset message
cal 1 GetMessageA
cmp ах, 0
je end_cycl_msg
;трансляция ввода с клавиатуры
;готовим вызов BOOL Trans1ateMessage( CONST MSG *lpMsg )
push offset message
call TranslateMessage
;отправим сообщение оконной процедуре
;готовим вызов LONG D1spatchMessage( CONST MSG *lpmsg )
push offset message
call DispatchMessageA
jmp cycl_msg
end_cycl_msg:
;выход из приложения
;готовим вызов VOID ExitProcess( UINT uExitCode )
push NULL
call ExitProcess
start endp
; - - - - - - - - - - - - --WindowProc-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
WindowProc proc
argP0nwnd:DWORD, PPmes:DWORD, @@wparam:DWORD, @@lparam:DWORD
uses ebx, edi, es1 ;эти регистры обязательно должны сохраняться
local @@hdc:DWORD
cmp @@mes, WM_DESTROY
je wmdestroy
cmp @@mes, WM_CREATE
je wmcreate
cmp @@mes, WM_PAINT
je wmpaint
jmp default
wmcreate:
;обозначим создание окна звуковым эффектом
;готовим вызов функции BOOL PlaySound(LPCSTR pszSound, HMODULE hmod, DWORD
;fdwSound )
push SND_SYNC+SND_FILENAME
push NULL
push offset playFileCreate
call PlaySoundA
mov eax, О;возвращаемое значение - 0
jmp exit_wndproc
wmpaint:
push SND_SYNC+SND_FILENAME
push NULL
push offset playFIilePaint
call P1aySoundA
;получим контекст устройства HDC BeginPaint(HWND nwnd,LPPAINTSTRUCT;LPpAINT)
push offset ps
push @@hwnd
call BeginPaint
mov @@hdc,eax
;выведем строку текста в окно BOOL TextOut( HDC hdc. int nXStart, int
:nYStart.
; LPCTSTR lpString, int cbString )
push MesWindowLen
push offset MesWindow
push 100
push 10
push @@hdc
call TextOutA
push offset ps
push @@hdc