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





Обратите внимание на раздел констант ассемблерной программы. Здесь объявлены идентификаторы нашего меню, причем их значения должны совпадать с определенными в файле описания ресурсов:
.const
IDM_WHITE EQU 1
IDM_BLACK EQU 2
IDM_BLUE EQU 3
IDM_TITLE EQU 4

При выборе пункта меню приложения Windows генерирует сообщение WMCOMMAND. При этом старшее слово переменной wParam равно 0, а младшее слово определяет идентификатор выбранного пункта меню. Например, фрагмент кода
cmp uMsg, WM_COMMAND
jne next_l
mov EAX, wParam
cmp AX, IDM_WHITE анализирует выбор пункта меню IDMWHITE.
Обработчики пунктов IDMWHITE, IDMBLACK и IDM_BLUE выпадающего меню выполняют похожие действия — они меняют цвет фона клиентской области окна приложения. Например, при выборе пункта меню IDMBLACK выводится предупреждающее сообщение, и цвет фона меняется на черный. Для изменения цвета мы используем функцию WIN API FillRect, имеющую следующий синтаксис:

int FillRect(HDC hdc, • //дескриптор контекста устройства
CONST RECT *lprc, // указатель на структуру RECT
// определяющую область заполнения
HBRUSH hbr // дескриптор логической кисти, которая
// используется для заполнения области
) ;

В качестве дескриптора кисти можно указать код системного цвета (COLOR_WINDOW) и добавить или вычесть из него определенное число, чтобы получить требуемый цвет. Заполнение клиентской области окна черным цветом выполняется следующим кодом:
mov hBrush, COLOR_WINDOW+3
fill_rect:
push hBrush
lea ESI, rect
push ESI
push hdc
call FillRect

Выбор пункта меню T I T L E приводит к выполнению программного кода, меняющего заголовок окна приложения. Здесь используется функция setwindowText, принимающая в качестве параметров дескриптор окна и адрес строки текста. Переменная toggle служит для переключения с одного заголовка на другой.

В следующем примере показан способ загрузки меню при помощи функции setMenu. Такой вариант удобен при необходимости оперировать с несколькими меню в программе. Смена меню выполняется при нажатии кнопок мыши. Исходный текст программы (назовем ее DMENU) приведен далее в листинге 5.22.
.386
.model flat, stdcaii
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
DrawTxt PROTO :DWORD,:DWORD,:DWORD
DMENU.ASM
.data
szDisplayName
CommandLine
DB "ДИНАМИЧЕСКИЕ МЕНЮ", О
DD О
hWnd DD 0
hlnstance DD 0
szClassName DB "Demo_Class", 0
AppName DB "МОЯ ПРОГРАММА", О

Установки для меню 1
MenuNamel DB "MenuDemol", О
Программирование на ассемблере в Windows: от простого к сложному 373
Text11 DB "ВЫ ВЫБРАЛИ ОПЦИЮ TEXT11", О
Text12 DB "ВЫ ВЫБРАЛИ ОПЦИЮ TEXT12", О
Exl DB "ВЫ ВЫБРАЛИ ОПЦИЮ EXIT1", О
Mesl DB "ВЫ ВЫБРАЛИ ПУНКТ MESSAGE1", О
; Установки для меню 2
MenuName2 DB "MenuDemo2", О
Text21 DB "ВЫ ВЫБРАЛИ ОПЦИЮ TEXT12", О
Text22 DB "ВЫ ВЫБРАЛИ ОПЦИЮ TEXT22", О
Ех2 DB "ВЫ ВЫБРАЛИ ОПЦИЮ EXIT2", О
Mes2 DB "ВЫ ВЫБРАЛИ ПУНКТ MESSAGE2", О
.const
IDM_TEXT11 EQU 1
IDM_TEXT12 EQU 2
IDM_EXIT1 EQU 3
I DM_ME S SAGE 1 EQU 4
IDM_TEXT21 EQU 5
IDM_TEXT22 EQU 6
IDM_EXIT2 EQU 7
IDM MESSAGE2 EQU 8
. code
start:
push NULL
call GetModuleHandle
mov hlnstance, EAX
call GetCommandLine
mov CommandLine, EAX
push SW_SHOWDEFAULT
push CommandLine
push NULL
push hlnstance
call WinMain
374 Гпава 5
push ЕАХ
call ExitProcess
WinMain proc hlnst :DWORD,
hPrevInst :DWORD,
CmdLine :DWORD,
CmdShow :DWORD

Локальные переменные процедуры
LOCAL wc :WNDCLASSEX
LOCAL msg :MSG


 
 
 

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