Ресурсы в Windows-приложениях 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Ресурсы в Windows-приложениях



Ресурс — это специальный объект, используемый программой, но не определяемый в ее теле. Наиболее употребляемыми ресурсами являются

- иконки;

- курсоры;

- битовые картинки;

- строки;

- диалоговые окна;

- меню;

- акселераторы.

Преимущества ресурсов:

· Ресурсы загружаются в память лишь при обращении к ним, т.е. реализуется экономия памяти.

· Свойства ресурсов поддерживаются системой автоматически, не требуя от программиста написания дополнительного кода.

Описание ресурсов производится в отдельном текстовом файле с расширением.rc, в котором для описания каждого типа ресурса используются специальные операторы. Подготовку этого файла можно вести двумя способами: ручным и автоматизированным.

Ручной способ предполагает следующее:

- разработчик ресурса хорошо знает операторы, необходимые для описания конкретного ресурса;

- ввод текста ресурсного файла выполняется с помощью редактора, который не вставляет в вводимый текст элементы форматирования. Наиболее доступный редактор для этих целей входит в состав программного обеспечения Windows — это notepad.ехе.

Автоматический способ создания ресурсного файла предполагает использование специальной программы — редактора ресурсов, который позволяет визуализировать процесс создания ресурса. Конечные результаты работы этой программы могут быть двух видов: в виде текстового файла с расширением.rc, который впоследствии можно подвергнуть ручному редактированию, либо в виде двоичного файла, уже пригодного к включению в исполняемый файл приложения.

После того как ресурсы описаны в файле с расширением.rc, они должны быть преобразованы в вид, пригодный для включения их в общий исполняемый файл приложения. Для этого необходимо:

1. Откомпилировать ресурсный файл. На этом шаге выполняется преобразование текстового представления ресурсного файла с расширением.rc в двоичное представление с расширением.res. Для реализации этого действия в пакете MASM есть специальная программа rc.ехе — компилятор ресурсов.

2. Включить ресурсы в исполняемый файл приложения. Это действие выполняет компоновщик link.ехе, которому в качестве последнего параметра должно быть передано имя ресурсного файла (.res).

Для создания ресурсов в Visual Sudio достаточно в дереве проекта добавить новый файл ресурса (Resource FilesàAddàNew Item, Resource File (.rc)) и задать имя файла ресурсов. Для добавления в файл ресурсов новых описаний нужно кликнуть дважды на файле ресурсов и в открывшемся окне ресурсов дерева проектов выбрать по правой кнопке Add Resource.

Иконки, курсоры могут быть описаны в самом файле ресурсов, либо храниться в отдельном файле *.ico, *.cur. Компилятор ресурсов MASM поддерживает последний случай.

При добавлении некоторого ресурса в файле resource.h, подключаемом к проекту по умолчанию, появляются строки с именами пользовательских констант, значения которых присвоены тем или иным ресурсам:

#define IDI_ICON1                  101

#define IDC_CURSOR1                101

В файле *.rc появляются строки, ставящие в соответствие каждой пользовательской константе ресурса тип ресурса и файл с описанием этого ресурса:

IDI_ICON1          ICON               "m.ico"

IDC_CURSOR1        CURSOR             "mouse.cur"

Для использования ресурсов в программе заменяем соответствующие участки кода (вызов функций LoadIcon, LoadCursor при регистрации класса окна):

INVOKE LoadIcon, HINST, 101

MOV WC.hIcon, EAX

INVOKE LoadCursor, HINST, 101

MOV WC.hCursor, EAX

При компановке программы из командной строки компилируется вначале файл ресурсов:

rc.exe myres.rc

а затем полученный файл myres.res подключается к исполняемому модулю:

link.exe /subsystem:windows myfile.obj myres.res

II

Меню. Меню также может быть задано в файле ресурсов. В программе оно определяется по имени (строке). Для обычного окна при регистрации класса следует указать ссылку на меню окна. Описание простейшего меню имеет вид (ФайàВыход)

IDR_MENU1 MENU

BEGIN

POPUP "Файл"

BEGIN

   MENUITEM "Выход", ID_40001

END

END

Каждый пункт меню описывается своей константой в файле resource.h:

#define IDR_MENU1                  101

#define ID_40001                   40001

Для использования меню в программе включаем в регистрацию класса окна указатель меню:

Для обработки выбора одного из элеиментов меню используется отдельная программа обработчика меню. В качестве параметров в функцию обработки меню передаются дескриптор окна и параметр, несущий информацию об активном пункте меню. Для вызова функции меню в оконной функции используется сообщение WM_COMMAND.

Ниже приведен текст программы рисования функции y=sin(t), использующей ресурсы: иконку, курсор, меню.

Файл ресурсов: myres.rc

#define IDC_CURSOR1                101

#define IDI_ICON1                  101

#define IDR_MENU1                  101

#define ID_40001                   40001

 

IDC_CURSOR1        CURSOR             "mouse.cur"

IDI_ICON1          ICON               "icon1.ico"

 

 

IDR_MENU1 MENU

BEGIN

POPUP "Файл"

BEGIN

   MENUITEM "Выход",                  ID_40001

END

END

; текст программы

.586

.MODEL FLAT, stdcall

RGBW        equ 00D4D0C8h; цвет фона в окне

include win.inc

.data

 HWND DD 0; дескриптор главного окна

 HINST DD 0; дескриптор приложения

 TITL    DB "Программа",0

 CLASSNAME DB 'CLASS32',0

 Message  MSG <?>

 WC    WNDCLASS <?>

 

 hdc DD 0; дескриптор контекста окна

 hPen    DD 0; дескриптор пера

 memdc   DD 0; дескриптор совместимого контекста окна

 CPBUT   DB 'Выход',0; надпись на кнопке

 CLSBTN  DB 'BUTTON',0; класс окна "КНОПКА"

 Height_ DD?; высота окна

 Width_  DD?; ширина окна

 rect_   RECT <>

 ps      PAINTSTRUCT <?>

 messX db 'y=sin(t)',0

 mess_len equ $-messX-1

 OffsetX DD 0

 OffsetY DD?

 ScaleX  DD?

 ScaleY  DD?

 X       DD 0

 Y       DD 0

 t       DD 0

 cons    DD 1

 deg_rad DD 180

    

.code

START proc

INVOKE GetModuleHandle, 0; получить дескриптор приложения

MOV HINST, EAX

MOV WC.style, CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS

; процедура обработки сообщений

MOV WC.lpfnWndProc, OFFSET WNDPROC

MOV EAX, HINST

MOV WC.hInstance, EAX

INVOKE LoadIcon, HINST, 101

MOV WC.hIcon, EAX

INVOKE LoadCursor, HINST, 101

MOV WC.hCursor, EAX

INVOKE CreateSolidBrush, RGBW

MOV WC.hbrBackground, EAX

MOV WC.lpszMenuName, 101

MOV WC.lpszClassName, OFFSET CLASSNAME

INVOKE RegisterClass, OFFSET WC

INVOKE CreateWindowEx,; создать окно зарегистрированного класса

0,

    OFFSET CLASSNAME,

    OFFSET TITL,

WS_CAPTION + WS_SYSMENU + WS_THICKFRAME + WS_GROUP + WS_TABSTOP,

    100,; X — координата левого верхнего угла

    100,; Y — координата левого верхнего угла

    400,; DX - ширина окна

    450,; DY — высота окна

    0, 0, HINST,0

CMP EAX, 0   ; проверка на ошибку

JZ END_LOOP

MOV HWND, EAX; дескриптор окна

; --------------------------------------------------

  INVOKE ShowWindow, HWND, SW_SHOWNORMAL; показать созданное окно

INVOKE UpdateWindow, HWND;перерисовать видимую часть окна

; цикл обработки сообщений

MSG_LOOP:

 INVOKE GetMessage,

     OFFSET Message, 0,0,0

CMP EAX, 0

JE END_LOOP

 INVOKE TranslateMessage, OFFSET Message

 INVOKE DispatchMessageA, OFFSET Message

JMP MSG_LOOP

END_LOOP:

; выход из программы (закрыть процесс)

 INVOKE ExitProcess, Message.wParam

 START endp

 

; Процедура обработки элементов меню

MenuProc proc hW:DWORD, wParam:DWORD

push eax

mov eax, wParam

cmp eax, 40001

je MEXIT

jmp MEXIT1

MEXIT:

INVOKE PostQuitMessage, 0

MEXIT1:

pop eax

ret

MenuProc endp

 

; --------------------------------------------------

; процедура окна

; расположение параметров в стеке

; [EBP+014H] LPARAM

; [EBP+10H] WAPARAM

; [EBP+0CH] MES

; [EBP+8] HWND

WNDPROC PROC hW:DWORD, Mes:DWORD, wParam:DWORD, lParam:DWORD

CMP Mes, WM_DESTROY   

JE WMDESTROY

CMP Mes, WM_CREATE

JE WMCREATE

CMP Mes, WM_COMMAND   

JE WMCOMMAND

CMP Mes, WM_PAINT

JE WMPAINT

CMP Mes, WM_SIZE  

JE WMSIZE

JMP DEFWNDPROC

; создание окна

WMCREATE:

WMSIZE:

 INVOKE GetDC, hW

 mov hdc, eax

 INVOKE CreateCompatibleDC, hdc

 mov memdc, eax

 INVOKE GetWindowRect, hW, offset rect_

 mov eax, rect_.bottom

 sub eax, rect_.top

 mov Height_, eax

 mov eax, rect_.right

 sub eax, rect_.left

 mov Width_, eax

 

 INVOKE CreateCompatibleBitmap,

    hdc, Width_, Height_

 INVOKE SelectObject, memdc, eax

 INVOKE CreateSolidBrush, RGBW

 INVOKE SelectObject, memdc, eax

 INVOKE PatBlt, memdc, 0, 0, Width_, Height_, PATCOPY

 INVOKE ReleaseDC, hW, hdc

 

 INVOKE CreatePen, PS_SOLID, 0,0

 mov hPen, eax

 INVOKE SelectObject, memdc, hPen

 mov eax, Height_

 sub eax, 27

 shr eax, 1

 mov OffsetY, eax

 INVOKE MoveToEx, memdc, 0, OffsetY, 0

 INVOKE LineTo, memdc, Width_, OffsetY

 

 INVOKE CreatePen, PS_SOLID, 2, 000000FFh

 mov hPen, eax

 INVOKE SelectObject, memdc, hPen

 INVOKE MoveToEx, memdc, 0, OffsetY, 0

 

 mov eax, 0

 mov t, eax

 mov eax, 8       ; GetSystemMetrics(SM_CXFRAME)*2

 mov cons, eax

 fild Width_

 fisub cons

 fidiv deg_rad

 mov eax, 2

 mov cons, eax

 fidiv cons

 fstp ScaleX

 

 mov eax, 27; GetSystemMetrics(SM_CYFRAME)*2 +

;GetSystemMetrics(SM_CXFRAME)*2

 mov cons, eax

 fild Height_

 fisub cons

 mov eax, 2

 mov cons, eax

 fidiv cons

 fstp ScaleY

 

 mov ecx, 360

L: push ecx

 fild t

 fmul ScaleX

 fiadd OffsetX

 fistp X

 fild t

 fldpi

 fmulp

 fidiv deg_rad

 fsin

 fchs

 fmul ScaleY

 fiadd OffsetY

 fistp Y

 inc t

 INVOKE LineTo, memdc, X, Y

 pop ecx

 loop L

 

 INVOKE InvalidateRect, hW, offset rect_,0

 INVOKE SetBkColor, memdc, RGBW

 

mov eax, mess_len

INVOKE TextOutA,

    memdc,

    10, 20,

    offset messX,

    eax

 

MOV EAX, 0

JMP FINISH

; перерисовка окна

WMPAINT:

INVOKE BeginPaint, hW, offset ps

mov hdc,eax

INVOKE BitBlt, hdc,

    0, 0, Width_, Height_,

    memdc, 0, 0, SRCCOPY

INVOKE EndPaint, hdc, offset ps

MOV EAX, 0

JMP FINISH

; обработка сообщения по умолчанию

DEFWNDPROC:

 INVOKE DefWindowProc,

hW,

    Mes,

    wParam,

    lParam  

JMP FINISH

; обработка событий меню

 WMCOMMAND:

 INVOKE MenuProc, hW, wParam

 mov eax, 0

 jmp FINISH

 

WMDESTROY:

 INVOKE DeleteDC, hPen

 INVOKE DeleteDC, memdc

 INVOKE PostQuitMessage, 0

MOV EAX, 0

FINISH:

 ret

WNDPROC ENDP

END START

 

Диалоговые окна являются наиболее сложными элементами ресурсов. Для диалога не задается идентификатор, обращение к нему происходит по его имени (строке).

#define WS_SYSMENU  0x00080000L

#define WS_MINIMIZEBOX   0x00020000L

#define WS_MAXIMIZEBOX 0x00010000L

DIAL1 DIALOG 0, 0, 240, 120

STYLE WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX

CAPTION "Пример диалогового окна"

FONT 8, "Arial"

{

}

Как видим, определение диалога начинается со строки, содержащей ключевое слово DIALOG. В этой же строке далее указывается положение и размер диалогового окна. Далее идут строки, содержащие другие свойства окна. Наконец идут фигурные скобки. В данном случае они пусты. Это означает, что на окне нет никаких управляющих элементов. Тип окна, а также других элементов определяется константами, которые мы поместили в начале файла. Эти константы стандартны, и для языка Си хранятся в файле RESOURCE.H. Мы все константы будем определять непосредственно в файле ресурсов. Константы определяются согласно нотации языка Си.

Прежде чем разбирать пример, рассмотрим особенности работы с диалоговыми окнами. Диалоговое окно очень похоже на обычное окно. Так же как обычное окно, оно имеет свою процедуру. Процедура диалогового окна имеет те же параметры, что и процедура обычного окна. Сообщений, которые приходят на процедуру диалогового окна, гораздо меньше. Но те, которые у диалогового окна имеются, в основном совпадают с аналогичными сообщениями для обычного окна. Только вместо сообщения WM_CREATE приходит сообщение WM_INITDIALOG, а вместо сообщения WM_DESTROY – WM_CLOSE. Процедура диалогового окна может возвращать либо нулевое, либо ненулевое значение. Ненулевое значение должно возвращаться в том случае, если процедура обрабатывает (берет на себя обработку) данное сообщение, и ноль - если предоставляет обработку системе.

При создании обычного окна все его свойства определяются тремя факторами: свойствами класса, свойствами, определяемыми при создании окна, реакцией процедуры окна на определенные сообщения. При создании диалогового окна все свойства заданы в ресурсах. Часть этих свойств задается, когда при вызове функции создания диалогового окна (DialogBoxParamA) неявно вызывается функция CreateWindow. Остальная же часть свойств определяется поведением внутренней функции, которую создает система при создании диалогового окна. Если с диалоговым окном что-то происходит, то сообщение сначала приходит на внутреннюю процедуру, а затем вызывается процедура диалогового окна, которую мы создаем в программе. Если процедура возвращает 0, то внутренняя процедура продолжает обработку данного сообщения, если же возвращается ненулевое значение, внутренняя процедура не обрабатывает сообщение. 

Функция создания диалогового окна:

INT_PTR DialogBoxParam(        

  HINSTANCE hInstance, // дескриптор приложения

LPCTSTR lpTemplateName, //указатель шаблона диалогового окна

HWND hWndParent, // дескриптор родительского окна

DLGPROC lpDialogFunc, // указатель процедуры обработки

                         // сообщений диалогового окна

LPARAM dwInitParam); // значение lParam, передаваемое

                         // диалоговому окну при создании

 

// файл dial.rc

// определение констант

#define WS_SYSMENU  0x00080000L

#define WS_MINIMIZEBOX 0x00020000L

#define WS_MAXIMIZEBOX 0x00010000L

 

// идентификаторы

#define STR1 1

#define STR2 2

#define IDI_ICON1 3

 

// определили иконку

IDI_ICON1 ICON "icon1.ico"

 

// определение диалогового окна

DIAL1 DIALOG 0, 0, 240, 120

STYLE WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX

CAPTION "Пример диалогового окна"

FONT 8, "Arial"

{

}

 

 

;файл dial.asm

.386P

.MODEL FLAT, stdcall

include win.inc

 

_DATA SEGMENT DWORD PUBLIC USE32 'DATA'

MSG  MSGSTRUCT <?>

HINST DD 0; дескриптор приложения

PA   DB "DIAL1",0

BUF1 DB 40 dup(0)

BUF2 DB 40 dup(0)

_DATA ENDS

 

; сегмент кода

_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'

WNDPROC PROC HWND:DWORD, MES:DWORD, WPARAM:DWORD, LPARAM:DWORD

PUSH EBX

PUSH ESI

PUSH EDI

CMP MES, WM_CLOSE

JNE L1

 INVOKE EndDialog, HWND, 0

JMP FINISH

L1:

CMP MES, WM_INITDIALOG

JNE FINISH

; загрузить иконку

 INVOKE LoadIconA, HINST, 3

; установить иконку

 INVOKE SendMessageA, HWND, WM_SETICON, 0, EAX

FINISH:

POP EDI

POP ESI

POP EBX

MOV EAX, 0

 RET

WNDPROC ENDP

 

START proc

; получить дескриптор приложения

INVOKE GetModuleHandleA, 0

MOV [HINST],EAX

; создать диалоговое окно

 INVOKE DialogBoxParamA, HINST, offset PA, 0, offset WNDPROC, 0

 INVOKE ExitProcess, 0

 START endp

_TEXT ENDS

END START

 

Акселераторы позволяют выбирать пункты меню просто сочетанием клавиш. Таблица акселераторов является ресурсом, имя которого должно совпадать с именем того меню (ресурса), пункты которого она определяет. Например, определяется один акселератор на пункт меню MENUP, имеющий идентификатор 4.

MENUP ACCELERATORS

{

VK_F5, 4, VIRTKEY

}

Общий вид таблицы акселераторов.

 

Имя ACCELERATORS

{

Клавиша 1, Идентификатор пункта меню (1) [,тип] [,параметр]

Клавиша 2, Идентификатор пункта меню (2) [,тип] [,параметр]

Клавиша 3, Идентификатор пункта меню (3) [,тип] [,параметр]

...

Клавиша N, Идентификатор пункта меню (N) [,тип] [,параметр]

}

Клавиша – это либо символ в кавычках, либо код ASCII символа, либо виртуальная клавиша. Если вначале стоит код символа, то тип задается как ASCII. Если используется виртуальная клавиша, то тип определяется как VIRTUAL. Все названия (макроимена) виртуальных клавиш можно найти в include- файлах (windows.h).

Параметр может принимать одно из следующих значений: NOINVERT, ALT, CONTROL, SHIFT. Значение NOINVERT означает, что не подсвечивается выбранный при помощи акселератора пункт меню. Значения ALT, CONTROL, SHIFT означают, что, кроме клавиши, определенной в акселераторе, должна быть нажата одна из управляющих клавиш. Кроме этого, если клавиша определяется в кавычках, то нажатие при этом клавиши CONTROL определяется знаком "^": "^А".

Механизм работы акселераторов. Для того чтобы акселераторы работали, необходимо выполнить два условия:

- Должна быть загружена таблица акселераторов. Для этого используется функция

HACCEL LoadAccelerators(         

HINSTANCE hInstance, // дескриптор приложения

LPCTSTR lpTableName); // таблица акселераторов

- Сообщения, пришедшие от акселератора, следует преобразовать в сообщение WM_COMMAND. Для этого используется функция

int TranslateAccelerator(         

HWND hWnd,         // дескриптор окна

HACCEL hAccTable,  // таблица акселераторов

LPMSG lpMsg);      // указатель на структуру MSG

Функция TranslateAccelerator преобразует сообщения WM_KEYDOWN и WM_SYSKEYDOWN в сообщения WM_COMMAND и WM_SYSCOMMAND соответственно. При этом в старшем слове параметра WPARAM помещается 1, как отличие для акселератора. В младшем слове содержится идентификатор пункта меню. Cообщение WM_SYSCOMMAND генерируется для пунктов системного меню или меню окна.

Функция TranslateAccelerator возвращает ненулевое значение, если было произведено преобразование сообщения акселератора, в противном случае возвращается 0. Необходимо включить вызов этой функции в цикл сообщений.

// файл menu1.rc

// определение констант

#define WS_SYSMENU 0x00080000L

#define WS_MINIMIZEBOX 0x00020000L

#define WS_MAXIMIZEBOX 0x00010000L

#define WS_POPUP 0x80000000L

#define VK_F5  0х74

#define st WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX

 

MENUP MENU

{

POPUP "&Первый пункт"

{

MENUITEM "&Первый",1

MENUITEM "В&торой",2,HELP

MENUITEM "Что-то?",8

}

 

POPUP "&Второй пункт"

{

MENUITEM "Трети&й",3

MENUITEM "Четверт&ый",4

MENUITEM SEPARATOR

POPUP "Еще подмен&ю"

{

MENUITEM "Десятый пунк&т",6

}

}

MENUITEM "Вы&ход",5

}

 

// идентификаторы

#define IDI_ICON1 100

 

// определили иконку

IDI_ICON1 ICON "icon1.ico"

 

// определение диалогового окна

DIAL1 DIALOG 0, 0, 240, 120

STYLE WS_POPUP | st

CAPTION "Пример немодального диалогового окна"

FONT 8, "Arial"

{

}

 

MENUP ACCELERATORS

{

VK_F5, 4, VIRTKEY, ALT

}

 

;файл menu1.asm

.386P

.MODEL FLAT, stdcall

WM_CLOSE  equ 10h

WM_INITDIALOG equ 110h

WM_SETICON equ 80h

WM_COMMAND equ 111h

 

; прототипы внешних процедур

EXTERN ShowWindow@8:NEAR

EXTERN MessageBoxA@16:NEAR

EXTERN ExitProcess@4:NEAR

EXTERN GetModuleHandleA@4:NEAR

EXTERN LoadIconA@8:NEAR

EXTERN LoadMenuA@8:NEAR

EXTERN SendMessageA@16:NEAR

EXTERN SetMenu@8:NEAR

EXTERN LoadAcceleratorsA@8:NEAR

EXTERN TranslateAcceleratorA@12:NEAR

EXTERN GetMessageA@16:NEAR

EXTERN DispatchMessageA@4:NEAR

EXTERN PostQuitMessage@4:NEAR

EXTERN CreateDialogParamA@20:NEAR

EXTERN DestroyWindow@4:NEAR

EXTERN TranslateMessage@4:NEAR

 

MSGSTRUCT STRUC

MSHWND DD?

MSMESSAGE DD?

MSWPARAM DD?

MSLPARAM DD?

MSTIME DD?

MSPT DD?

MSGSTRUCT ENDS

 

; сегмент данных

_DATA SEGMENT DWORD PUBLIC USE32 'DATA'

NEWHWND DD 0

MSG MSGSTRUCT <?>

HINST DD 0; дескриптор приложения

PA  DB "DIAL1",0

PMENU DB "MENUP",0

STR1 DB "Выход из программы",0

STR2 DB "Сообщение",0

STR3 DB "Выбран четвертый", 0

ACC DD?

_DATA ENDS

 

; сегмент кода

_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'

; процедура окна

; расположение параметров в стеке

; [EBP+014Н] LPARAM

; [EBP+10H] WAPARAM

; [EBP+0CH] MES

; [EBP+8] HWND

WNDPROC PROC

PUSH EBP

MOV EBP,ESP

PUSH EBX

PUSH ESI

PUSH EDI

;-------------------------

CMP DWORD PTR [EBP+0CH],WM_CLOSE

JNE L1

; закрыть диалоговое окно

JMP L5

L1:

CMP DWORD PTR [EBP+0CH],WM_INITDIALOG

JNE L3

; загрузить иконку

PUSH 100; идентификатор иконки

PUSH [HINST]; идентификатор процесса

CALL LoadIconA@8

; установить иконку

PUSH EAX

PUSH 0; тип иконки (маленькая)

PUSH WM_SETICON

PUSH DWORD PTR [EBP+08H]

CALL SendMessageA@16

; загрузить меню

PUSH OFFSET PMENU

PUSH [HINST]

CALL LoadMenuA@8

; установить меню

PUSH EAX

PUSH DWORD PTR [EBP+08H]

CALL SetMenu@8

;-----------------------------

MOV EAX, 1; возвратить не нулевое значение

JMP FIN

; проверяем, не случилось ли чего с управляющими

; элементами на диалоговом окне

L3:

CMP DWORD PTR [EBP+0CH],WM_COMMAND

JE L6

JMP FINISH

; здесь определяем идентификатор, в данном случае

; это идентификатор пункта меню сообщение

L6:

CMP WORD PTR [EBP+10H], 4

JNE L4

PUSH 0   ; MB_OK

PUSH OFFSET STR2

PUSH OFFSET STR3

PUSH 0

CALL MessageBoxA@16

JMP FINISH

L4:

CMP WORD PTR [EBP+10H], 5

JNE FINISH

; сообщение

PUSH 0   ; MB_OK

PUSH OFFSET STR2

PUSH OFFSET STR1

PUSH 0

CALL MessageBoxA@16

; закрыть диалоговое немодальное окно

L5:

PUSH DWORD PTR [EBP+08H]

CALL DestroyWindow@4

; послать сообщение для выхода из кольца

; обработки сообщений

PUSH 0

CALL PostQuitMessage@4; сообщение WM_QUIT

FINISH:

MOV EAX, 0

FIN:

   POP EDI

POP ESI

POP EBX

POP EBP

RET 16

WNDPROC ENDP

START proc

; получить дескриптор приложения

PUSH 0

CALL GetModuleHandleA@4

MOV [HINST], EAX

; загрузить акселераторы

PUSH OFFSET PMENU

PUSH [HINST]

  CALL LoadAcceleratorsA@8

MOV ACC, EAX; запомнить дескриптор таблицы

; создать немодальный диалог

PUSH 0

PUSH OFFSET WNDPROC

PUSH 0

PUSH OFFSET PA

PUSH [HINST]

CALL CreateDialogParamA@20

; визуализировать немодальный диалог

MOV NEWHWND, EAX

PUSH 1; SW_SHOWNORMAL

PUSH [NEWHWND]

CALL ShowWindow@8; показать созданное окно

; кольцо обработки сообщений

MSG_LOOP:

PUSH 0

PUSH 0

PUSH 0

PUSH OFFSET MSG

CALL GetMessageA@16

CMP EAX, 0

JE END_LOOP

; транслировать сообщение акселератора

PUSH OFFSET MSG

PUSH [ACC]

PUSH [NEWHWND]

CALL TranslateAcceleratorA@12

CMP EAX,0

JNE MSG_LOOP

PUSH OFFSET MSG

CALL TranslateMessage@4

PUSH OFFSET MSG

CALL DispatchMessageA@4

JMP MSG_LOOP

END_LOOP:

PUSH 0

CALL ExitProcess@4

START endp

 

_TEXT ENDS

END START

 

Приложение 1

Таблица кодов ASCII

Коды управляющих символов

Символ Код Клавиши Значение
nul 0 Ctrl + @ Нуль
soh 1 Ctrl + A Начало заголовка
stx 2 Ctrl + B Начало текста
etx 3 Ctrl + C Конец текста
eot 4 Ctrl + D Конец передачи
enq 5 Ctrl + E Запрос
ack 6 Ctrl + F Подтверждение
bel 7 Ctrl + G Сигнал (звонок)
bs 8 Ctrl + H Забой (шаг назад)
ht 9 Ctrl + I Горизонтальная табуляция
lf 10 Ctrl + J Перевод строки
vt 11 Ctrl + K Вертикальная табуляция
ff 12 Ctrl + L Новая страница
cr 13 Ctrl + M Возврат каретки
so 14 Ctrl + N Выключить сдвиг
si 15 Ctrl + O Включить сдвиг
dle 16 Ctrl + P Ключ связи данных
dc1 17 Ctrl + Q Управление устройством 1
dc2 18 Ctrl + R Управление устройством 2
dc3 19 Ctrl + S Управление устройством 3
dc4 20 Ctrl + T Управление устройством 4
nak 21 Ctrl + U Отрицательное подтверждение
syn 22 Ctrl + V Синхронизация
etb 23 Ctrl + W Конец передаваемого блока
can 24 Ctrl + X Отказ
em 25 Ctrl + Y Конец среды
sub 26 Ctrl + Z Замена
esc 27 Ctrl + [ Ключ
fs 28 Ctrl + \ Разделитель файлов
gs 29 Ctrl + ] Разделитель группы
rs 30 Ctrl + ^ Разделитель записей
us 31 Ctrl + _ Разделитель модулей

 

Базовая таблица кодировки ASCII

32 пробел 48 0 64 @ 80 P 96 ` 112 p
33 ! 49 1 65 A 81 Q 97 a 113 q
34 “ 50 2 66 B 82 R 98 b 114 r
35 # 51 3 67 C 83 S 99 c 115 s
36 $ 52 4 68 D 84 T 100 d 116 t
37 % 53 5 69 E 85 U 101 e 117 u
38 & 54 6 70 F 86 V 102 f 118 v
39 ‘ 55 7 71 G 87 W 103 g 119 w
40 ( 56 8 72 H 88 X 104 h 120 x
41) 57 9 73 I 89 Y 105 i 121 y
42 * 58: 74 J 90 Z 106 j 122 z
43 + 59; 75 K 91 [ 107 k 123 {
44, 60 < 76 L 92 \ 108 l 124 |
45 - 61 = 77 M 93 ] 109 m 125 }
46. 62 > 78 N 94 ^ 110 n 126 ~
47 / 63? 79 O 95 _ 111 o 127

 

Кодовая таблица 1251-MS-Windows

128 Ђ 144 Ђ 160   176 ° 192 А 208 Р 224 а 240 р
129 Ѓ 145 ‘ 161 Ў 177 ± 193 Б 209 С 225 б 241 с
130 ‚ 146 ’ 162 ў 178 I 194 В 210 Т 226 в 242 т
131 ѓ 147 “ 163 J 179 i 195 Г 211 У 227 г 243 у
132 „ 148 ” 164 ¤ 180 ґ 196 Д 212 Ф 228 д 244 ф
133 … 149 • 165 Ґ 181 μ 197 Е 213 Х 229 е 245 х
134 † 150 – 166 ¦ 182 ¶ 198 Ж 214 Ц 230 ж 246 ц
135 ‡ 151 — 167 § 183 · 199 З 215 Ч 231 з 247 ч
136? 152 □ 168 Ё 184 ё 200 И 216 Ш 232 и 248 ш
137 ‰ 153 ™ 169 © 185 № 201 Й 217 Щ 233 й 249 щ
138 Љ 154 љ 170 Є 186 є 202 К 218 Ъ 234 к 250 ъ
139 < 155 > 171 « 187» 203 Л 219 Ы 235 л 251 ы
140 Њ 156 њ 172   188 j 204 М 220 Ь 236 м 252 ь
141 Ќ 157 ќ 173 ­ 189 S 205 Н 221 Э 237 н 253 э
142 Ћ 158 ћ 174 ® 190 s 206 О 222 Ю 238 о 254 ю
143 Џ 159 џ 175 Ï 191 ї 207 П 223 Я 239 п 255 я

 

Кодовая таблица 866-MS-DOS

128 А 144 Р 160 а 176 ░ 192 └ 208 ╨ 224 р 240 ≡Ё
129 Б 145 С 161 б 177 ▒ 193 ┴ 209 ╤ 225 с 241 ±ё
130 В 146 Т 162 в 178 ▓ 194 ┬ 210 ╥ 226 т 242 ≥
131 Г 147 У 163 г 179 │ 195 ├ 211 ╙ 227 у 243 ≤
132 Д 148 Ф 164 д 180 ┤ 196 ─ 212 ╘ 228 ф 244 ⌠
133 Е 149 Х 165 е 181 ╡ 197 ┼ 213 ╒ 229 х 245 ⌡
134 Ж 150 Ц 166 ж 182 ╢ 198 ╞ 214 ╓ 230 ц 246 ¸
135 З 151 Ч 167 з 183 ╖ 199 ╟ 215 ╫ 231 ч 247»
136 И 152 Ш 168 и 184 ╕ 200 ╚ 216 ╪ 232 ш 248 °
137 Й 153 Щ 169 й 185 ╣ 201 ╔ 217 ┘ 233 щ 249 ·
138 К 154 Ъ 170 к 186 ║ 202 ╩ 218 ┌ 234 ъ 250 ∙
139 Л 155 Ы 171 л 187 ╗ 203 ╦ 219 █ 235 ы 251 √
140 М 156 Ь 172 м 188 ╝ 204 ╠ 220 ▄ 236 ь 252 ⁿ
141 Н 157 Э 173 н 189 ╜ 205 ═ 221 ▌ 237 э 253 ²
142 О 158 Ю 174 о 190 ╛ 206 ╬ 222 ▐ 238 ю 254 ■
143 П 159 Я 175 п 191 ┐ 207 ╧ 223 ▀ 239 я 255  

 

 


[1] Текст файл console.inc был приведен ранее, в главе «Консольные приложения Windows»

[2] Размер окна, возвращаемый функцией GetWindowRect, соответствует окну с рамками и строкой заголовка. Для определения поля рисования окна необходимо вычесть из ширины окна 2 толшины рамки (чаще всего 8 пикселей), а из высоты – толщину рамки и толщину строки заголовка (чаще всего 27 пикселей). Более точно толщины окантовки окна можно получить функцией GetSystemMetrics

[3] Файл win.inc см. выше



Поделиться:


Последнее изменение этой страницы: 2020-12-09; просмотров: 108; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.218.70.93 (0.351 с.)