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

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