Программа, демонстрирующая иерархию окон Windows
Информация - Компьютеры, программирование
Другие материалы по предмету Компьютеры, программирование
?овим вызов 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
call EndPaint
mov еах,0;возвращаемое значение-0
jmp exit_wndproc
wmdestroy:
push SND_SYNC+SND_FILENAME
push NULL
push offset playFileDestroy
call PlaySoundA
;послать сообщение WМ_QUIТ
;готовим вызов VOID PostQuitMessage( int nExitCode )
push 0
call PostQuitMessage
mov eax, О;возвращаемое значение - 0
jmp exit_wndproc
default:
; обработка по умолчанию
;готовим вызов LRESULTDefWindowProc( HWND hWnd, UINTMsg,
; WPARAMwParam,LPARAMlParam)
push @@lparam
push @@wparam
push @@mes
push @@nwnd
call DefWindowProcA
jmp exit_wndproc
;... ... ...
exit_wndproc:
ret
WindowProc endp
end start
3.Иерархия окон
Изучив по дисциплине Системное программное обеспечение написание окон Windows на языке Assembler и рассматривая графическую оконную систему нельзя обойтись без подробного рассмотрения того, какие окна можно отображать на экране.
Тип окна задается 32-битовым без знаковым целым числом, которое указывается третьим параметром вызова функции Create Window.
Существует всего лишь три основных типа окон Window.
1 тип. Перекрывающиеся окна. Флаг WS_OVERLAPPED.
2 тип. Вспомогательные окна. Флаг WS_POPUP.
3 тип. Дочерние окна. . Флаг WS_CHILD.
Для написания курсового проекта, который имеет тему Программа демонстрирующая иерархию окон Windows были использованы именно эти типы окон.
Нужно о них помнить следующее что:
Перекрывающееся окно никогда не имеет родителя
Дочернее окно всегда им