Программа демонстрирующая иерархию окон Windows
Рефераты >> Программирование и компьютеры >> Программа демонстрирующая иерархию окон Windows

<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


Страница: