Программа, демонстрирующая иерархию окон 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 были использованы именно эти типы окон.

Нужно о них помнить следующее что:

Перекрывающееся окно никогда не имеет родителя

Дочернее окно всегда им