Здавалка
Главная | Обратная связь

Краткие теоретические сведения

 

Сообщения лежат в основе Windows. С помощью них ОС и разные программы обмениваются управляющей информацией и совершают управляющие воздействия друг на друга. Структура исполняемого модуля состоит из части инициализации и оконной функции.

Три основных отличия Windows от DOS: многозадачность, Windows управляется событиями, Windows аппаратно независима.

Стиль класса Определяет основную структуру каждого окна этого класса
Функция класса Стандартная функция окна этого класса
Иконка Стандартный для этого класса значок на рабочем столе
Указатель мыши Указатель, используемый при нахождении мыши над данным окном
Фон Задает цвет фона по умолчанию
Меню Выделяет меню по умолчанию

Характеристики окна: атрибуты, сообщение, функциональность.

Стандартные классы Windows:

BUTTON Кнопки, переключатели и флажки
COMBOBOX Окна, где текст окон объединяется со списком
EDIT Одностраничные и многостраничные текстовые поля
ListBox Cписки с выбором
ScrollBar Полосы прокрутки
STATIC Окно для вывода текста (под иконкой)

У каждого окна есть свои атрибуты. Стиль – 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 Все права принадлежат авторам размещенных материалов.