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

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


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





Анализ примера начнем с обработчика WMCHAR. Как и в предыдущем примере, оконная процедура отслеживает ввод символов с клавиатуры через обработчик этого сообщения. Полученный символ извлекается из параметра сообщения wParam в регистр ЕАХ. Наша программа должна отображать полученный и преобразованный символы через функцию TextOut в двух отдельных строках, поэтому сразу поместим полученный символ в буфер si, а преобразованный — в di. Для размещения символа в si необходимо выполнить следующие команды:
mov ЕАХ, wParam
lea EDI, si
add EDI, Is
sub EDI, 2
mov [EDI], AL

Преобразованный символ размещается в строке di при помощи аналогичных команд, но вдобавок подвергается анализу с помощью команд charupper и ischarupper. Фрагмент кода будет следующим:
lea EDI, dl
add EDI, Id

Программирование на ассемблере в Windows: от простого к сложному 359 sub EDI, 2
mov [EDI], AL
push DWORD PTR [EDI]
call IsCharUpper
cmp EAX, 1
je next
push EDI
call CharUpper

Функция IsCharUpper возвращает значение типа bool (TRUE ИЛИ FALSE) В зависимости от результата анализа символа. Параметром вызова этой функции является значение символа. Функция IsCharUpper возвращает результат в регистре ЕАХ. ЕСЛИ результат равен 1 (TRUE), ТО СИМВОЛ В преобразовании не нуждается, если равен 0 (FALSE), ТО вызывается функция CharUpper.
Единственным параметром этой-функции является адрес символа, который и помещается в стек перед вызовом функции. После того, как оба символа помещены в буферы si и di, вызывается функция InvalidateRect, заставляющая приложение перерисовать окно. Это все, что касается обработчика WM_CHAR.
Вывод текстовых буферов выполняется в обработчике сообщения WMPAINT при помощи функции TextOut обычным способом и в дополнительных пояснениях не нуждается.

5.7. Элементы управления Windows и их применение в программах на ассемблере
Как бы мы ни использовали богатый арсенал функций WIN API и как бы ни комбинировали обработчики сообщений, добиться высокой функциональности приложения без элементов управления и ресурсов очень трудно. Вначале рассмотрим возможности элемента управления меню. Это, вероятно, наиболее важная часть пользовательского интерфейса, который предлагают программы для Windows, а использование меню в программе — задача не сложная.

Прежде всего необходимо определить структуру меню в файле описания ресурсов и присвоить каждому пункту меню уникальный идентификатор. Имя меню должно быть определено в структуре класса окна. Когда в работающем приложении выбирается пункт меню, Windows посылает программе сообщение WM_COMMAND, содержащее этот идентификатор.
При запуске программы строка меню выводится на экране непосредственно под строкой заголовка. Эту строку иногда называют главным меню (Main Menu) или меню верхнего уровня (top-level menu). При выборе элемента главного меню раскрывается другое меню. Это меню называется выпадающим (popup menu). Иногда можно услышать другое название — подменю (submenu). Программист может определить несколько уровней вложенности для выпадающих меню. Пункты (опции) выпадающих меню могут быть помечены (checked), при этом слева от текста элемента меню ставится метка, определяющая, какие опции программы выбраны.

Пункты главного меню пометить нельзя. Кроме этого, пункты в главном и выпадающих меню могут быть "разрешены" (enabled), "запрещены" (disabled) или "недоступны" (grayed).

Создать меню можно несколькими способами. Наибольшее распространение получил способ определения меню в файле описания ресурсов в форме шаблона меню, например:
MyMenu MENU
{
[список элементов меню]
}
где MyMenu — это имя элемента управления меню. Это имя должно присваиваться соответствующему полю в структуре класса окна. Более подробно структуру меню мы увидим немного позже при рассмотрении примеров.
Файл описания ресурсов должен быть предварительно откомпилирован редактором ( к о м п и л я т о р о м ) р е с у р с о в . Для э т о г о используется утилита гс.ехе. Предварительно подготовленный файл (имеющий расширение RC) с описанием р е с у р с о в к о м п и л и р у е т с я в д в о и ч н ы й файл с расширением RES.
Полученный файл при п о м о щ и к о м п о н о в щ и к а включается в и с п о л н я е м ы й модуль п р и л о ж е н и я . Например, если п р и л о ж е н и е туарр и с п о л ь з у е т ресурс, описанный в файле mymenu.rc, то для компиляции и с б о р к и п р о г р а м м ы следует выполнить п о с л е д о в а т е л ь н о с т ь о п е р а т о р о в
ml /с /coff /Ср myapp.asm
rc mymenu. гс
link /SUBSYSTEM:WINDOWS /LIBPATH:c:\masm32\lib myapp.obj mymenu.res Каждый пункт меню должен иметь уникальный в пределах д а н н о г о меню и д е н т и ф и к а т о р (целое число). Windows посылает о к о н н о й процедуре идентификатор в ы б р а н н о г о пункта меню в качестве параметра. Обычно вместо численных з н а ч е н и й используют идентификаторы, о п р е д е л е н н ы е в разделе к о н с т а н т п р о г р а м м н о г о кода.
Эти и д е н т и ф и к а т о р ы н а ч и н а ю т с я с с и м в о л о в IDM. Обозначения придуманы р а з р а б о т ч и к а м и Microsoft, хотя можно использовать и свои.


 
 
 

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