Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для 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


 
 
 

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