ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Програма, що демонструє ієрархію вікон Windows
         

     

    Інформатика, програмування

    Міністерство освіти РФ

    ІНСТИТУТ ПЕРЕПІДГОТОВКИ КАДРІВ

    Уральського державного технічного університету

    Кафедра мікропроцесорної техніки

    Курсова робота

    Програма демонструє ієрархію вікон Windows

    керівник: Кулюкін В.П.

    слухач гр.СП-923:

    2001р.

    Зміст

    Введення

    1. Віконні програми Windows.

    2. Каркасне Windows-додаток на асемблері

    3. Ієрархія вікон

    4. «Програма демонструє ієрархію вікон Windows»

    5.Бібліографіческій список

    Введення

    У переважній більшості книг про програмування для Windows виклад, як правило, ведеться на базі мови C/C + +, рідше - на базі Pascal. А що ж асемблер - осторонь? Звичайно, ні! Ми не раз звертали вашу увагу на правильне розуміння місця асемблера в архітектурі комп'ютера. Будь-яка програма на мові самого високого рівня у своєму внутрішньому вигляді являє собою послідовність машинних кодів. А раз так, то завжди залишається теоретична можливість написати ту ж програму, але вже на мові асемблера: Нерозуміння або недооцінка такої можливості призводить до того, що досить часто доводиться чути фразу, подібну до наступного: «Ах, знову цей асемблер, але адже це щось несерйозне! »Також важко погодитися з тезою, що частіше за все слід слідом за цією фразою. Суть його зводиться до утвердження того, що потужність сучасних комп'ютерів дозволяє не розглядати проблему ефективності функціонування програми як першочергове. Набагато легше вирішити її за рахунок збільшення обсягу пам'яті, швидкодії центрального процесора і якості комп'ютерної периферії. Чим обгрунтувати необхідність розробки Windows-додатків на мові асемблера? Наведемо наступні аргументи:

    мовою асемблера дозволяє програмісту повністю контролювати створюваний ним програмний код і оптимізувати його на свій розсуд;

    компілятори мов високого рівня поміщають в завантажувальний модуль програми надлишкову інформацію. Еквівалентні виконувані модулі, початковий текст яких написаний на мові асемблера, мають у декілька разів менший розмір;

    при програмуванні на асемблері зберігається повний доступ до апаратних ресурсів комп'ютера;

    додаток, написаний на мові асемблера, як правило, швидше завантажується в оперативну пам'ять комп'ютера;

    додаток, написаний на мові асемблера, володіє, як правило, більш високою швидкістю роботи і реактивністю відповіді на дії користувача. Зрозуміло, ці аргументи не слід сприймати, як деяку рекламну кампанію на підтримку мови асемблера. Але не можна забувати і про те, що існує нескінченна безліч прикладних задач, що чекають своєї черги на комп'ютерну реалізацію. Далеко не всі з цих завдань вимагають застосування великовагових засобів розробки, результатом роботи яких є настільки ж великовагові виконувані файли. Багато прикладні задачі можуть бути витончено виконані на мові асемблера, не втрачаючи привабливості.

    1. Віконні програми Windows.

    Windows підтримує два типи програм:

    віконне додаток - будується на базі спеціального набору функцій (API), що становлять графічний інтерфейс користувача (GUI, Graphic User Interface). Віконне додаток являє собою програму, яка весь висновок на екран виробляє в графічному вигляді. Першим результатом роботи віконного програми є відображення на екрані спеціального об'єкта -- вікна. Після того як вікно відображено на екрані, вся робота програми спрямована на те, щоб підтримувати її в актуальному стані;

    Основний тип програм в Windows - віконні, тому з них ми і почнемо знайомство з процесом розробки програм для цієї операційної системи.

    Будь-яке віконне Windows-додаток має типову структуру, основу якої складає так зване каркасне додаток. Ця програма містить мінімально необхідний програмний код для забезпечення повноцінного функціонування Windows-програми. Не випадково у всіх джерелах як перший Windows-програми рекомендується вивчати і досліджувати роботу певного каркасного програми, тому що саме воно відображає основні особливості взаємодії програми з операційною системою Windows. Більш того, написав і налагодити один раз каркасне додаток, ви будете використовувати його в необхідну термінологію і зможемо більше уваги приділити логіці роботи Windows-програми, а не деталей його реалізації.

    Мінімальна додаток Windows складається з трьох частин:

    головної функції;

    циклу обробки повідомлень;

    віконної функції.

    Виконання будь-якого віконного Windows-програми починається з головної функції. Вона містить код, який здійснює настройку (ініціалізацію) додатки в середовищі операційної системи Windows. Видимим для користувача результатом роботи головної функції є поява на екрані графічного об'єкта у вигляді вікна. Останнім дією коду головної функції є створення циклу обробки повідомлень. Після його створення додаток стає пасивним і починає взаємодіяти із зовнішнім світом за допомогою спеціальних чином оформлених даних - повідомлень. Обробка що надходять з додатком повідомлень здійснюється спеціальною функцією, званої віконної. Віконна функція унікальна тим, що може бути викликана тільки з операційної системи, а не з програми, яка її містить. Таким чином, Windows-додаток, як мінімум, має складатися з трьох перерахованих елементів.

    Каркасне Windows-додаток на асемблері містить один сегмент даних. data і один сегмент коду. code. Сегмент стека у вихідних текстах Windows-додатків безпосередньо описувати не потрібно. Windows виділяє для стьобаючи обсяг пам'яті, розмір якого задано програмістом у файлі з розширенням. def. Текст лістингу 2 достатньо великий. Тому для обговорення розіб'ємо erо коментарями на характерні фрагменти, кожен з яких потім пояснимо необхідним ступенем деталізації.

    2. Каркасне Windows-додаток на асемблері

    <1>; Приклад каркасного програми для Win32

    <2> .386

    <3> locals; дозволяє застосування локальних міток у програмі

    <4>. model flat, STDCALL; модель пам'яті flat Я

    <5>; STDCALL - передача параметрів в стилі С (справа наліво),

    <6>; викликається процедура чистить за собою стек Ш

    <7> include windowA.inc; що включається файл з описами базових структур

    ; і констант Win32 т

    <8>; Оголошення зовнішніми що використовуються в даній програмі функцій Win32 (ASCII):

    <9> extrn GetModuleHandleA: PROC

    <10> extrn GetVersionExA: PROC В

    <11> extrn GetCommandLineA: PROC

    <12> extrn GetEnvironmentStringsA: PROC

    <13> extrn GetEnvironmentStringsA: PROC

    <14> extrn GetStartupInfoA: PROC

    <15> extrn LoadIconA: PROC

    <16> extrn LoadCursorA: PROC

    <17> extrn GetStockObject: PROC

    <18> extrn RegisterClassExA: PROC

    <19> extrn CreateWindowExA: PROC

    <20> extrn ShowWindow: PROC

    <21> extrn UpdateWindow: PROC

    <22> extrn GetMessageA: PROC

    <23> extrn TranslateMessage: PROC

    <24> extrn DispatchMessageA: PROC

    <25> extrn ExitProcess: PROC

    <26> extrn PostQuitMessage: PROC

    <27> extrn DefWindowProcA: PROC

    <28> extrn PlaySoundA: PROC

    <29> extrn ReleaseDC: PROC

    <30> extrn TextOutA: PROC

    <31> extrn GetDC: PROC

    <32> extrn BeginPaint: PROC

    <33> extrn EndPaint: PROC

    <34>; оголошення віконної функції об'єктом, видимим за межами даного коду

    <35> public WindowProc

    <36>. data

    <37> hwnd dd 0

    <38> hInst dd 0

    <39> hdc dd 0

    <40>; lpVersionInformation OSVERSIONINFO

    <41> wcl WNDCLASSEX

    <42> message MSG

    <43> ps PAINTSTRUCT

    <44> szClassName db 'Додаток Win32', 0

    <45> szTitleName db 'Каркасне додаток Win32 на асемблері' .0

    <46> MesWindow db 'Це процес розробки програми

    на асемблері? '

    <47> MesWindowLen = $-MesWindow

    <48> playFileCreate db 'create.wav', 0

    <49> playFilePaint db 'paint.wav', 0

    <50> playFileDestroy db 'destroy.wav', 0

    <51>. code

    <52> start proc near

    <53>; точка входу в програму:

    <54>; початок стартового коду

    <55>; виклики розташованих нижче функцій можна при необхідності розкоментувати,

    <56>: але вони не є обов'язковими в даній програмі

    <57>; виклик BOOL GetVersionEx (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 »були використані саме ці типи вікон.

    Потрібно про них пам'ятати наступне що:

    перекриваються вікно ніколи не має батьків

    Дочірнє вікно завжди має батька.

    Допоміжне вікно може мати і не мати батька, якщо воно має батька, то все одно це не дочірнє, а допоміжне вікно.

    І З усіх концепцій системи управління вікнами найбільш фундаментальною є ставлення предок/нащадок/сусід. Як ми бачили при описі структури даних 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; ця директива дозволяє транслятору обробляти команди процесора i 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 API для Windows

    NT 3.5 і Windows 95) пер. З англ. М.: Видавничий відділ «Російський Редакція» ТОО «Channel Trading Ltd», 1995.

    3. Зубков С.В. Assembler. Для DOS, Windows і Unix. М.: ДМК. 1999.

         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status