Главная » Win32 API » Пример программы по работе с элементами управления

0

Рассмотрим приложение, иллюстрирующее ряд вышеперечислен­ных возможностей элементов управления. На форме разместим объек­ты следующих типов: List Box, Edit Box и две кнопки, одна из которых предназначена для перемещения текста из строки редактирования в список строк, а другая для перемещения выделенной строки из спи­ска в строку редактирования. Двойной щелчок по строке списка или нажатие клавиши «Enter» приводит к выводу окна с сообщением, текст которого берется из текущего элемента списка строк. Кроме того, соз­дадим на форме надпись, являющуюся статическим элементом управ­ления и предствляющую собой окно предопределенного класса «STATIC».

Текст программы приведен ниже.

.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 WinProc proto:DWORD,:DWORD,:DWORD,:DWORD ListBoxProc proto :DWORD,:DWORD,:DWORD,:DWORD ; идентификаторы кнопок bnl_id      equ   501 bn2_id      equ   502 ; константы .const

szListBox    db    "LISTBOX",0 szButton     db    "BUTTON",0 szEdit       db    "EDIT",0 szStatic     db    "STATIC",0

szBnl       db    "<",0 szBn2       db    ">",0

szTip       db    "Введите строку в текстовое поле и нажмите ‘<‘ для добавления в список.",ODh,OAh,ODh,OAh, "Выделите элемент списка и нажмите ‘>’ для чтения", "строки.",ODh,OAh,ODh,OAh,"Двойной щелчок левой", "кноп­ки мыши по элементу списка или нажатие Enter","вызывает окно с сообщением.",0 szClassName  db    "Classl",0 szWindowName db    "Windowl",0 .data

; неинициализированные переменные: hlnstance HINSTANCE ? ; идентификатор нашего процесса CommandLine LPSTR ? ; командная строка hEdit HWND ? ; дескриптор окна текстового поля hList HWND ? ; дескриптор окна списка lpLstBox DWORD ?

; указатель на предыдущую функцию ListBoxProc szBuffer db 128 dup(?)    ; текстовый буфер . code start:

invoke GetModuleHandle, NULL ; получение идентификатора процесса

mov hlnstance, eax

invoke GetCommandLine ; получение указателя командной строки

mov CommandLine, eax

invoke WinMain,hlnstance,NULL,CommandLine ; вызов основной функции

invoke ExitProcess,eax ; выход из программы (с кодом возврата в еах) WinMain proc hlnst:HINSTANCE, hPrevInst:HINSTANCE,

CmdLine:LPSTR ; локальные переменные:

LOCAL wc:WNDCLASSEX     ; класс окна

LOCAL msg:MSG                            ; структура сообщения

LOCAL hwnd:HWND                         ; дескриптор окна

Заполнение и регистрация класса окна WNDCLASSEX

mov wc.cbSize,SIZEOF WNDCLASSEX ; размер структуры 4*12 байтов

mov wc.style, CS_HREDRAW or CS_VREDRAW~ ; стиль окна, предусматривающий перерисовку ; при вертикальном и горизонтальном движении

mov wc.lpfnWndProc, OFFSET WndProc

функция-обработчик событий окна

mov wc.cbClsExtra,NULL

число дополнительных байтов

mov wc.cbWndExtra,NULL

число дополнительных байтов

push hlnst

pop wc.hlnstance

идентификатор нашего процесса

mov wc.hbrBackground,COLOR_BTNFACE+1

идентификатор кисти (или цвет фона+1)

mov wc.lpszMenuName,NULL

ресурс с основным меню

mov wc.lpszClassName,OFFSET szClassName

имя класса

invoke LoadIcon,NULL,IDI_APPLICATION

mov wc.hIcon,eax

идентификатор иконки

mov wc.hIconSm,NULL

идентификатор маленькой иконки (должен быть 0)

invoke LoadCursor,NULL,IDC_ARROW

mov wc.hCursor,eax

идентификатор курсора

invoke RegisterClassEx, addr wc

регистрация класса

Создание окна

Параметры функции CreateWindowEx:

1.      дополнительный стиль (0 по умолчанию)

2.      наш зарегистрированный класс

3.      заголовок окна

4.      стиль окна (стандартное изменяемое по размеру окно системными кнопками)

5.      х-координата (CW_USEDEFAULT по умолчанию)

6.      у-координата (по умолчанию)

7.      ширина окна

8.      высота окна

9.      идентификатор окна-предка

10.   идентификатор меню или окна-потомка

11.   идентификатор процесса, который будет получать сообщения от окна

12.   адрес структуры CREATESTRUCT (не используется) invoke CreateWindowEx, 0, ADDR szClassName,

ADDR szWindowName, WS_OVERLAPPEDWINDOW , CW_USEDEFAULT, CW_USEDEFAULT, 500, 400, 0, 0, hlnst, 0 mov hwnd,eax

Отображение окна

invoke ShowWindow,hwnd,SW_SHOWNORMAL ; показать окно

invoke UpdateWindow,hwnd ; и послать ему сообщение WM PAINT

Цикл обработки сообщений

message_loop:

invoke GetMessage,ADDR msg,0,0,0 ; получить сообщение от окна

test eax,eax ; если получено WM_QUIT, GetMessage вернет ноль

jz exit_msg_loop ; выйти

invoke TranslateMessage,ADDR msg ; иначе преобразовать сообщения типа WM_KEYUP ; в сообщения типа WM_CHAR

invoke DispatchMessage,ADDR msg ; и послать их оконной функции

jmp short message_loop  ; продолжить цикл exit_msg_loop:

mov eax,msg.wParam                                                ; код возврата

ret WinMain endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .IF uMsg == WM_DESTROY

invoke PostQuitMessage,0    ; послать WM_QUIT .ELSEIF uMsg == WM_CREATE

Создание списка ListBox

Параметры при создании списка:

1.       дополнительный стиль (0 по умолчанию)

2.       класс LISTBOX (системный класс)

3.       пустой заголовок окна

4.       стиль окна: WS_VISIBLE сделать ListBox види мым, WS_VSCROLL использовать вертикальную полосу прокрутки, WS_BORDER линия контура, WS_CHILD -разместить ListBox внутри формы, LBS_HASSTRINGS -элементы ListBox являются строковыми, LBS_NOINTEGRALHEIGHT не округлять размер ListBox до целого числа строк (обычно Windows устанавливает

размеры списка так, чтобы он не обрезал часть не вошедших по высоте окна списка строк, IiBS_DISABLENOSCROLL всегда отображать полосы прокрутки

5.      х-координата

6.      у-координата

7.      ширина

8.      высота

9.      идентификатор окна-предка

10.   идентификатор меню или окна-потомка

11.   идентификатор процесса, который будет получать сообщения от окна (наш процесс)

12.   адрес структуры CREATESTRUCT (не используется) invoke CreateWindowEx,0,ADDR szListBox,0,

WS_VISIBLE or WS_VSCROLL or  \

WS_BORDER or WS_CHILD or \

LBS_HASSTRINGS or LBS_NOINTEGRALHEIGHT or \

LBS_DISABIiENOSCROLL, 10 ,10 ,250 ,350 ,hWnd,

0,hlnstance,0 mov hList,eax    ; дескриптор окна ListBox Изменение атрибутов окна ListBox: установка оконной функции ListBoxProc. Эта функция аналогична WndProc. Она необходима для обработки событий нажатия клавиш в окне ListBox.

invoke SetWindowLong,hList,GWL_WNDPROC,ListBoxProc mov lpLstBox, eax ; запоминание старой функции

Создание кнопок

Кнопка 1

invoke CreateWindowEx,0, ADDR szButton,ADDR szBnl,

WS_CHILD or WS_VISIBLE,70,10,30, 30,hWnd,

bnl_id, hlnstance,0 Кнопка 2 invoke CreateWindowEx,0, ADDR szButton,ADDR szBn2,

WS_CHILD or WS_VISIBLE,270,50,30,30,hWnd,

bn2_id, hlnstance,0

Создание текстового поля Edit

ES_AUTOHSCROLL автоматический сдвиг символов влево

при нехватке места для текста,

ES_NOHIDESEL отключает скрытие выделения при

переходе к другому элементу управления

invoke CreateWindowEx,0,ADDR szEdit,0,

WS_BORDER or WS_VISIBLE or WS_CHILDWINDOW or \ ES_AUTOHSCROLL or ES_NOHIDESEL,310,10,170,70,

hWnd, 0,hins tance,О mov hEdit,eax    ; дескриптор окна Edit

Создание неизменяемого поля с надписью Static

invoke CreateWindowEx,0, ADDR szStatic,ADDR szTip, WS_CHILD or WS_BORDER or WS_VISIBLE, 270,100,210,250,hWnd,0,hinstance,0

Обработка нажатия кнопок

.ELSEIF uMsg == WM_COMMAND .IF wParam == bnl_id ; нажата кнопка ‘<‘ перемещение в ListBox ; копирование текста окна Edit в буфер ; с максимальной длиной текста 127 байт

invoke GetWindowText,hEdit,ADDR szBuffer,127 ; отправка сообщения LB_ADDSTRING о добавлении строки ; окну списка ListBox

invoke SendMessage,hList,LB_ADDSTRING,0, ADDR szBuffer .ELSEIF wParam == bn2_id    ; нажата кнопка ‘>’ ; отправка сообщения LB_GETCURSEL о получении индекса ; выделенной строки окну списка ListBox

invoke SendMessage ,hList ,LB_GETCUR.SEL,0,0 push eax ; отправка сообщения LB_GETTEXT о получении указанной ; строки (находится в еах) окну списка ListBox invoke SendMessage,hLi s t,LB_GETTEXT,eax,

ADDR szBuffer pop eax ; отправка сообщения LB_DELETESTRING об удалении ; указанной строки (находится в еах) окну списка ; ListBox

invoke SendMessage,hList,LB_DELETESTRING,eax,0 ; изменяет текст указанного окна

invoke SetWindowText,hEdit,ADDR szBuffer .ENDIF .ELSE ; для остальных сообщений обработчик по умолчанию invoke    DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax,eax ret WndProc endp ListBoxProc proc hCtl:HWND, uMsg:UINT, wParam:WPARAM,

lParam: LPARAM .IF uMsg == WM_LBUTTONDBLCLK ; если произведен двойной щелчок jmp Dolt .ELSEIF uMsg == WM_CHAR ; или нажата клавиша Enter .IF wParam = 13

jmp Dolt ; то вывести сообщение .ENDIF .ENDIF jmp EndDo Dolt:

invoke SendMes sage, hCtl, LB_GETCURSEL ,0,0 получение текста выделенной строки

invoke SendMessage,hCtl,IiB_GETTEXT,eax,ADDR szBuffer ; и вывод ее в окне

invoke MessageBox,hCtl,ADDR szBuffer,

ADDR szListBox,MB_OK    ; вызов MessageBox EndDo:

; Вызов старой функции ListBoxProc для обработки ; остальных сообщений

invoke CallWindowProc,lpLs tBox,hCtl,uMsg,wParam,

lParam ret ListBoxProc endp end start

Источник: Сучкова, Л.И. Win32 API: основы программирования: учебное пособие/ Л.И. Сучкова; АлтГТУ им. ИИ. Ползунова. -Барнаул, АлтГТУ, 2010. 138 с, ил.

По теме:

  • Комментарии