Реферат: Создание меню без файла описания ресурсов на основе функции LoadMenuIndirect.
Министерство образования Российской Федерации
Институтпереподготовки кадров
Уральскогогосударственного технического
университета
Кафедра микропроцессорной техникиКурсоваяработаТЕМА:Создание меню без файла описания ресурсовна основе функции LoadMenuIndirect.
Пояснительная записка
Руководитель доц., к.т.н. В.П.Кулюкин
Слушатель гр.СП-923 И.Г.
г.Нягань
2001г.
Введение.
Известно, что к программированию на языке ассемблераобращаются тогда, когда от программы требуется максимальная скоростьисполнения, когда необходимо обеспечить взаимодействие с нестандартнымивнешними устройствами, когда необходимо полностью использовать
возможности процессора и операционной системы. На языкеассемблера можно запрограммировать все, на что способна соответствующаявычислительная машина, то есть ассемблер является машинно-ориентированнымязыком программирования. Программируя на ассемблере иногда в силу привычки,иногда в силу необходимости, особенно при организации интерфейса пользователя,приходится многократно программировать одни и те же элементарные задачи. Вязыках высокого уровня эта проблема решена применением стандартных функций ипроцедур. В ассемблере эта проблема могла бы быть решена за счет библиотек стандартныхфункций как на уровне исходных текстов, так и объектных кодов, но такиебиблиотеки не стандартизованы и не распространяются вместе с компиляторами. Споявлением Windows 95 ситуация несколько изменилась.Создание приложений на языке ассемблера представляет собой весьма сложнуюзадачу в связи с высоким уровнем интеграции прикладной программы и операционнойсистемы, но теперь нет необходимости многократно решать проблемыпользовательского интерфейса и управления исполнением команд на уровне машинныхкоманд [I]. Они решаются теперь с помощью операционнойсистемы за счет обращения к функциям интерфейса прикладного программирования – Application Programming Interface (API).
Программированиепользовательского интерфейса с применением функций Win32 APIосновано на использовании так называемых ресурсов. Ресурсами являютсясоответствующим образом оформленные данные, используемые операционной системойдля создания внешнего отображения органов управления приложением, и средства,обеспечивающие ввод данных в процессе исполнения программы в режиме диалога.Ресурсы описываются в текстовом файле с расширением
rc. Файл ресурсов после обработки компилятора ресурсов иполучения двоичного файла с расширением res с помощьюкомпоновщика объединяется с исполняемым файлом.
Общая часть.
Наиболее очевидным средствомуправления приложением является меню. Строкаа меню выводится на экраннепосредственно под строкой заголовка. Это меню называется главным. Выборэлемента меню влечет за собой выдачу приложения сообщения WD_COMMAND,содержащего идентификатор пункта меню. Идентификаторы анализируются в оконнойпроцедуре приложения, что обеспечивает соответствующую реакцию на полученноесообщение. Каждый пунк меню определяется тремя характеристиками. Перваяопределяет то, что будет отображаться в данном пункте меню – это либо строкатекста, либо картинка. Вторая характеристика определяет либо константу,посылаемую оконной процедуре сообщении WM_COMMAND,либо всплывающее меню, которое выводится на экран, когда пользователь выбираетданный пункт меню. Третья характеристика указывает, является ли данный пунктменю разрешенным (enabled), запрешенным (disabled),недоступным (grayed) или помеченным (checked). Этахарактеристика пункта меню не является обязательной.
Для того, чтобы включить менюв приложение, необходимо реализовать следующую последовательность шагов:
· разработать сценарий меню. Передтем как приступить к процессу включения меню в конкретное приложение,разработаем логическую схему. Этот шаг необходим для того, чтобы уже на стадиипроектирования обеспечить эргономические свойства приложения. Ведь меню – этоодин из немногих элементов интерфейса, с которым пользователь постоянно будетиметь дело. Поэтому схема меню должна иметь наглядную иерархическую структуру,с логически увязанными между собой пунктами этой иерархии, что поможетпользователю эффективно использовать все возможности приложения. Для того,чтобы вести предметный разговор, поставим себе задачу разработать для окнанашего приложения главное меню. При этом мы исследуем возможности вывода в окноприложения текста и графики, а также покажем способы решения общих проблем,связанных с разработкой приложения. Наше меню достаточно простое и состоит изтрех элементов: “Текст”,”Графика”,”О приложении”. Иерархическая структура менюпредставлена.
/> /> /> /> /> /> /> /> />DrawText
/> <td/>Примитивы
/> /> /> />Эффекты
/> /> />Павлин
/> />/> /> /> /> /> /> /> /> /> /> /> /> /> /> /> />
Текст
/>Графика
<td/>О приложении
/> /> /> /> /> /> /> /> /> <td/>TextOut
/> /> /> /> /> /> /> />Кружева
· описать схему меню в файлересурсов. Для выполнения этого описания используются специальные операторы.
· составить текст включаемого файла,необходимого для компиляции ресурсного файла
· компилировать ресурсный файл.
· подключить меню на стадиирегистрации того окна приложения, для работы с которым оно будетиспользоваться.
Меню можно создать тремяспособами. Можно определить меню в файле описания ресурсов, создать меню безфайла описания ресурсов непосредственно в программе с помощью функций CreatMenu, AppendMenu и InsertMenu или с помощью функции LoadMenuIndirect,создав предварительно структуру MENUITEMPLATE. Наиболее простым и понятным при программировании подWindows95 на языке ассемблера является определение меню вфайле описания ресурсов с помощью любого текстового редактора.
Основная часть.
Моя задача заключается в том,чтобы написать программу на тему: “Создать меню без файла описания ресурсов наоснове функций LoadMenuIndirect”.
Одним из средств созданияменю без использования файла описания ресурсов является функция LoadMenuIndirect. Для применения этой функции необходимо создатьшаблон меню, определяемый структурами
MENUITEMTEMPLATEHEADERи MENUITEMTEMPLATE.
Полный шаблон меню состоит из заголовка и хотя быодного описания пункта меню. Заголовок – структура MENUITEMTEMPLATEHEADER – cостоит из двух полей размером в слово. В первом словесодержится номер версии функции. Для Windows NT и Win16это 0, для Windows95-1. Во втором слове содержится смещение до первойструктуры MENUITEMTEMPLATE. Если между заголовком и описанием первого пунктаменю нет дополнительной информации, это поле содержит 0.
Описания пунктов меню,следущие за заголовком, должны быть выравнены на границе двойного слова.Структура MENUITEMTEMPLATE имеет, как правило, пять полей. Шестое поле имеетсмысл для пункта меню, указывающего на всплывающее меню.
Вкачестве примера приводится окно с главными и всплывающими меню, созданными спомощью функции LoadMenuIndirect.
/>
p386
jumps
model flat,STDCALL
include win32.inc ; файл описания структур и констант
L equ<LARGE>
IDM_QUIT equ 100
IDM_ABOUT equ 101
MF_ENABLED equ 0
MF_POPUP equ 1h
; Функции Win32API, используемые программой
extrn BeginPaint:PROC
extrn CreateWindowExA:PROC
extrn DefWindowProcA:PROC
extrn DispatchMessageA:PROC
extrn EndPaint:PROC
extrn ExitProcess:PROC
extrn GetMessageA:PROC
extrn GetModuleHandleA:PROC
extrn LoadCursorA:PROC
extrn LoadIconA:PROC
extrn RegisterClassA:PROC
extrn PostQuitMessage:PROC
extrn ShowWindow:PROC
extrn TranslateMessage:PROC
extrn UpdateWindow:PROC
extrn LoadMenuIndirectA:PROC
extrn MessageBoxA:PROC
.data
newhwnd dd 0
lppaint PAINTSTRUCT <?>
msg MSGSTRUCT <?>
wc WNDCLASS <?>
hInst dd 0
fl dw 0
szTitleName db 'Это наше окно',0
szClassName db 'ASMCLASS32',0
szHello db 'Привет!',0
szAppName db 'Сообщение',0
hMenu dd 0
align 4
MenuTemplate dw 1,0 ; Заголовок меню. 1 — признак
; структурыдля функции Windows95
align 4
dd 0 ; типпункта
dd 0,MF_ENABLED,0;IDM_ABOUT ;
dw 81h
dw '&','M','e','n','u','1',0
align 4
dd 0,0,0,IDM_QUIT
dw 0
dw 'E','&','x','i','t',0,0
align 4
dd 0,0,IDM_ABOUT
dw 0
dw '&','Q','u','i','t','1',0
align 4
dd 0,0,0;IDM_QUIT
dw 81h ; Признак вспл. меню
dw 'Q','u','i','t','2',0,0,0
align 4
dd 0,0,IDM_ABOUT
dw 0
dw 'Q','u','i','t','3',0,0
align 4
dd 0,0,IDM_QUIT
dw 80h
dw 'E','&','x','i','t',0,0
.code
start:
push L0
call GetModuleHandleA
mov [hInst], eax
; инициализацияструктуры WndClass
mov [wc.clsStyle], CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS
mov [wc.clsLpfnWndProc], offset WndProc
mov [wc.clsCbClsExtra], 0
mov [wc.clsCbWndExtra], 0
mov eax, [hInst]
mov [wc.clsHInstance], eax
push LIDI_APPLICATION
push L0
call LoadIconA
mov [wc.clsHIcon], eax
push LIDC_ARROW
push L0
call LoadCursorA
mov [wc.clsHCursor], eax
mov [wc.clsHbrBackground],COLOR_WINDOW + 1
mov dword ptr [wc.clsLpszMenuName],0
mov dword ptr [wc.clsLpszClassName], offset szClassName
push offset wc
call RegisterClassA
push offset MenuTemplate
call LoadMenuIndirectA
mov [hMenu],eax
push L0 ; lpParam
push [hInst] ; hInstance
push [hMenu] ; menu
push L0 ; parent hwnd
push LCW_USEDEFAULT ; height
push LCW_USEDEFAULT ; width
push LCW_USEDEFAULT ; y
push LCW_USEDEFAULT ; x
push LWS_OVERLAPPEDWINDOW ; Style
push offset szTitleName ; Title string
push offset szClassName ; Class name
push L0 ; extra style
call CreateWindowExA
mov [newhwnd], eax
push LSW_SHOWNORMAL
push [newhwnd]
call ShowWindow
push [newhwnd]
call UpdateWindow
msg_loop:
push L0
push L0
push L0
push offset msg
call GetMessageA
cmp ax, 0
je end_loop
push offset msg
call TranslateMessage
push offset msg
call DispatchMessageA
jmp msg_loop
end_loop:
push [msg.msWPARAM]
call ExitProcess
; we neverget to here
;----Оконная процедура----
WndProc proc usesebx edi esi, hwnd:DWORD, wmsg:DWORD,\
wparam:DWORD,lparam:DWORD
LOCAL hDC:DWORD
cmp [wmsg], WM_DESTROY
je wmdestroy
cmp [wmsg], WM_SIZE
je wmsize
cmp [wmsg],WM_CREATE
je wmcreate
cmp [wmsg],WM_PAINT
je wmpaint
;**************************************
cmp [wmsg],WM_COMMAND
je wmcommand
;**************************************
jmp defwndproc
wmcommand:
mov eax,lparam
cmp ax,0
jne m1
mov eax,wparam
cmp ax,IDM_ABOUT
jne m2
call MessageBoxA,0,offsetszHello,offset szAppName,MB_OK
jmp m1
m2: cmp ax,IDM_QUIT
jne m1
push 0
call PostQuitMessage
m1: mov eax,0
jmp finish
wmcreate:
mov eax,0
jmp finish
defwndproc:
push [lparam]
push [wparam]
push [wmsg]
push [hwnd]
call DefWindowProcA
jmp finish
wmdestroy:
push L 0
call PostQuitMessage
mov eax, 0
jmp finish
wmsize:
mov eax, 0
jmp finish
wmpaint:
push offset lppaint
push [hwnd]
call BeginPaint
mov [hDC],eax
push offsetlppaint
push [hwnd]
call EndPaint
mov eax,0
jmp finish
finish:
ret
WndProc endp
;---------------------------------
public WndProc
end start