Краткие теоретические сведения
Сообщения лежат в основе Windows. С помощью них ОС и разные программы обмениваются управляющей информацией и совершают управляющие воздействия друг на друга. Структура исполняемого модуля состоит из части инициализации и оконной функции. Три основных отличия Windows от DOS: многозадачность, Windows управляется событиями, Windows аппаратно независима.
Характеристики окна: атрибуты, сообщение, функциональность. Стандартные классы Windows:
У каждого окна есть свои атрибуты. Стиль – 32-разрядные флаги при создании окна. Сообщения для команд и копок меню: WM_COMMAND = 0111h - отправляется при вызове команды меню; - дочерний элемент отправляет родительскому окну сообщение при наступлении некоторых событий; wParam: младшее слово содержит идентификатор команды меню, lParam (манипулятор окна элемента): номер оповещающего сообщения. При вызове команд системного меню: WM_SYSCOMMAND = 0112h - посылается при выборе команд системного меню, wParam содержит выполняемую команду _sc (4 младших бита используются Windows). WM_CREATE = 01h - сообщение отправляется только что созданному окну – в обработке этого сообщения создаются кнопки, меню и другие интерфейсные элементы. WM_MOUSEMOVE = 0200h - посылается окну, когда мышь перемещается над ним, wParam – комбинации констант, обозначающие нажатие кнопок мыши, клавиш “Shift” и “Ctrl”, lParam: младшее слово содержит координату “х” клиентской системы координат, старшее слово – координату “y”. WM_PAINT- посылается окну, когда оно должно обновить свою клиентскую область. WM_SETFOCUS- отправляется окну после того, как оно получает фокус ввода.
Ниже приведен пример простейшего оконного приложения, которое выводит на экран основное окно на котором в последствии можно размещать различные интерфейсные дочерние элементы. .386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
IDM_BEGIN equ 1 IDM_END equ 2 IDM_PLAY equ 3
.data ClassName db "InterfaceElem",0 AppName db "Пример интерфейсных элементов",0 clButton db 'BUTTON',0 clEdit db 'EDIT',0 clStatic db 'STATIC',0 tYes db 'ДА',0 tNo db 'НЕТ',0 tRadio db 'Радиокнопка',0 tCheck db 'Кнопка с галочкой',0 tGame db 'Игра',0 tBegin db 'Начать',0 tEnd db 'Закончить',0 tStatus db 'Состояние',0 tPlay db 'Игра идет',0
.data? hInstance HINSTANCE ? CommandLine LPSTR ? hButY dd ? hButN dd ? hEdit dd ? hMenu dd ? hPopup1 dd ? hPopup2 dd ? hStat dd ? hRadio dd ? hCheck dd ? .code start: invoke GetModuleHandle, NULL mov hInstance,eax invoke GetCommandLine mov CommandLine,eax invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT invoke ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG LOCAL hwnd:HWND mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInstance pop wc.hInstance mov wc.hbrBackground,COLOR_WINDOW+1 mov wc.lpszMenuName,NULL mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\ WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\ CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\ hInst,NULL mov hwnd,eax invoke ShowWindow, hwnd,SW_SHOWNORMAL invoke UpdateWindow, hwnd cycle_msg: invoke GetMessage, ADDR msg,NULL,0,0 cmp eax,0 je exit invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg jmp cycle_msg exit: mov eax,msg.wParam ret WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM cmp uMsg,WM_CREATE jz wmcreate cmp uMsg,WM_COMMAND jz wmcommand cmp uMsg, cmp uMsg,WM_DESTROY je wmdestroy jmp default wmcreate: invoke CreateWindowEx,NULL,ADDR clButton,ADDR tYes,WS_CHILD+WS_VISIBLE,100,100,50,30,hWnd,NULL,hInstance,NULL mov hButY,eax invoke CreateWindowEx,NULL,ADDR clButton,ADDR tNo,WS_CHILD+WS_VISIBLE,200,100,50,30,hWnd,NULL,hInstance,NULL mov hButN,eax invoke CreateWindowEx,NULL,ADDR clButton,ADDR tRadio,WS_CHILD+WS_VISIBLE+BS_AUTORADIOBUTTON,300,250,50,30,hWnd,NULL,hInstance,NULL mov hRadio,eax invoke CreateWindowEx,NULL,ADDR clButton,ADDR tCheck,WS_CHILD+WS_VISIBLE+BS_AUTOCHECKBOX,300,200,50,30,hWnd,NULL,hInstance,NULL mov hCheck,eax invoke CreateWindowEx,NULL,ADDR clEdit,ADDR tCheck,WS_CHILD+WS_VISIBLE,300,50,100,100,hWnd,NULL,hInstance,NULL mov hEdit,eax invoke CreateWindowEx,NULL,ADDR clStatic,ADDR tCheck,WS_CHILD+WS_VISIBLE,300,150,50,30,hWnd,NULL,hInstance,NULL mov hStat,eax call CreateMenu mov hMenu,eax invoke CreatePopupMenu mov hPopup1,eax invoke CreatePopupMenu mov hPopup2,eax
invoke AppendMenuA,hMenu,MF_POPUP,hPopup1,offset tGame invoke AppendMenuA,hMenu,MF_POPUP,hPopup2,offset tStatus
invoke AppendMenuA,hPopup1,0,IDM_BEGIN,offset tBegin invoke AppendMenuA,hPopup1,0,IDM_END,offset tEnd invoke AppendMenuA,hPopup2,0,IDM_PLAY,offset tPlay
invoke SetMenu,hWnd,hMenu
jmp exit_wndproc wmcommand: mov eax,wParam mov ebx,lParam cmp
jmp exit_wndproc
wmdestroy: invoke PostQuitMessage,NULL jmp exit_wndproc default: invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret exit_wndproc: xor eax,eax ret WndProc endp end start
©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.
|