Смекни!
smekni.com

Программа демонстрирующая иерархию окон Windows (стр. 3 из 3)

Во всем этом немного странно то, что 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>; последовательности символов 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,&bsol;

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.