Обучающие курсы:

Обучение профессии "Разработчик C#" + стажировка в Mail.ru
Обучение профессии "Разработчик Python" + трудоустройство
Обучение профессии "Веб-разработчик" + стажировка в Mail.ru


Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





5.8. Использование элементов управления
Операционная система Windows имеет предопределенные классы окон, которые можно использовать при написании приложений. Такими классами являются кнопки, списки, поля со списком, поля редактирования, линейки прокрутки и др. Созданные на их основе элементы управления придают дополнительную гибкость и мощь интерфейсу приложения. Элементы управления представляют собой дочерние окна и создаются в приложении при помощи функций WIN API CreateWindow или createWindowEx. Регистрировать классы окон, как это делается для главного окна приложения, не нужно, т. к. эти классы уже зарегистрированы в Windows.

К существующим классам, с которыми может работать функция CreateWindow, ОТНОСЯТСЯ Button, ListBox, ComboBox, Static, RichEdit И ScrollBar. Есть некоторые особенности работы с элементами управления, созданными на базе этих классов. Предположим, вы создаете в программе элемент управления "кнопка". ДЛЯ ЭТОГО В ФУНКЦИИ CreateWindow ВЫ ДОЛЖНЫ указать В имени класса Button, а также дескриптор родительского окна и идентификатор создаваемой кнопки.

Обычно элементы управления создаются при вызове обработчика сообщения WMCREATE главного окна приложения. Дочернее окно, которым является элемент управления, может посылать сообщение WMCOMMAND родительскому окну. При этом идентификатор ID элемента управления помещается в младшее слово переменной wParam, а в старшее слово помещается код, уведомляющий о том, что с элементом управления произошло. Например, если уведомляющий код для кнопки имеет значение B N C L I C K E D , ЭТО говорит о том, что кнопка нажата.

Программирование на ассемблере в Windows: от простого к сложному 381 Сейчас мы создадим программу, в которой выполним преобразование текстовой строки. В первое поле редактирования (элемент управления Edit) введем текст, затем заменим во введенной строке все пробелы на дефис, после чего выведем результат в окно второго поля редактирования. Преобразование будет выполняться при нажатии на кнопку (элемент управления Button).
Кроме этого, разместим над полями редактирования подсказки, использовав два элемента статического текста s t a t i c . Исходный текст программы (назовем ее CONTR) приведен в листинге 5.23.
Листинг 5.23. Программа, демонстрирующая работу основных элементов
.386
.model flat,stdcaii
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
CONTR.ASM
data
ClassName DB "SimpleWinClass", 0
AppName DB " ", 0
CommandLine DD 0
hlnstance DD 0

Переменные для элемента 'button"
ButtonClassName
ButtonText
hwndButton
DB "BUTTON", 0
DB "ПРЕОБРАЗОВАТЬ", 0
DD 0

Переменные для элемента "STATIC"
LabelClassName DB "STATIC", О
LabelTextl DB " ИСХОДНЫЙ ТЕКСТ", О
LabelText2 DB " ПРЕОБРАЗОВАННЫЙ ТЕКСТ", О
hwndLabell DD О
hwndLabe!2 DD О

Переменные для элемента "EDIT"
EditClassName DB "edit", О
hwndEditl DD 0
hwndEdit2 DD 0
bytesWritten DD 0
buffer DB 512 dup(?)

Идентификаторы элементов управления
.const
ButtonID EQU 1
EditlDl EQU
EditID2 EQU
LabelID1 EQU 4
LabelID2 EQU 5
. code
start:
invoke GetModuleHandle, NULL
mov hlnstance, EAX
invoke GetCommandLine
invoke WinMain, hlnstance, NULL, CommandLine, SW_SHOWDEFAULT
invoke ExitProcess, EAX
WinMain proc hlnst: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 hlnst
pop wc.hlnstance
mov wc.hbrBackground,COLOR_WINDOW-2
mov wc.IpszMenuName, NULL
mov wc.IpszClassName, offset ClassName
invoke Loadlcon, NULL, IDI_APPLICATION
mov wc.hlcon, EAX
mov wc.hlconSm, EAX
invoke LoadCursor, NULL, IDC_ARROW
mov wc.hCursor, EAX
invoke RegisterClassEx, addr wc
invoke CreateWindowEx, WS_EX_CLLENT/EDGE, ADDR ClassName, \
ADDR AppName, WS_OVERLAPPEDWINDOW,\
CW_USEDEFAULT, CWJJSEDEFAULT,\
CWJJSEDEFAULT, CWJJSEDEFAULT, NULL, NULL,\
hlnst, NULL
mov hwnd, EAX
invoke ShowWindow, hwnd, SW_SHOWNORMAL
invoke UpdateWindow, hwnd

Цикл обработки сообщений
StartLoop:
invoke GetMessage, ADDR msg, NULL, 0, 0
cmp EAX, 0
je ExitLoop
384 Гпава 5
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
jmp StartLoop
ExitLoop:
mov EAX, msg.wParam
ret
WinMain endp

Оконная процедура
WndProc proc hWin:HWND,
uMsg:UINT,
wParam:WPARAM,
lParam:LPARAM
cmp uMsg, WM_CREATE
jne next_l
invoke CreateWindowEx, WS_EX_CLIENTEDGE,\
ADDR LabelClassName, NULL,\
WS_CHILD or WS_VISIBLE or WS_BORDER\
or ES_LEFT or ES_AUTOHSCROLL,\
20, 35, 170, 25, hWin, LabelIDl,\
hlnstance, NULL
mov hwndLabell, EAX
invoke CreateWindowEx, WS_EX_CLIENTEDGE,\
ADDR LabelClassName, NULL,\
WS_CHILD or WS_VISIBLE or WS_BORDER\
or ES_LEFT or ES_AUTOHSCROLL,\
200, 35, 220, 25, hWin, LabelID2,\
hlnstance, NULL
mov hwndLabel2, EAX
invoke CreateWindowEx, WS_EX_CLIENTEDGE,\
ADDR EditClassName, NULL,\
WS_CHILD or WS_VISIBLE or WS_BORDER\
or ES_LEFT or ES_AUTOHSCROLL,\
20, 65, 170, 25, hWin, EditlDl,\
hlnstance, NULL
mov
invoke
mov
invoke
mov
invoke
invoke
invoke
ret
next_l:
cmp
jne
mov
cmp
je
cmp
jne
shr
cmp
jne
invoke
mov
call
invoke
hwndEditl, EAX
CreateWindowEx, WS_EX_CLIENTEDGE,\
ADDR EditClassName, NULL,\
WS_CHILD or WS_VISIBLE or WS_BORDER\
or ES_LEFT or ES_AUTOHSCROLL,\
200, 65, 220, 25, hWin, EditID2,\
hlnstance, NULL
hwndEdit2, EAX
CreateWindowEx, NULL, ADDR ButtonClassName, ADDR ButtonText,\
WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\
140, 95, 130, 25, hWin, ButtonID,\
hlnstance, NULL
hwndButton, EAX
SetFocus, hwndEditl
SetWindowText, hwndLabell, ADDR LabelTextl
SetWindowText, hwndLabel2, ADDR LabelText2
uMsg, ^_COMMAND
next_2
EAX,wParam
lParam, 0
ex_wmcom
AX, ButtonID
ex_wmcom
EAX, 16
AX, BN_CLICKED
ex_wmcom
GetWindowText, hwndEditl, ADDR buffer, 512
bytesWritten, EAX
ReplaceSpace
SetWindowText, hwndEdit2, ADDR buffer
ret
next_2:
cmp uMsg, WM_DESTROY
jne next 3
push NULL
call PostQuitMessage
xor EAX, EAX
ret
next_3:
push lParam
push wParam
push uMsg
push hWin
call DefWindowProc
ret
WndProc endp
ReplaceSpace proc
lea EDI, buffer
mov ECX, bytesWritten
eld
mov
next_ch:
scasb
je
cont:
loop
ret
repSpace
mov
jmp
AL, 20h
repSpace
next ch
byte ptr [EDI-1], '-'
cont
ReplaceSpace endp
end start


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru