Программа демонстрирующая иерархию окон WindowsРефераты >> Программирование и компьютеры >> Программа демонстрирующая иерархию окон Windows
<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().