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

еще рефераты
Еще работы по информатике, программированию