Реферат: Программа демонстрирующая иерархию окон Windows
<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