Міністерство освіти РФ p>
ІНСТИТУТ ПЕРЕПІДГОТОВКИ КАДРІВ p>
Уральського державного технічного університету p>
Кафедра мікропроцесорної техніки p>
Оцінка проекту p>
Члени комісії p>
Програма демонструє ієрархію вікон Windows p>
Курсова робота p>
керівник: Кулюкін В.П. p>
слухач гр. СП-923: p>
2001р. p>
Зміст: p>
Введення p>
1. Віконні програми Windows.
2. Каркасне Windows-додаток на асемблері
3. Ієрархія вікон
4. «Програма демонструє ієрархію вікон Windows»
5.Бібліографіческій список p>
Введення p>
У переважній більшості книг про програмування для Windowsвиклад, як правило, ведеться на базі мови C/C + +, рідше - на базі Pascal.
А що ж асемблер - осторонь? Звичайно, ні! Ми не раз звертали вашеувагу на правильне розуміння місця асемблера в архітектурі комп'ютера.
Будь-яка програма на мові самого високого рівня у своєму внутрішньому виглядіявляє собою послідовність машинних кодів. А раз так, то завждизалишається теоретична можливість написати ту ж програму, але вже намовою асемблера: Нерозуміння або недооцінка такої можливості призводить дотому, що досить часто доводиться чути фразу, подібну до наступного:
«Ах, знову цей асемблер, але ж це щось несерйозне!» Також важкопогодитися з тезою, що частіше за все слід слідом за цією фразою.
Суть його зводиться до утвердження того, що потужність сучасних комп'ютерівдозволяє не розглядати проблему ефективності функціонуванняпрограми як першочергове. Набагато легше вирішити її за рахунокзбільшення обсягу пам'яті, швидкодії центрального процесора і якостікомп'ютерної периферії. Чим обгрунтувати необхідність розробки Windows -додатків на мові асемблера? Наведемо такі аргументи:
> мовою асемблера дозволяє програмісту повністю контролювати створюваний ним програмний код і оптимізувати його на свій розсуд;
> компілятори мов високого рівня поміщають в завантажувальний модуль програми надлишкову інформацію. Еквівалентні виконувані модулі, початковий текст яких написаний на мові асемблера, мають у декілька разів менший розмір;
> при програмуванні на асемблері зберігається повний доступ до апаратних ресурсів комп'ютера;
> додаток, написаний на мові асемблера, як правило, швидше завантажується в оперативну пам'ять комп'ютера;
> додаток, написаний на мові асемблера, володіє, як правило, більш високою швидкістю роботи і реактивністю відповіді на дії користувача. p>
Зрозуміло, ці аргументи не слід сприймати, як деяку рекламну кампанію на підтримку мови асемблера. Але не можна забувати і про те, що існує нескінченна безліч прикладних задач, що чекають своєї черги на комп'ютерну реалізацію. Далеко не всі з цих завдань вимагають застосування великовагових засобів розробки, результатом роботи яких є настільки ж великовагові виконувані файли. Багато прикладні задачі можуть бути витончено виконані на мові асемблера, не втрачаючи привабливості. P>
1. Віконні програми Windows. P>
Windows підтримує два типи програм:
> віконне додаток - будується на базі спеціального набору функцій (API), що становлять графічний інтерфейс користувача (GUI, Graphic User p>
Interface). Віконне додаток являє собою програму, яка весь висновок на екран виробляє в графічному вигляді. Першим результатом роботи віконного програми є відображення на екрані спеціального об'єкта - вікна. Після того як вікно відображено на екрані, вся робота програми спрямована на те, щоб підтримувати її в актуальному стані;
Основний тип програм в Windows - віконні, тому з них ми і почнемознайомство з процесом розробки програм для цієї операційної системи.
Будь-яке віконне Windows-додаток має типову структуру, основу якоїскладає так зване каркасне додаток. Ця програма міститьмінімально необхідний програмний код для забезпечення функціонуванняповноцінного Windows-програми. Не випадково у всіх джерелах якперший Windows-програми рекомендується вивчати і досліджувати роботудеякого каркасного програми, тому що саме воно відображає основніособливості взаємодії програми з операційною системою Windows. Більшетого, написав і налагодити один раз каркасне додаток, ви будетевикористовувати його в необхідну термінологію і зможемо більше увагиприділити логіці роботи Windows-програми, а не деталей його реалізації.
Мінімальна додаток Windows складається з трьох частин:
> головної функції;
> циклу обробки повідомлень;
> віконної функції.
Виконання будь-якого віконного Windows-програми починається з головної функції.
Вона містить код, який здійснює настройку (ініціалізацію) програми всередовищі операційної системи Windows. Видимим для користувача результатомроботи головної функції є поява на екрані графічного об'єкта ввигляді вікна. Останнім дією коду головної функції є створення циклуобробки повідомлень. Після його створення додаток стає пасивним іпочинає взаємодіяти із зовнішнім світом за допомогою спеціальним чиномоформлених даних - повідомлень. Обробка що надходять з додатком повідомленьздійснюється спеціальною функцією, званої віконної. Віконна функціяунікальна тим, що може бути викликана тільки з операційної системи, а нез програми, яка її містить. Таким чином, Windows-додаток, якмінімум, має складатися з трьох перерахованих елементів.
Каркасне Windows-додаток на асемблері містить один сегмент даних
. data і один сегмент коду. code. Сегмент стека у вихідних текстах Windows -додатків безпосередньо описувати не потрібно. Windows виділяє для стьобаючиобсяг пам'яті, розмір якого задано програмістом у файлі з розширенням.def. Текст лістингу 2 достатньо великий. Тому для обговорення розіб'ємоerо коментарями на характерні фрагменти, кожен з яких потім пояснимонеобхідним ступенем деталізації. p>
2. Каркасне Windows-додаток на асемблері p>
; Приклад каркасного програми для Win32
.386 locals; дозволяє застосування локальних міток у програмі p>
. Model flat, STDCALL; модель пам'яті flat Я < br>; STDCALL - передача параметрів в стилі С (справа наліво),
; викликається процедура чистить за собою стек Ш include windowA.inc; що включається файл з описами базовихструктур p>
; і констант 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 p>
. data hwnd dd 0 hInst dd 0 hdc dd 0
; lpVersionInformation OSVERSIONINFO wcl WNDCLASSEX message MSG ps 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, LPCTSTRlpIconName) 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) p>
push offset wcl сап RegisterClassExA test ax, ах; перевірити на успіх реєстрації класу вікна jz end_cyc1_msg; невдача
; створюємо вікно:
; готуємо визовHWND CreateWindowExA (DWORDdwExStyle,
LPCTSTR1pClassName,
; LPCTSTR 1pW1ndowName, DWORD dwStyle, int x, int у, int nWidth, p>
|; int nHeight,
; HWND hWndParent, HMENU hMenu, HANDLE hInstance, LPVOID p>
; lpParam) push 0; lpParam push hInst; hInstance push NULL; menu push NULL; parent hwnd push CW_USEDEFAULT; висота вікна push CW_USEDEFAULT; ширина вікна push CW_USEDEFAULT; координата біля лівого верхнього кута p>
; вікна push CW_USEDEFAULT; координата х лівого верхнього кута push WS_OVERLAPPEDWINDOW; стиль вікна push offset szTitleName; рядок заголовка вікна push offset szClassName; ім'я класу вікна push NULL саll CreateWindowExA mov hwnd, eax;-дескриптор вікна p>
; показати вікно: p>
; готуємо виклик 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: p>
; вихід з програми
; готуємо виклик 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 (HWNDnwnd, 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 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 p>
3.Іерархія вікон p>
Вивчивши з дисципліни «Системне програмне забезпечення» написаннявікон Windows на мові Assembler і розглядаючи графічну віконну системуне можна обійтися без докладного розгляду того, які вікна можнавідображати на екрані.
Тип вікна задається 32-бітовим без знаковим цілим числом, щовказується третім параметром виклику функції Create Window. p>
Існує всього лише три основні типи вікон Window.
1 тип. Перекриваються вікна. Прапор WS_OVERLAPPED.
2 тип. Допоміжні вікна. Прапор WS_POPUP.
3 тип. Дочірні вікна. . Прапор WS_CHILD. P>
Для написання курсового проекту, який має тему «Програмадемонструє ієрархію вікон Windows »були використані саме ці типивікон. p>
Потрібно про них пам'ятати наступне що: p>
. Перекриваються вікно ніколи не має батьків p>
. Дочірнє вікно завжди має батька. P>
. Допоміжне вікно може мати і не мати батька, якщо воно має батька, то все одно це не дочірнє, а допоміжне вікно. P>
З усіх концепцій системи управління вікнами найбільш фундаментальноїє ставлення предок/нащадок/сусід. Як ми бачили при описіструктури даних WND, кожне вікно містить логічний номер вікна свогопредка, логічний номер свого першого дочірнього вікна і логічний номернаступного сусіднього вікна. Сусідніми є вікна, які мають однаковубатьківське вікно. Насправді значення HWND є простоближніми покажчиками в локальній "купі" модуля USER, тому ви можетерозглядати їх як покажчики зв'язкового списку, які дозволяють обходитишляху в ієрархії вікон. Ієрархія вікон, створювана модулем USER, показана нарис.1.
Ієрархія вікон обходиться в усіх трьох напрямках - від пращура до нащадка, віднащадка до предка і від сусіда до сусіда. Приклади обходу ієрархії включаютьнаступне:
• При знищенні вікна модуль USER повинен знищити всіх його нащадків, атакож їх нащадків. USER обходить всю ієрархію, використовуючи поля hWndChild іhWndNext-Нагадаємо, логічні номера вікон є просто ближнімипокажчиками в локальній "купі" модуля USER.
• Коли відбувається передача фокусу вводу при натисканні клавіші Tab міжелементами управління у вікні діалогу (що є нащадками вікнадіалогу), покажчики на сусіднє вікна (або поле hWndNext) з'єднують один зіншому елементи управління. Крім того, упорядкування вікон у спискуhWndChild і hWndNext відображає Z-порядок вікон на екрані. Z-порядокявляє собою відносну позицію вікон у третьому вимірі (унапрямку від екрану до вас). Якщо ви клацанням кнопки миші вибираєтерізні основні вікна;щоб помістити їх у вершину Z-порядку, їх відносні позиції в спискуhWndNext зсуваються. p>
Рис .. 1 Ієрархія вікон, створена модулем USER. p>
• Коли з допомогою клацання кнопки миші ви вибираєте діалогове керуючевікно, це призводить до того, що менеджер діалогів просмарівает ланцюжокпокажчиків предка, щоб подивитися, чи необхідно зробити активним вікнопрограми верхнього рівня (основне).
У корені дерева вікон знаходиться 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, хоча на самомусправі вони різні. У Presentation 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-вікна (HWndDesktop). p>
3. «Програма демонструє ієрархію вікон Windows» p>
p386; ця директива дозволяє транслятору обробляти команди процесора i
386jumps; транслятор автоматично перетворить команду умовної передачіуправління
; в комбінацію умовної і безумовної команди, якщо умовна чинностіобмеженості; області своєї дії не забезпечує передачу управлінняза потрібною адресоюmodel flat, STDCALL; вибирає модель пам'яті для 32-розрядногопрограмування і; правила передачі параметрів функції STDCALL, далідіючі за замовчуванням p>
UNICODE = 0 p>
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: PROCextrn DefWindowProcA: PROCextrn DispatchMessageA: PROCextrn EndPaint: PROCextrn ExitProcess: PROCextrn GetMessageA: PROCextrn GetModuleHandleA: PROCextrn GetStockObject: PROCextrn InvalidateRect: PROCextrn LoadCursorA: PROCextrn LoadIconA: PROCextrn MessageBeep: PROCextrn MessageBoxA: PROCextrn PostQuitMessage: PROCextrn RegisterClassA: PROCextrn ShowWindow: PROCextrn SetWindowPos: PROCextrn TextOutA: PROCextrn TranslateMessage: PROCextrn UpdateWindow: PROCextrn FindFirstFileA: PROC
. data; зумовлене ім'я, що означає початок сегменту данихnewhwnd dd 0lppaint PAINTSTRUCT msg MSGSTRUCT wc WNDCLASS hInst dd 0szTitleName db 'Це вікно УГТУ', 0szTitleName1 db 'Це вікно групи СП-923', 0; 'Каркасне додаток Win32на асемблері '.0szClassName db 'ASMCLASS32', 0; 'Додаток Win32'
Buffer db 'Привет из Нягані!', 0new1hwnd dd 0
MSG_L EQU 14
. codestart: push L 0 call GetModuleHandleA; get hmod (in eax) mov [hInst], eax; hInstance is same as HMODULE p>
; in the Win32 worldreg_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] p>
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 UpdateWindowmsg_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_loopend_loop: push [msg.msWPARAM] call ExitProcess p>
; we never get to here
; віконна процедура
;------------------------------------------------- --------------------------< br>-
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' p>
; 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 p>
; push ecx push offset Buffer push L 5 push L 5 push [hDC] call TextOutA push offset lppaint push [hwnd] call EndPaint p>
mov eax, 0 jmp finishfinish: ret
WndProc endp
;------------------------------------------------- --------------------------< br>--public WndProcend start p>
Бібліографічний список p>
1. Використання Turbo Assembler при розробці програм/Укладач А.А.
Чекатков. Київ: Диалектика, 1995.
2. Рихтер Д. Windows для професіоналів (програмування в Win32 APIдля Windows
NT 3.5 і Windows 95) пер. З англ. М.: Видавничий відділ «Російський
Редакція »ТОО« Channel Trading Ltd », 1995.
3. Зубков С.В. Assembler. Для DOS, Windows і Unix. М.: ДМК. 1999.
-----------------------< br> p>