Программа, демонструючи ієрархію вікон Windows
Владелец вікна — це немовбито вікно, що його одержує повідомлення для вікна, яким вона володіє. Наприклад, як ви створюєте вікно меню WS_POPUP з допомогою функції TrackPopupMenu (), ви ставите власника вікна. Власник вікна отримує повідомлення WM_COMMAND, що породжується під час виборів пункту меню. Важливо, що загалом разі батьківське вікно і власник вікна зовсім різні. Ставлення предок/потомок… Читати ще >
Программа, демонструючи ієрархію вікон Windows (реферат, курсова, диплом, контрольна)
Министерство освіти РФ ИНСТИТУТ ПЕРЕПІДГОТОВКИ КАДРОВ.
Уральского державного технічного университета.
Кафедра мікропроцесорної техники Курсовая работа.
Программа демонструючи ієрархію вікон Windows.
руководитель: Кулюкин В.П..
слушатель гр. СП-923:.
2001 г..
Содержание Введение.
1. Вікон ные докладання Windows.
2. Каркасне Windows-приложение на ассемблере.
3. Ієрархія окон.
4. «Програма демонструючи ієрархію вікон Windows».
5.Библиографический список.
В переважну більшість книжок про програмуванні для Windows виклад, зазвичай, ведеться з урахуванням мови C/C++, рідше — з урахуванням Pascal. Хіба ж ас семблер — осторонь? Звісно, немає! Ми вже неодноразово звертали вашу увагу на пра вильное розуміння місця ассемблера в архітектурі комп’ютера. Будь-яка програм мало мовою найвищого ґатунку у своїй внутрішньому вигляді є послідовність машинних кодів. Отже, то завше залишається теоретична можливість написати таку ж програму, але вже мові ассемблера: Непонима ние чи недооцінка такої можливості призводить до того, що досить найчастіше доводиться чути фразу, таку наступній: «О, знову цей асемблер, але але це щось несерйозне!» Також важко можу погодитися з тезою, який найчастіше слід за цим фразою. Суть його зводиться до утвердження те, що потужність сучасних комп’ютерів дозволяє не розглядати проблему еф фективности функціонування програми як першочергову. Набагато легше розв’язати цю проблему рахунок збільшення обсягу пам’яті, швидкодії центрально го процесора і забезпечення якості комп’ютерної периферії. Чим обгрунтувати необхідність розробки Windows-приложений мовою ассем блера? Наведемо такі аргументы:
мові ассемблера дозволяє програмісту взяти создава емый їм програмний код і оптимізувати його за своєму усмотрению;
компиляторы мов високого рівня вміщують у завантажувальний модуль про грами надлишкову інформацію. Еквівалентні виконувані модулі, ів ходный текст які написано мовою ассемблера, мають у своєму кілька разів менший размер;
при програмуванні на ассемблері зберігається повний доступом до апарат ным ресурсів компьютера;
приложение, написане мовою ассемблера, зазвичай, швидше загружа ется в оперативну пам’ять компьютера;
приложение, написане мовою ассемблера, має, зазвичай, вищої швидкістю праці та реактивністю відповіді дії користувача. Зрозуміло, ці аргументи годі було сприймати, як деяку рекламну кампанію на підтримку мови ассемблера. Не доводиться це забувати про те, що суще ствует безліч прикладних завдань, які чекають своєї черги з ким пьютерную реалізацію. Не всі з з завдань вимагають застосування тяже ловесных коштів розробки, результатом чиїх робіт є так само великовагові виконувані файли. Багато прикладні завдання може бути изящ але виконані мовою ассемблера, не втрачаючи привлекательности.
1. Вікон ные докладання Windows..
Windows підтримує два типу приложений:
оконное додаток — будується з урахуванням спеціального набору функцій (АПІ), складових графічний інтерфейс користувача (GUI, Graphic User Inter face). Віконне додаток є програму, яка весь ви вод, на екран виробляє в графічному вигляді. Першим результатом роботи віконного докладання є відображення на екрані спеціального объек та — вікна. Коли вікно відображене на екрані, всю роботу докладання спрямовано те що підтримання його в актуальному состоянии;
Основной тип додатків у Windows — вікон ные, тому з нього ми бачимо почнемо ознайомлення з процесом розробки програм з цією ОС.
Любое віконне Windows-приложение має типову структуру, в основі якої становить зване каркасне додаток. Це додаток містить ми нимально необхідний програмний код задля забезпечення функціонування повноцінного Windows-приложения. Невипадково переважають у всіх джерелах як першого Windows-приложения рекомендується вивчати і досліджувати роботу не якого каркасного докладання, оскільки саме він відбиває основні особливий ности взаємодії програми з операційній системою Windows. Понад те, написавши і відлагодивши одного разу каркасне додаток, ви використовувати його на необхідну термінологію й зможемо більше уваги приділити логіці роботи Windows-приложения, а чи не деталей його реалізації.
Минимальное додаток Windows складається з трьох частей:
головною функции;
циклу обробки сообщений;
віконної функции.
Выполнение будь-якого віконного Windows-приложения починається з головної функ ции. Вона містить код, здійснює надстройку (ініціалізацію) приложе ния серед ОС Windows. Видимим для користувача резуль татом роботи головною функції є на екрані графічного об'єкта як вікна. Останнім дією коду головною функції є зі будинок циклу обробки повідомлень. Після його створення додаток стає пасивним й починає взаємодіяти з зовнішнім світом у вигляді спеці альным чином оформлених даних — повідомлень. Обробка вступників додатку повідомлень здійснюється спеціальної функцією, званої віконною. Віконна функція унікальна тим, може бути викликана тільки з ОС, а чи не з докладання, яке її містить. Отже, Windows-приложение, принаймні, має складатися з трьох перечис ленних елементів.
Каркасное Windows-приложение на ассемблері містить один сегмент даних .data і тільки сегмент коду. code. Сегмент стека у вихідних текстах Windows-приложений безпосередньо описувати непотрібно. Windows виділяє для стега обсяг пам’яті, розмір якого заданий програмістом в файлі з розширенням. def. Текст лістингу 2 досить великий. Тож обговорення розіб'ємо erо коментарями на характерні фрагменти, кожен із яких потім пояснимо необхідної ступенем деталізації.
2. Каркасне Windows-приложение на ассемблере.
;Приклад каркасного докладання для Win32.
.386.
locals ;дозволяє застосування локальних міток у програмі.
.model flat, STDCALL ;модель пам’яті flat Я.
;STDCALL — передача параметрів у стилі З (справа-наліво),.
; викликане процедура чистить у себе стік Ш.
include windowA. inc ;включаемый файл з описами базові структури.
;і констант Win32 т.
;Оголошення зовнішніми використовуваних у цій програмі функцій Win32 (ASCII):
extrn GetModuleHandleA: PROC.
extrn GetVersionExA: PROC В.
extrn GetCommandLineA: PROC.
extrn GetEnvironmentStringsA: PROC.
extrn GetEnvironmentStringsA: PROC.
extrn GetStartupInfoA: PROC.
extrn LoadIconA: PROC.
extrn LoadCursorA: PROC.
extrn GetStockObject: PROC.
extrn RegisterClassExA: PROC.
extrn CreateWindowExA: PROC.
extrn ShowWindow: PROC.
extrn UpdateWindow: PROC.
extrn GetMessageA: PROC.
extrn TranslateMessage: PROC.
extrn DispatchMessageA: PROC.
extrn ExitProcess: PROC.
extrn PostQuitMessage: PROC.
extrn DefWindowProcA: PROC.
extrn PlaySoundA: PROC.
extrn ReleaseDC: PROC.
extrn TextOutA: PROC.
extrn GetDC: PROC.
extrn BeginPaint: PROC.
extrn EndPaint: PROC.
;оголошення віконній функції об'єктом, видимим поза даного кода.
public WindowProc.
.data.
hwnd dd 0.
hInst dd 0.
hdc dd 0.
;lpVersionInformation OSVERSIONINFO.
wcl WNDCLASSEX.
message MSG.
p.s PAINTSTRUCT.
szClassName db «Додаток Win32 », 0.
szTitleName db «Каркасне додаток Win32 на ассемблері «.0.
MesWindow db «Це процес розробки приложения.
на ассемблері? «.
MesWindowLen= $-MesWindow.
playFileCreate db «create.wav », 0.
playFilePaint db «paint.wav », 0.
playFileDestroy db «destroy.wav », 0.
. code.
start proc near.
;точка входу в программу:
;початок стартового кода.
;виклики розташованих нижче функцій можна за необхідності раскомментировать,.
:але вони є обов’язковими у цій программе.
;виклик BOOL GetVersionEx (LPOSVERSIONINFO lpVersionInformation).
; push offset lpVersionInformation.
; call GetVersionExA.
;далі можна вставити код для аналізу інформації версію Windows.
;виклик LPTSTR GetCommandLine (VOID) — отримати покажчик на командну строку.
; call GetCommandLineA: врегистре еах адрес.
;виклик LPVOID GetEnvironmentStrings (VOID) — отримати указатель.
;на блок зі змінними окружения.
; call GetEnvironmentStringsA ;врегистре еах адрес.
;виклик VOIDGetStartupInfo (LPSTARTUPINFO lpStartupInfo) ;указатель.
;на структуру STARTUPINFO.
; push offset lpStartupInfo.
; call GetStartupInfoA.
;виклик HMODULE GetModuleHandleA (LPCTSTR lpModuleName).
push NULL ;0->GetModuleHandle.
call GetModuleHandleA ;отримати значення базового адреса,.
mov hInst, eax ;no якому завантажений модуль.
;далі hInst використовуватиметься як дескриптора даного приложения.
;кінець стартового кода.
WinMain:
;определить клас вікна ATOM RegisterClassEx (CONST WNDCLASSEX *lpWndClassEx),.
; де *lpWndClassEx — адресу структури WndClassEx.
;спершу инициализируем поля структури WndClassEx.
mov wcl. cbSize, typeWNDCLASSEX -.розмір структуры.
:в wcl.cbCIZE.
mov wcl. style, CS_HREDRAW+CS_VREDRAW.
mov wcl. pfnWndProg, offsetWindowProg ;адресу віконною процедуры.
mov wcl. cbCisExtra, 0.
mov wcl. cbWndExtra, 0.
mov eax, hInst.
mov ;дискриптор докладання на полі hInstance структури wcl.
mov wcl. hInstance, eax.
;готуємо виклик HICON LoadIcon (HINSTANCE hInstance, LPCTSTR lpIconName).
push IDI_APPLICATION ,-стандартний значок.
push 0 ;NULL.
саП LoadIconA.
mov wcl. hIcon, eax ,-дескриптор значка на полі hIcon I.
;структуры wcl.
;готуємо виклик HCURSOR LoadCursorA (HINSTANCE hInstance, LPCTSTR M ;lpCursorName).
push IDC_ARROW ,-стандартний курсор — стрілка.
push 0.
саll LoadCursorA.
mov wcl. hCursor, eax ;дескриптор курсору на полі hCursor.
;структуры wc1.
;визначимо колір фону вікна — білий.
;готуємо виклик HGDIOBJ GetStockObject (int fnObject).
push WHITE_BRUSH.
саП GetStockObject.
mov wcl. hbrBackground, eax.
mov dword ptrwcl. lpszMenuName, 0 ;без головного меню.
mov dwordptrwcl. lpszClassName, offsetszC1assName; имя.
;класса вікна.
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 ;координата x лівого верхнього угла.
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.
:ocвoбoдитькoнтeкcтBOOLEndPaint (HWNDhWnd, CONSTPAINTSTRUCT*lpPai push offset p.s.
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» було використано саме ця типи окон.
Потрібно про неї пам’ятати таке что:
Перекрывающееся вікно будь-коли має родителя Дочернее вікно має родителя.
Вспомогательное вікно може мати і мати батька; якщо воно має батька, однак це дочірнє, а допоміжне окно.
Из всіх концепцій системи управління вікнами найбільш фундаментальної є ставлення предок/ нащадок/ сусід. Як бачили в описах структури даних WND, кожне вікно містить логічний номер вікна свого предка, логічний номер свого першого дочірнього вікна і логічний номер наступного сусіднього вікна. Сусідніми є вікна, мають однакове батьківське вікно. Насправді значення HWND є просто ближніми покажчиками в локальної «багатьох «модуля USER, тому ви можете розглядати їх як покажчики зв’язкового списку, що дозволяють обходити шляху в ієрархії вікон. Ієрархія вікон, створювана модулем USER, показано на рис. 1.
Иерархия вікон обходиться переважають у всіх трьох напрямах — від предка до нащадку, від нащадка до предку і зажадав від сусіда до сусіди. Приклади обходу ієрархії включають следующее:
• При знищенні вікна модуль USER повинен знищити усіх її нащадків, і навіть їх нащадків. USER обходить всю ієрархію, використовуючи поля hWndChild і hWndNextНагадаємо, логічні номери вікон є просто ближніми покажчиками в локальної «багатьох «модуля USER.
• Коли відбувається передача фокусу введення при натисканні клавіші Tab між елементами управління у вікні діалогу (що є нащадками вікна діалогу), покажчики на сусіднє вікна (чи полі hWndNext) з'єднують друг з одним елементи управління. З іншого боку, впорядкування вікон у списку hWndChild і hWndNext відбиває Z-порядок вікон на екрані. Z-порядок є відносну позицію вікон у третій вимірі (у бік від екрана після того). Якщо ви хоч клацанням кнопки миші вибираєте різні основні окна;
чтобы помістити в вершину Z-порядка, їх відносні позиції з списку hWndNext зсуваються.
.
Рис. 1 Ієрархія вікон, створена модулем USER..
• Коли з допомогою щиглика кнопки миші ви вибираєте діалогове котра управляє вікно, усе веде до того що, що менеджер діалогів просмаривает ланцюжок покажчиків предка, щоб подивитися, чи потрібно зробити активним вікно докладання верхнього рівня (основное).
В корені дерева вікон перебуває desktop-окно. Це вікно покриває весь екран і завжди знаходиться на вершині Z-порядка. Це означає, що його завжди знаходиться позаду від інших вікон. Desktop-окно є першою створеним вікном, і це єдиний вікно в системі, яка має вікна батька чи власника. (Окна-владельцы описані далі.) Забарвлення вікна фону відпо-відає «шпалери «Windows.
Desktop-окно нічим особливим не виділяється себто установки спеціальних бітов чи т.п. Воно створюється із бітами стилю (обговорюються нижче) WS_POPUP і WS_CLIPCHILDREN. Немає ніякого недокументированного біта стилю WS_DESKTOP. Натомість логічний номер desktop-окна зберігається у глобальної перемінної модуля USER безпосередньо з ім'ям HWndDesktop. Коли системи управління вікнами треба знати, чи має працювати з desktop-окном, він порівнює HWND, про який мова, з HWndDesktop. Можете отримати значення перемінної HWndDesktop, використовуючи документовану API-функцию GetDesktopWindow ().
ВЛАДЕНИЕ ВІКНАМИ У Windows.
Наряду зі ставленням предок/потомок. Windows також підтримує зовсім інше поняття володіння. Кожне вікно має полі своїй структурі даних, яке містить логічний номер вікна, яке володіє цим вікном. На відміну від відносини предок/потомок, ставлення володіння вікна є однонаправленим. Вікна відомий логічний номер його окна-владельца, але це не знає логічних номерів вікон, якими воно владеет.
Владелец вікна — це немовбито вікно, що його одержує повідомлення для вікна, яким вона володіє. Наприклад, як ви створюєте вікно меню WS_POPUP з допомогою функції TrackPopupMenu (), ви ставите власника вікна. Власник вікна отримує повідомлення WM_COMMAND, що породжується під час виборів пункту меню. Важливо, що загалом разі батьківське вікно і власник вікна зовсім різні. Ставлення предок/потомок встановлює, де у ієрархії вікон перебуває вікно, тоді як власник вікна визначає, які вікна отримують повідомлення, призначені для вікон, якими вони владеют.
Особенность вищенаведеного правила стосується й вікнам WS_CHILD. Для вікон WS_CHILD власник HWND у структурі WND дочірнього вікна нульовий, і тоді замість нього уведомительные повідомлення посилаються батьківського вікна. Наприклад, кнопка з вікна діалогу нащадок головного діалогового вікна. Коли ж ви натискаєте кнопку, вікно кнопки повідомляє про катастрофу свого предка, тобто. головне діалогове вікно. Можете вважати, що з ws_child-okhb логічний номер hWndOwner — той самий, як і hWndParenfc, хоча насправді вони різні. У Presentati.
on Manager не потрібно в бітах WS_CHILD чи РWS_POPUP. Заповнюється як полі hWndPa-rent, і полі hWndOwner. Це цілком визначає, хто отримує уведомительные повідомлення нащадка, і навіть становище вікна в ієрархії. У Presentation Manager поля hWndParent і hWndOw-ner зазвичай містять один і той ж значення HWND.
Кроме посилки повідомлень власникові, вікно, яким володіють, також завжди розміщено попереду окна-владельца. Якщо вікно перетворено на піктограму, аналогічні явища відбуваються і з вікнами, якими вона володіє. Якщо окно-владелец знищується, тто вікна, якими вона володіє, також знищуються. Оскільки вікно не стежить за вікнами, якими вона володіє, потрібно переглядати списки покажчиків предок/сосед і порівнювати власника кожного вікна з HWND вікна, яке уничтожается.
Во цьому трохи дивно те, що Windows робить ставлення володіння дуже явним. Хоча у документації SDK коротко розглядається ставлення володіння, вам досить складно побачити, у яких місцях ставлення володіння відрізняється від відносини предок/потомок. У Presentation Manager OS/2 під час створення вікна ви ставите і батьківське вікно, і окно-владелец. У Windows ви ставите лише предка.
Если функції CreateWindow () передається лише HWND батька, як тоді вам описати вікно власника в Windows? Однією з параметрів функції CreateWindow () є бітова маска стилю. Якщо стиль вікна WS_CHILD, параметр hWndParent інтерпретується як батьківське вікно. Проте, коли ви ставите WS_OVERLAPPED чи WS_POPUP, параметр hWndParent на реальність використовують як власник HWND, що пізніше проясняється у певному псевдокоде. Батьківським вікном для вікон WS_OVERLAPPED чи WS_POPUP завжди є HWND desktop-окна (HWndDes.
ktop).
3. «Программа демонструючи ієрархію вікон Windows».
p386; ця директива дозволяє транслятору обробляти команди процесора і 386.
jumps;транслятор автоматично перетворює команду умовної передачі управления.
;в комбінацію умовної і безумовному команди, якщо умовна через обмеженість ;області свого дії не забезпечує передачу управління з потрібному адресу.
model flat, STDCALL;выбирает модель пам’яті для 32-разрядного програмування і ;правила передачі параметрів функції STDCALL, далі діючі по умолчанию.
UNICODE = 0.
include win32. inc;файл, у якому опис структур даних, і констант.
; some 32-bit constants and structures.
L equ; послідовності символів LARGE, що є ім'ям операції, яка проголошувала наступний з ним операнд 32-разрядным, присвоюється ім'я L.
Define the external functions we will be linking to.
;
extrn BeginPaint: PROC;описание імпортованих з Windows функций.
extrn CreateWindowExA: PROC.
extrn DefWindowProcA: PROC.
extrn DispatchMessageA: PROC.
extrn EndPaint: PROC.
extrn ExitProcess: PROC.
extrn GetMessageA: PROC.
extrn GetModuleHandleA: PROC.
extrn GetStockObject: PROC.
extrn InvalidateRect: PROC.
extrn LoadCursorA: PROC.
extrn LoadIconA: PROC.
extrn MessageBeep: PROC.
extrn MessageBoxA: PROC.
extrn PostQuitMessage: PROC.
extrn RegisterClassA: PROC.
extrn ShowWindow: PROC.
extrn SetWindowPos: PROC.
extrn TextOutA: PROC.
extrn TranslateMessage: PROC.
extrn UpdateWindow: PROC.
extrn FindFirstFileA: PROC.
.data;предопределенное ім'я, що означає початок сегмента данных.
newhwnd dd 0.
lppaint PAINTSTRUCT.
msg MSGSTRUCT.
wc WNDCLASS.
hInst dd 0.
szTitleName db «Це вікно УГТУ », 0.
szTitleName1 db «Це вікно групи СП-923 », 0; «Каркасне додаток Win32 на ассемблері «.0.
szClassName db «ASMCLASS32 », 0; «Додаток Win32'.
Buffer db «Привіт з Нягани! », 0.
new1hwnd dd 0.
MSG_L EQU 14.
.code.
start:
push L 0.
call GetModuleHandleA; get hmod (in eax).
mov [hInst], eax; hInstance is same as HMODULE.
; in the Win32 world.
reg_class:
;
; initialize the WndClass structure ;Иинициализация сруктуры WndClass.
;
mov [wc.clsStyle], CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS;тип ;класса.
mov [wc.clsLpfnWndProc], offset WndProc; адресу віконною процедуры.
mov [wc.clsCbClsExtra], 0.
mov [wc.clsCbWndExtra], 0.
mov eax, [hInst].
mov [wc.clsHInstance], eax ;дикриптор модуля.
push L IDI_APPLICATION;заданная за умовчанням пиктограмма.
push L 0.
call LoadIconA.
mov [wc.clsHIcon], eax.
push L IDC_ARROW.
push L 0.
call LoadCursorA.
mov [wc.clsHCursor], eax.
mov [wc.clsHbrBackground], COLOR_WINDOW + 1.
mov dword ptr [wc.clsLpszMenuName], 0.
mov dword ptr [wc.clsLpszClassName], offset szClassName.
push offset wc.
call RegisterClassA.
push L 0; lpParam.
push [hInst]; hInstance.
push L 0; menu.
push L 0; parent hwnd.
push L CW_USEDEFAULT; height.
push L CW_USEDEFAULT; width.
push L CW_USEDEFAULT; y.
push L CW_USEDEFAULT; x.
push L WS_OVERLAPPEDWINDOW; Style.
push offset szTitleName; Title string.
push offset szClassName; Class name;имя класса.
push L 0; extra style.
call CreateWindowExA.
mov [newhwnd], eax.
push L SW_SHOWNORMAL.
push [newhwnd].
call ShowWindow.
push [newhwnd].
call UpdateWindow.
push L 0; lpParam.
push [hInst]; hInstance.
push L 0; menu.
push L [newhwnd]; parent hwnd.
push L CW_USEDEFAULT; height.
push L CW_USEDEFAULT; width.
push L CW_USEDEFAULT; y.
push L CW_USEDEFAULT; x.
push L WS_OVERLAPPEDWINDOW; Style.
push offset szTitleName1; Title string.
push offset szClassName; Class name.
push L 0; extra style.
call CreateWindowExA.
mov [new1hwnd], eax.
push L SW_SHOWNORMAL.
push [new1hwnd].
call ShowWindow.
push [new1hwnd].
call UpdateWindow.
msg_loop:
push L 0.
push L 0.
push L 0.
push offset msg.
call GetMessageA.
cmp ax, 0.
je end_loop.
push offset msg.
call TranslateMessage.
push offset msg.
call DispatchMessageA.
jmp msg_loop.
end_loop:
push [msg.msWPARAM].
call ExitProcess.
; we never get to here.
;оконная процедура.
;——————————————————————————————————————;
WndProc proc uses ebx edi esi, hwnd: DWORD, wmsg: DWORD,.
wparam:DWORD, lparam: DWORD.
;
; WARNING: Win32 requires that EBX, EDI, and ESI be preserved! We comply.
; with this by listing those regs after the «uses «statement in the «proc «.
; line. This allows the Assembler to save them for us.
;
LOCAL hDC: DWORD.
cmp [wmsg], WM_DESTROY.
je wmdestroy.
cmp [wmsg], WM_SIZE.
je wmsize.
cmp [wmsg], WM_CREATE.
je wmcreate.
cmp [wmsg], WM_PAINT.
je wmpaint.
jmp defwndproc.
wmcreate:
mov eax, 0.
jmp finish.
defwndproc:
push [lparam].
push [wparam].
push [wmsg].
push [hwnd].
call DefWindowProcA.
jmp finish.
wmdestroy:
push L 0.
call PostQuitMessage.
mov eax, 0.
jmp finish.
wmsize:
mov eax, 0.
jmp finish.
wmpaint:
push offset lppaint.
push [hwnd].
call BeginPaint.
mov [hDC], eax.
push L 17.
; push ecx.
push offset Buffer.
push L 5.
push L 5.
push [hDC].
call TextOutA.
push offset lppaint.
push [hwnd].
call EndPaint.
mov eax, 0.
jmp finish.
finish:
ret.
WndProc endp.
;——————————————————————————————————————;
public WndProc.
end start.
Библиографический список.
1. Використання Turbo Assembler розробки програм / Упорядник А. А. Чекатков. Київ: Діалектика, 1995.
2. Ріхтер Д. Windows для професіоналів (програмування в Win32 АПІ для Windows.
NT 3.5 і Windows 95) перекл. З анг. М.: Видавничий відділ «Російський Редакція» ТОВ «Channel Trading Ltd», 1995.
3. Зубков С. В. Assembler. Для DOS, Windows і Unix. М.: ДМК. 1999.