Реферат: Создание меню без файла описания ресурсов на основе функции 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