Программа демонстрирующая иерархию окон Windows
rsionEx(LPOSVERSIONINFO lpVersionInformation)
<58> ; push offset lpVersionInformation
<59> ; call GetVersionExA
<60> ;далее можно вставить код для анализа информации о версии Windows
<61> ;вызов LPTSTR GetCommandLine(VOID) - получить указатель на командную
строку
<62> ; call GetCommandLineA :врегистре еах адрес
<63> ;вызов LPVOID GetEnvironmentStrings (VOID) - получить указатель
;на блок с переменными окружения
<64> ; call GetEnvironmentStringsA ;врегистре еах адрес
<65> ;вызов VOIDGetStartupInfo(LPSTARTUPINFO lpStartupInfo) ;указатель
;на структуру STARTUPINFO
<66> ; push offset lpStartupInfo
<67> ; call GetStartupInfoA
<68> ;вызов HMODULE GetModuleHandleA (LPCTSTR lpModuleName)
<69> push NULL ;0->GetModuleHandle
<70> call GetModuleHandleA ;получить значение базового адреса,
<71> mov hInst, eax ;no которому загружен модуль.
<72> ;далее hInst будет использоваться в качестве дескриптора данного
приложения
<73> ;конец стартового кода
<74> WinMain:
<75>;определить класс окна ATOM RegisterClassEx(CONST WNDCLASSEX
*lpWndClassEx),
<76> ; где *lpWndClassEx - адрес структуры WndClassEx
<77> ;для начала инициализируем поля структуры WndClassEx
<78> mov wcl.cbSize,typeWNDCLASSEX -.размер структуры
:в wcl.cbCIZE
<79> mov wcl.style,CS_HREDRAW+CS_VREDRAW
<80> mov wcl.pfnWndProg,offsetWindowProg ;адрес оконной процедуры
<81> mov wcl.cbCisExtra,0
<82> mov wcl.cbWndExtra,0
<83> mov eax,hInst
<84> mov ;дискриптор приложения в поле hInstance структуры wcl
<85> mov wcl.hInstance, eax
<86> ;готовим вызов HICON LoadIcon (HINSTANCE hInstance, LPCTSTR
lpIconName)
<87> push IDI_APPLICATION ,-стандартный значок
<88> push 0 ;NULL
<89> саП LoadIconA
<90> mov wcl.hIcon, eax ,-дескриптор значка в поле hIcon I
;структуры wcl
<91> ;готовим вызов HCURSOR LoadCursorA (HINSTANCE hInstance, LPCTSTR M
;lpCursorName)
<92> push IDC_ARROW ,-стандартный курсор - стрелка
<93> push 0
<94> саll LoadCursorA
<95> mov wcl.hCursor,eax ;дескриптор курсора в поле hCursor
;структуры wc1
<96> ;определим цвет фона окна - белый
<97> ;готовим вызов HGDIOBJ GetStockObject(int fnObject)
<98> push WHITE_BRUSH
<99> саП GetStockObject
<100> mov wcl.hbrBackground, eax
<101> mov dword ptrwcl.lpszMenuName, 0 ;без главного меню
<102> mov dwordptrwcl.lpszClassName,offsetszC1assName; имя
;класса окна
<103> mov wcl.hIconSm, 0
<104> ;регистрируем класс окна - готовим вызов RegisterClassExA (&wndclass)
<105> push offset wcl
<106> саП RegisterClassExA
<107> test ax, ах;проверить на успех регистрации класса окна
<108> jz end_cyc1_msg ;неудача
<109> ;создаем окно:
<110> ;готовим вызовHWND CreateWindowExA(DWORDdwExStyle,
LPCTSTR1pClassName,
<111> ; LPCTSTR 1pW1ndowName, DWORD dwStyle, int x, int у, int nWidth,
|;int nHeight,
<112> ; HWND hWndParent, HMENU hMenu, HANDLE hInstance, LPVOID
;lpParam)
<113> push 0 ;lpParam
<114> push hInst ;hInstance
<115> push NULL ;menu
<116> push NULL ;parent hwnd
<117> push CW_USEDEFAULT ;высота окна
<118> push CW_USEDEFAULT ;ширина окна
<119> push CW_USEDEFAULT ;координата у левого верхнего угла
;окна
<120> push CW_USEDEFAULT ;координата х левого верхнего угла
<121> push WS_OVERLAPPEDWINDOW ;стиль окна
<122> push offset szTitleName ;строка заголовка окна
<123> push offset szClassName ;имя класса окна
<124> push NULL
<125> саll CreateWindowExA
<126> mov hwnd,eax ;-дескриптор окна
<127> ;показать окно:
<128> ;готовим вызов BOOL ShowWindow( HWND hWnd, int nCmdShow )
<129> push SW_SHOWNORMAL
<130> push hwnd
<131> call ShowWindow
<132> ;перерисовываем содержимое окна
<133> ;готовим вызов BOOL UpdateWindow( HWND hWnd )
<134> push hwnd
<135> call UpdateWindow
<136> ;запускаем цикл сообщений:
<137> ;готовим вызов BOOL GetMessageA( LPMSG lpMsg, HWND hWnd,
<138> ; UINTwMsgFilterMin,UINTwMsgFilterMax)
<139> cycl_msg:
<140> push 0
<141> push 0
<142> push NULL
<143> push offset message
<144> cal 1 GetMessageA
<145> cmp ах, 0
<146> je end_cycl_msg
<147> ;трансляция ввода с клавиатуры
<148> ;готовим вызов BOOL Trans1ateMessage( CONST MSG *lpMsg )
<149> push offset message
<150> call TranslateMessage
<151> ;отправим сообщение оконной процедуре
<152> ;готовим вызов LONG D1spatchMessage( CONST MSG *lpmsg )
<153> push offset message
<154> call DispatchMessageA
<155> jmp cycl_msg
<156> end_cycl_msg:
<157>
<158> ;выход из приложения
<159> ;готовим вызов VOID ExitProcess( UINT uExitCode )
<160> push NULL
<161> call ExitProcess
<162> start endp
<163> ; - - - - - - - - - - - - --WindowProc-- - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - -
<164> WindowProc proc
<165> argP0nwnd:DWORD, PPmes:DWORD, @@wparam:DWORD, @@lparam:DWORD
<166> uses ebx, edi, es1 ;эти регистры обязательно должны
сохраняться
<167> local @@hdc:DWORD
<168> cmp @@mes, WM_DESTROY
<169> je wmdestroy
<170> cmp @@mes, WM_CREATE
<171> je wmcreate
<172> cmp @@mes, WM_PAINT
<173> je wmpaint
<174> jmp default
<175> wmcreate:
<176> ;обозначим создание окна звуковым эффектом
<177> ;готовим вызов функции BOOL PlaySound(LPCSTR pszSound, HMODULE hmod,
DWORD
;fdwSound )
<178> push SND_SYNC+SND_FILENAME
<179> push NULL
<180> push offset playFileCreate
<181> call PlaySoundA
<182> mov eax, О;возвращаемое значение - 0
<183> jmp exit_wndproc
<184> wmpaint:
<185> push SND_SYNC+SND_FILENAME
<186> push NULL
<187> push offset playFIilePaint
<188> call P1aySoundA
<189>;получим контекст устройства HDC BeginPaint(HWND
nwnd,LPPAINTSTRUCT;LPpAINT)
<190> push offset ps
<191> push @@hwnd
<192> call BeginPaint
<193> mov @@hdc,eax
<194> ;выведем строку текста в окно BOOL TextOut( HDC hdc. int nXStart, int
:nYStart.
<195> ; LPCTSTR lpString, int cbString )
<196> push MesWindowLen
<197> push offset MesWindow
<198> push 100
<199> push 10
<200> push @@hdc
<201> call TextOutA
<202> :ocвoбoдитькoнтeкcтBOOLEndPaint( HWNDhWnd, CONSTPAINTSTRUCT*lpPai
<203> push offset ps
<204> push @@hdc
<205> call EndPaint
<206> mov еах,0;возвращаемое значение-0
<207> jmp exit_wndproc
<208> wmdestroy:
<209> push SND_SYNC+SND_FILENAME
<210> push NULL
<211> push offset playFileDestroy
<212> call PlaySoundA
<213> ;послать сообщение WМ_QUIТ
<214> ;готовим вызов VOID PostQuitMessage( int nExitCode )
<215> push 0
<216> call PostQuitMessage
<217> mov eax, О;возвращаемое значение - 0
<218> jmp exit_wndproc
<219> default:
<220> ; обработка по умолчанию
<221>;готовим вызов LRESULTDefWindowProc( HWND hWnd, UINTMsg,
<222> ; WPARAMwParam,LPARAMlParam)
<223> push @@lparam
<224> push @@wparam
<225> push @@mes
<226> push @@nwnd
<227> call DefWindowProcA
<228> jmp exit_wndproc
<229> ;... ... ...
<230> exit_wndproc:
<231> ret
<232> WindowProc endp
<233> end start
3.Иерархия окон
Изучив по дисциплине «Системное программное обеспечение» написание
окон Windows на языке Assembler и рассматривая графическую оконную систему
нельзя обойтись без подробного рассмотрения того, какие окна можно
отображать на экране.
Тип окна задается 32-битовым без знаковым целым числом, которое
указывается третьим параметром вызова функции Create Window.
Существует всего лишь три основных типа окон Window.
1 тип. Перекрывающиеся окна. Флаг WS_OVERLAPPED.
2 тип. Вспомогательные окна. Флаг WS_POPUP.
3 тип. Дочерние окна. . Флаг WS_CHILD.
Для написания курсового проекта, который имеет тему «Программа
демонстрирующая иерархию окон Windows» были использованы именно эти типы
окон.
Нужно о них помнить следующее что:
. Перекрывающееся окно никогда не имеет родителя
. Дочернее окно всегда имеет родителя.
. Вспомогательное окно может иметь и не иметь родителя; если оно
имеет родителя, то все равно это не дочернее
| | скачать работу |
Программа демонстрирующая иерархию окон Windows |