Приклад програми з роботи з елементами управління

Розглянемо додаток, що ілюструє ряд перерахованих вище можливостей елементів управління На формі розмістимо обєкти таких типів: List Box, Edit Box і дві кнопки, одна з яких призначена для переміщення тексту з рядка редагування в список рядків, а інша для переміщення виділеної рядки зі списку в рядок редагування Подвійне клацання по рядку списку або натискання клавіші «Enter» приводить до висновку вікна з повідомленням, текст якого береться з поточного елементу списку рядків Крім того, створимо на формі напис, що є статичним елементом управління і предствляет собою вікно зумовленого класу «STATIC»

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

.model flat,stdcall

option casemap:none

; Підключення файлів і бібліотек

include з:\masm32\include\windowsinc

include з:\masm32\include\user32inc

include з:\masm32\include\kernel32inc

includelib з:\masm32\lib\user32lib

includelib з:\masm32\lib\kernel32lib

; прототипи функцій

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    &quotLISTBOX&quot,0 szButton     db    &quotBUTTON&quot,0 szEdit       db    &quotEDIT&quot,0 szStatic     db    &quotSTATIC&quot,0

szBnl       db    &quot&lt&quot,0 szBn2       db    &quot&gt&quot,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 wccbSize, SIZEOF WNDCLASSEX розмір структури 4 * 12 байтів

mov wcstyle, CS_HREDRAW or CS_VREDRAW ~ стиль вікна, що передбачає перерисовку при вертикальному і горизонтальному русі

mov wclpfnWndProc, OFFSET WndProc

функція-обробник подій вікна

mov wccbClsExtra,NULL

число додаткових байтів

mov wccbWndExtra,NULL

число додаткових байтів

push hlnst

pop wchlnstance

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

mov wchbrBackground,COLOR_BTNFACE+1

ідентифікатор кисті (або колір фону +1)

mov wclpszMenuName,NULL

ресурс з основним меню

mov wclpszClassName,OFFSET szClassName

імя класу

invoke LoadIcon,NULL,IDI_APPLICATION

mov wchIcon,eax

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

mov wchIconSm,NULL

ідентифікатор маленької іконки (повинен бути 0)

invoke LoadCursor,NULL,IDC_ARROW

mov wchCursor,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, msgwParam код повернення

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_GETCURSEL, 0,0 push eax відправка повідомлення LB_GETTEXT про отримання зазначеної рядка (знаходиться в ЕАХ) вікна списку ListBox invoke SendMessage, hLi st, 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 с, іл

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*