Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей
|
Обратимся теперь к исходному тексту программы. Диалоговое окно представляет
собой одну из разновидностей окон Windows, поэтому регистрация
класса окна и создание экземпляра окна являются стандартными и не отли-
Программирование на ассемблере в Windows: от простого к сложному 397
чаются в принципе от аналогичных процедур для других окон. Разница
лишь в том, что все эти манипуляции выполняются при помощи специальных
функций, предназначенных для этого. Команда:
mov wc.IpszClassName, offset ClassName
заполняет поле структуры wc именем класса. Для создания и отображения
самого ОКНа ИСПОЛЬЗуетСЯ ФУНКЦИЯ CreateDialogParam:
invoke CreateDialogParam, hlnstance, ADDR DlgName, NULL, NULL, NULL
mov hDlg,EAX
Полученный дескриптор окна запоминается в переменной hDlg. Кроме самого
окна диалога у нас появятся еще 8 элементов управления: три элемента
статического текста, три поля редактирования и две кнопки. Все такие
элементы создаются с помощью все той же функции CreateWindow. Например,
для создания элемента статического текста необходимо выполнить следующие
команды:
invoke CreateWindowEx, WS_EX_CLIENTEDGE, ADDR LabelClassName, NULL,\
WS_CHILD or WS_VISIBLE or WS_BORDER or\
ES_LEFT or ES_AUTOHSCROLL,\
15, 35, 130, 25, hWin,\
LabellDl, hlnstance, NULL
mov hwndLabell, EAX
Создание элементов управления выполняют обычно в обработчике
WM_CREATE. Для управления поведением элемента управления, расположенного
в диалоговом окне, вызывается функция GetDigitem. Кроме того, в
Windows имеется целый ряд функций для работы с элементами управления
в диалоговом окне. В нашем примере мы использовали функции WIN API
GetDlgltemlnt, SetDlgltemlnt, SetDlgltemText.
Функция GetDlgltemlnt представляет собой сокращенный метод выборки
целочисленного значения из элемента управления в диалоговом окне. Эта
функция преобразует символьную строку в элементе управления в целое
число и имеет синтаксис:
UINT GetDlgltemlnt(HWND hDlg, // дескриптор диалогового окна
int nIDDlgltem, // идентификатор элемента управления
BOOL *lpTranslated, // указатель на переменную,
// определяющую, успешно ли
// выполнено преобразование
BOOL bSigned // TRUE, если выбираемое значение -
// целое число со знаком,
// FALSE, если целое число без знака
Функция setDigitemint позволяет установить текстовое представление целого
числа и объявляется так:
BOOL SetDigitemint(HWND hDlg, // дескриптор диалогового окна
int nIDDlgltem, // идентификатор элемента управления
UINT uValue, // целочисленное значение, которое
// необходимо установить в качестве
// текста в элементе управления
BOOL bSigned // то же, что и в функции GetDlgltemlnt
Наконец, с помощью функции setDigitemText можно установить заголовок
элемента управления. Функция имеет синтаксис:
BOOL SetDigitemText(HWND hDlg,
int nIDDlgltem,
LPCTSTR IpString
// дескриптор диалогового окна
// идентификатор элемента
// управления
//буфер текста
Наша программа представляет собой простейший калькулятор, выполняющий
всего одну операцию — сложение целых чисел.
Сообщения от элементов управления отрабатываются в обработчике
WMCOMMAND. Для анализа приходящих вместе с этим сообщением параметров
wParam и lParam разработан следующий фрагмент программного кода:
next_l:
cmp uMsg, WM_COMMAND
jne next_2
mov EAX, wParam
mov EDX, ЕАХ
cmp lParam, О
j е ex_wmcom
Для того чтобы получить сообщение от конкретного элемента управления,
необходимо проанализировать параметр lParam. Мы уже встречались с этим
в предыдущем примере. Если lParam не равен 0, то программа определяет,
какой элемент управления вызвал сообщение и реагирует соответствующим
образом.
Например, при нажатии кнопки " + " инициируется сообщение I D C P L U S и
происходит сложение двух чисел:
checkjplus:
cmp АХ, IDC_PLUS
jne check_clear
invoke GetDlgltemlnt, hWin, IDC_EDIT1, ADDR lpTranslated, 1
mov il, EAX
invoke GetDlgltemlnt, hWin, IDC_EDIT2, ADDR lpTranslated, 1
add il, EAX
xchg il, EAX
mov ires, EAX
invoke SetDlgltemlnt, hWin, IDC_EDIT3, ires, 1
При нажатии кнопки clear все поля редактирования очищаются:
check_clear:
cmp АХ, IDC_CLEAR
jne ex_wmcom
invoke SetDlgltemText,
invoke SetDlgltemText,
invoke SetDlgltemText,
check_clear:
cmp AX, IDC_CLEAR
j ne ex_wmcom
hWin, IDC_EDIT1, NULL
hWin, IDC_EDIT2, NULL
hWin, IDC_EDIT3, NULL
400 Глава 5
invoke SetDigitemText, hWin, IDC_EDIT1, NULL
invoke SetDigitemText, hWin, IDC_EDIT2, NULL
invoke SetDigitemText, hWin, IDC_EDIT3, NULL
В этом примере также показано, как можно вывести текст в элемент управления.
Это осуществляется с помощью следующего фрагмента кода:
mov hwndLabel3, ЕАХ
invoke SetWindowText, hwndLabell, ADDR LabelTextl
invoke SetWindowText, hwndLabel2, ADDR LabelText2
invoke SetWindowText, hwndLabel3, ADDR LabelText3
<< Назад В начало Далее >> |
|