Ресурсы в ОС Windows

Рассмотрение правил вызова функций API. Процесс осуществления регистрации класса окон с помощью функции RegisterClassA. Исследование используемых API-функций и констант. Образование цикла обработки очереди сообщений. Сущность функции GetMessage.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 10.02.2015
Размер файла 471,8 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru

Содержание

Цель работы

Вариант задания

1. Краткие теоретические сведения

1.1 Общие положения о программировании в Windows

1.2 Общие правила вызова функций API

1.3 Структура окна

1.4 Понятие ресурсов в ОС Windows

1.4.1 Иконки

1.4.2 Курсоры

1.4.3 Битовая картинка

1.4.4 Строка

1.4.5 Диалоговое окно

1.4.6 Меню

1.4.7 Акселераторы

2. Описание используемых API-функций и констант

2.1 Используемые константы

2.2 Используемые функции

3. Листинг

4. Результат работы программы

Вывод

Список используемых источников

Цель работы

Изучить основы программирования на 32-битном ассемблере, про помощи которого необходимо разработать программу, демонстрирующую работу с ресурсами в ОС Windows. Изучить понятие ресурса в ОС Windows. Научиться работать с редакторами и трансляторами ресурсов.

Вариант задания

Понятие ресурса. Редакторы и трансляторы ресурсов. Примеры использования ресурсов.

1. Краткие теоретические сведения

1.1 Общие положения о программировании в Windows

Программирование в Windows основывается на использовании функций API (Application Program Interface - интерфейс программного приложения). Их количество достигает двух тысяч. Ваша программа в значительной степени будет состоять из таких вызовов. Все взаимодействие с внешними устройствами и ресурсами операционной системы будет происходить посредством таких функций.

Список функций API и их описание можно брать из файла WIN32.HLP, который поставляется, например, с пакетом Borland C++.

Главным элементом программы в среде Windows является окно. Для каждого окна определяется своя процедура обработки сообщений.

Окно может содержать элементы управления: кнопки, списки, окна редактирования и др. Эти элементы, по сути, также являются окнами, но обладающими особыми свойствами. События, происходящие с этими элементами (и самим окном), приводят к приходу сообщений в процедуру окна.

Операционная система Windows использует линейную адресацию памяти. Другими словами, всю память можно рассматривать как один сегмент. Для программиста на языке ассемблера это означает, что адрес любой ячейки памяти будет определяться содержимым одного 32-битного регистра, например ЕВХ.

Следствием пункта 5 является то, что мы фактически не ограничены в объеме данных, кода или стека (объеме локальных переменных). Сегменты в тексте программы играют теперь другую роль. Они позволяют задать отдельным фрагментам кода (секциям) определенные свойства: запрет на запись, общий доступ и т. д.

Операционная система Windows является многозадачной средой. Каждая задача имеет свое адресное пространство и свою очередь сообщений. Более того, даже в рамках одной программы может быть осуществлена многозадачность - любая процедура может быть запущена как самостоятельная задача.

1.2 Общие правила вызова функций API

Начнем с того, как можно вызвать функции API. Обратимся к файлу помощи и выберем любую функцию API, например, MessageBox:

int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT Type);

Данная функция выводит на экран окно с сообщением и кнопкой (или кнопками) выхода. Смысл параметров:

hWnd - дескриптор окна, в котором будет появляться окно-сообщение

lpText - текст, который будет появляться в окне

lpCaption - текст в заголовке окна

uType - тип окна, в частности можно определить количество кнопок выхода.

Теперь о типах параметров. Все они в действительности 32-битные целые числа:

HWND - 32-битное целое

LPCTSTR - 32-битный указатель на строку

UINT - 32-битное целое

К имени функции необходимо добавлять суффикс "A", кроме того, при использовании MASM необходимо также в конце имени добавить @16. Таким образом, вызов указанной функции будет выглядеть так:

CALL MessageBoxA@16.

Параметры следует предварительно поместить в стек командами PUSH по правилу: слева направо - снизу вверх. Итак, пусть дескриптор окна расположен по адресу HW, строки - по адресам STR1 и STR2, а тип окна-сообщения - это константа. Самый простой тип имеет значение 0 и называется MB_OK. Имеем следующее:

МВ_ОК equ 0

. . . .

STR1 DB "Неверный ввод! ", 0

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

HW DWORD ?

. . . .

PUSH МВ_ОК

PUSH OFFSET STR1

PUSH OFFSET STR2

PUSH HW

CALL MessageBoxA@16

Результат выполнения любой функции - это, как правило, целое число, которое возвращается в регистре ЕАХ.

Аналогичным образом в Ассемблере легко воспроизвести те или иные C-структуры.

Рассмотрим, например, структуру, определяющую системное сообщение:

typedef struct tagMSG // msg

{

HWND hwnd;

UINT message;

WPARAM wParam;

LPARAM lParam;

DWORD time;

POINT pt;

} MSG;

На ассемблере эта структура будет иметь вид:

MSGSTRUCT STRUC

MSHWND DD ?

MSMESSAGE DD ?

MSWPARAM DD ?

MSLPARAM DD ?

MSTIME DD ?

MSPT DD ?

MSGSTRUCT ENDS

1.3 Структура окна

Теперь обратимся к структуре всей программы. Как мы уже отмечали, мы будем рассматривать классическую структуру программы под Windows. В такой программе имеется главное окно, а следовательно, и процедура главного окна. В целом, в коде программы можно выделить следующие разделы:

регистрация класса окон;

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

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

процедура главного окна.

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

1. Регистрация класса окон

Регистрация класса окон осуществляется с помощью функции RegisterClassA, единственным параметром которой является указатель на структуру WNDCLASS, содержащую информацию об окне.

2. Создание окна

На основе зарегистрированного класса с помощью функции CreateWindowExA (или CreateWindowA) можно создать экземпляр окна. Как можно заметить, это весьма напоминает объектную модель программирования.

3. Цикл обработки очереди сообщений

Вот как выглядит этот цикл на языке C:

while (GetMessage (&msg,NULL,0,0))

{

/*Разрешить использование клавиатуры путем трансляции сообщений о виртуальных клавишах в сообщения об алфавитно-цифровых клавишах.*/

TranslateMessage(&msg);

/*Вернуть управление Windows и передать сообщение дальше процедуре окна.*/

DispatchMessage(&msg) ;

}

сообщение константа registerclassa

Функция GetMessage() "отлавливает" очередное сообщение из ряда сообщений данного приложения и помещает его в структуру msg.

Что касается функции TranslateMessage, то ее компетенция касается сообщений WM_KEYDOWN и WM_KEYUP, которые транслируются в WM_CHAR и WM_DEDCHAR, а также WM_SYSKEYDOWN и WM_SYSKEYUP, преобразующиеся в WM_SYSCHAR и WM_SYSDEADCHAR. Смысл трансляции заключается не в замене, а в отправке дополнительных сообщений. Так, например, при нажатии и отпускании алфавитно-цифровой клавиши в окно сначала придет сообщение WM_KEYDOWN, затем WM_KEYUP, а затем уже WM_CHAR.

Как можно видеть, выход из цикла ожиданий имеет место только в том случае, если функция GetMessage возвращает 0. Это происходит только при получении сообщения о выходе (сообщение WM_QUIT). Таким образом, цикл ожидания играет двоякую роль: определенным образом преобразуются сообщения, предназначенные для какого-либо окна, и ожидается сообщение о выходе из программы.

4. Процедура главного окна

Вот прототип функции окна на языке

LRESULT CALLBACK WindowFunc

(

HWND hwnd,

UINT message,

WPARAM wParam,

LPARAM lParam

);

Оставив в стороне тип возвращаемого функцией значения, обратим внимание на передаваемые параметры, которые имеют тип DWORD:

hwnd - идентификатор окна,

message - идентификатор сообщения,

wParam и lParam - параметры, уточняющие смысл сообщения (для каждого сообщения могут играть разные роли или не играть никаких)

А теперь рассмотрим "скелет" этой функции на языке ассемблера.

WNDPROC PROC

PUSH EBP

MOV EBP,ESP ;Теперь EBP указывает на вершину стека.

PUSH EBX

PUSH ESI

PUSH EDI

PUSH DWORD PTR [EBP+14H]; LPARAM (lParam)

PUSH DWORD PTR [EBP+10H]; WPARAM (wParam)

PUSH DWORD PTR [EBP+OCH]; MES (message)

PUSH DWORD PTR [EBP+08H]; HWND (hwnd)

CALL DefWindowProcA@16

POP EDI

POP ESI

POP EBX

POP EBP

RET 16

WNDPROC ENDP

Прокомментируем приведенный фрагмент.

RET 16 - выход с освобождением стека от четырех параметров (16 = 4 х 4).

Доступ к параметрам осуществляется через регистр ЕВР:

DWORD PTR [EBP+14H]; LPARAM (lParam)

DWORD PTR [ЕВР+10Н] ; WPARAM (wParam)

DWORD PTR [EBP+0CH] ; MES (message) - код сообщения

DWORD PTR [EBP+08H] ; HWND (hwnd) - дескриптор окна

Функция DefWindowProc вызывается для тех сообщений, которые не обрабатываются в функции окна. В данном примере, как вы понимаете, никакие из сообщений, приходящих в функцию окна, не обрабатываются.

1.4 Понятие ресурсов в ОС Windows

В операционную систему Windows введено понятие ресурса. Ресурс представляет собой некий визуальный элемент с заданными свойствами, хранящийся в исполняемом файле отдельно от кода и данных, который может отображаться специальными функциями. Использование ресурсов дает две вполне определенные выгоды:

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

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

Описание ресурсов хранится отдельно от программы в текстовом файле с расширением RC и компилируется (получается файл с расширением RES) специальным транслятором ресурсов. В исполняемый файл ресурсы включаются компоновщиком.

Транслятором ресурсов в пакете MASM32 является RC.EXE, в пакете TASM32 - BRCC32.EXE. В данном курсовом использовался пакет MASM32.

Наиболее распространённые ресурсы.

Иконки.

Курсоры.

Битовая картинка.

Строка.

Диалоговое окно.

Меню.

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

1.4.1 Иконки

Могут быть описаны в самом файле ресурсов, либо храниться в отдельном файле *.ico. Рассмотрим последний случай. Вот файл ресурсов resource.rc:

#define IDI_ICON1 100

IDI_ICON1 ICON "ico01.ico"

Файл содержит две значимых строки. Одна строка определяет идентификатор иконки, вторая - ассоциирует идентификатор с файлом "ico01.ico". Оператор define является Си-оператором препроцессора.

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

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

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

CALL LoadIconA

MOV [WC.CLSHICON], EAX

1.4.2 Курсоры

Подход здесь полностью идентичен. Ниже файл ресурсов, где определен и курсор, и иконка.

#define IDI_ICON1 1

#define IDI_CUR1 2

IDI_ICON1 ICON " ico01.ico"

IDI_CUR1 CURSOR "cursor01.cur"

Ниже приведён фрагмент программы, вызывающей иконку и курсор:

; иконка окна

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

PUSH [HINST]

CALL LoadIconA@8

MOV [WC.CLSHICON], EAX

; курсор окна

PUSH 2 ;идентификатор курсора

PUSH [HINST]

CALL LoadCursorA@8

MOV [WC.CLSHCURSOR], EAX

Как и для иконки, программа brcc32.exe обрабатывает определение курсора в тексте файла ресурсов.

1.4.3 Битовые картинки (*.BMP)

Пример файла ресурсов с битовой картинкой.

//битовая картинка

#define IDI_BIT1 500

IDI_BIT1 BITMAP "bit.bmp"

Для загрузки битовой картинки используется API-функция LoadBitmapА, которая имеет два параметра:

идентификатор картинки из файла ресурсов (в нашем случае это значение IDI_BIT1, эквивалентное 500);

дескриптор процесса (приложения).

PUSH 500

PUSH [HINST]

CALL LoadBitmapA

MOV BTM,EAX

1.4.4 Строки

Чтобы задать строку или несколько строк используется ключевое слово STRINGTABLE. Ниже представлен текст ресурса, задающий две строки. Для загрузки строки в программу используется функция LoadString (см. ниже). Строки, задаваемые в файле ресурсов, могут играть роль констант.

#define str1 1001

#define str2 2000

#define str3 3000

#define str4 4000

#define str5 5000

#define str6 6000

#define str7 7000

#define str8 8000

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

STRINGTABLE

{

str1,"ВЫХОД ИЗ ПРОГРАММЫ"

str2,"ВЕРСИЯ 1.СОЗДАТЕЛЬ ПОЛТАНОВА ЕЛЕНА"

str3,"ВЫВОД СООБЩЕНИЯ"

str4,"АКСЕЛЕРАТОРЫ"

str5,"СТРОКИ"

str6,"ДИАЛОГОВЫЕ ОКНА"

str7,"ЭТОТ КУРСОР ЗАГРУЖЕН ИЗ ФАЙЛА РЕСУРСОВ"

str8,"ВЫ УЖЕ ЗАГРУЗИЛИ БИТОВУЮ КАРТИНКУ"

}

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

INVOKE LoadStringA, [HINST],1001,OFFSET BUF1,40 ;загрузитьстроку

INVOKE LoadStringA, [HINST],2000,OFFSET BUF2,40

INVOKE LoadStringA, [HINST],3000,OFFSET BUF3,40

INVOKE LoadStringA, [HINST],4000,OFFSET BUF4,40

INVOKE LoadStringA, [HINST],5000,OFFSET BUF5,40

INVOKE LoadStringA, [HINST],6000,OFFSET BUF6,40

INVOKE LoadStringA, [HINST],7000,OFFSET BUF10,40

INVOKE LoadStringA, [HINST],8000,OFFSET BUF7,40

1.4.5 Диалоговые окна

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

й#define WS_CAPTION 0x00C00000L

#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. Процедура диалогового окна может возвращать либо нулевое, либо ненулевое значение. Ненулевое значение должно возвращаться в том случае, если процедура обрабатывает (берет на себя обработку) данное сообщение, и ноль - если предоставляет обработку системе.

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

1.4.6 Меню

Меню также может быть задано в файле ресурсов. Как и диалоговое окно, в программе оно определяется по имени (строке). Меню можно задать и в обычном окне, и в диалоговом окне.

Для обычного окна при регистрации класса следует просто заменить строку

MOV DWORD PTR [WC.CLMENNAME],0

На

MOV DWORD PTR [WC.CLMENNAME], OFFSET MENS

Здесь MENS - имя, под которым меню располагается в файле ресурсов. Меню на диалоговое окно устанавливается другим способом, который, разумеется, подходит и для обычного окна. В начале меню загружается при помощи функции LoadMenu, а затем устанавливается функцией SetMenu.

INVOKE LoadMenuA,[HINST],OFFSET PMENU;установить меню

INVOKE SetMenu,DWORD PTR [EBP+08H],EAX

Меню в файле ресурсов:

MENUP MENU

{

POPUP "&Иконки и курсоры"

{

MENUITEM SEPARATOR

POPUP "&Иконки "

{

MENUITEM "&Иконка 1 F1",1

MENUITEM "&Иконка 2 F2",2

MENUITEM "&Иконка 3 F3",3

}

MENUITEM "&Курсоры F4",4

}

POPUP "&Еще ресурсы"

{

MENUITEM " &Битовые картинки F7",7

MENUITEM "&Акселераторы F8",8

MENUITEM "&Строки F9",9

MENUITEM "&Диалоговые окна F10",10

}

MENUITEM "&Выход F11",11

}

Пункты меню могут содержать дополнительные параметры, которые определяют дополнительные свойства этих пунктов.

Вот эти свойства, понимаемые компилятором ресурсов:

CHECKED - пункт отмечен "птичкой".

GRAYED - элемент недоступен (имеет серый цвет).

HELP - элемент может быть связан с помощью.

Редакторы ресурсов дополнительно создают ресурс - строку. При этом идентификатор строки совпадает с идентификатором пункта меню.

MENUBARBREAK - для горизонтального пункта это означает, что начиная с него горизонтальные пункты располагаются в новой строке. Для вертикального пункта - то, что начиная с него пункты расположены в новом столбце. При этом проводится разделительная линия.

MENUBREAK - аналогично предыдущему, но разделительная линия не проводится.

INACTIVE - пункт не срабатывает.

SEPARATOR - создает в меню разделитель. При этом идентификатор не ставится.

1.4.7 Акселераторы

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

Это очень удобно и быстро. Таблица акселераторов является ресурсом, имя которого должно совпадать с именем того меню (ресурса), пункты которого она определяет.

Вот пример такой таблицы. Определяется один акселератор на пункт меню MENUP, имеющий идентификаторы.

#define VK_F1 0x70

#define VK_F2 0x71

#define VK_F3 0x72

#define VK_F4 0x73

#define VK_F5 0x74

#define VK_F6 0x75

#define VK_F7 0x76

MENUP ACCELERATORS

{

VK_F1, 1, VIRTKEY

VK_F2, 2, VIRTKEY

VK_F3, 3, VIRTKEY

VK_F4, 4, VIRTKEY

VK_F5, 5, VIRTKEY

VK_F6, 6, VIRTKEY

VK_F7, 7, VIRTKEY

}

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

Имя ACCELERATORS

{

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

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

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

...

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

}

Клавиша - это либо символ в кавычках, либо код ASCII символа, либо виртуальная клавиша. Если вначале стоит код символа, то тип задается как ASCII. Если используется виртуальная клавиша, то тип определяется как VIRTUAL.

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

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

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

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

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

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

MSG_LOOP:

INVOKE GetMessageA,OFFSET MSG,0,0,0

CMP EAX, 0

JE END_LOOP

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

INVOKE TranslateAcceleratorA,[NEWHWND], [ACC], OFFSET MSG

CMP EAX,0

JNE MSG_LOOP

INVOKE TranslateMessage,OFFSET MSG

INVOKE DispatchMessageA,OFFSET MSG

JMP MSG_LOOP

END_LOOP:

Функция TranslateAccelerator. Первым параметром этой функции идет дескриптор приложения, вторым параметром идет дескриптор таблицы акселераторов, получаемый при загрузке таблицы с помощью функции LoadAccelerators. Третий параметр - адрес, где содержится сообщение, полученное функцией GetMessage. [1]

2. Описание используемых API-функций и констант

2.1 Используемые константы

Сообщение WM_CLOSE

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

Сообщение WM_INITDIALOG

Сообщение WM_INITDIALOG отправляется процедуре диалогового окна непосредственно перед показом на экране диалогового окна. Процедуры диалогового окна обычно используют это сообщение, чтобы инициализировать органы управления и выполнить какие-либо другие задачи инициализации, которые влияют на внешний вид блока диалога

Сообщение WM_COMMAND

Сообщение WM_COMMAND отправляется тогда, когда пользователь выбирает командный пункт из меню, когда орган управления отправляет уведомительное сообщение своему родительскому окну, или когда транслируется нажатие клавиши - ускорителя.

Сообщение WM_SETICON

Прикладная программа отправляет сообщение WM_SETICON, чтобы сопоставить новую большую или маленькую пиктограмму с окном. Система показывает на экране большую пиктограмму в диалоговом окне ALT+TAB, а маленькую пиктограмму в области заголовка окна.

Сообщение WM_SETCURSOR

Сообщение WM_SETCURSOR посылается окну, если мышь вынуждает курсор двигаться внутри окна, а ввод данных от мыши не перехватывается.

2.2 Используемые функции

Функция ShowWindow

Функция ShowWindow устанавливает состояние показа определяемого окна.

BOOL ShowWindow

(

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

int nCmdShow // состояние показа окна

);

hWnd - Идентифицирует окно

nCmdShow - Определяет, как окно должно быть показано. Этот параметр первоначально игнорируется, когда прикладная программа вызывает ShowWindow, если программа, которая запустила прикладную программу, обеспечивает структуру STARTUPINFO. Иначе, при первом вызове функции ShowWindow, это значение должно быть значением, полученным функцией WinMain в ее параметре nCmdShow. В последующих обращениях, этот параметр может быть одним из следующих значений:

Таблица 1 Значения параметра nCmdShow

SW_HIDE

Скрывает окно и активизирует другое окно

SW_MAXIMIZE

Развертывает определяемое окно

SW_MINIMIZE

Свертывает определяемое окно и активизирует следующее окно верхнего уровня в Z-последовательности

SW_RESTORE

Активизирует и отображает окно. Если окно свернуто или развернуто, Windows восстанавливает в его первоначальных размерах и позиции. Прикладная программа должна установить этот флажок при восстановлении свернутого окна

SW_SHOW

Активизирует окно и отображает его текущие размеры и позицию

SW_SHOWDEFAULT

Устанавливает состояние показа, основанное на флажке SW_, определенном в структуре STARTUPINFO, переданной в функцию CreateProcess программой, которая запустила прикладную программу

SW_SHOWMAXIMIZED

Активизирует окно и отображает его как развернутое окно

SW_SHOWMINIMIZED

Активизирует окно и отображает его как свернутое окно

SW_SHOWMINNOACTIVE

Отображает окно как свернутое окно. Активное окно остается активным

SW_SHOWNA

Отображает окно в его текущем состоянии. Активное окно остается активным

SW_SHOWNOACTIVATE

Отображает окно в его самом современном размере и позиции. Активное окно остается активным

SW_SHOWNORMAL

Активизирует и отображает окно. Если окно свернуто или развернуто, Windows восстанавливает его в первоначальном размере и позиции. Прикладная программа должна установить этот флажок при отображении окна впервые

Если функция завершилась успешно, возвращается значение отличное от нуля. Если функция потерпела неудачу, возвращаемое значение - ноль.

Функция MessageBox

Функция MessageBox создает, показывает на экране и использует окно сообщения. Окно сообщения содержит определяемое программой сообщение и заголовок, плюс любая комбинация предопределенных значков и командных кнопок.

int MessageBox

(

HWND hWnd,

LPCTSTR lpText,

LPCTSTR lpCaption,

UINT uType

);

hWnd - Дескриптор окна владельца, которое создает окно сообщения. Если этот параметр - ПУСТО (NULL), окно сообщения не имеет окна владельца.

lpText - Указатель на символьную строку с нулем в конце, которая содержит сообщение показываемое на экране.

lpCaption - Указатель на символьную строку с нулем в конце, которая содержит заголовок диалогового окна (окна сообщения). Если этот параметр - NULL, используется заданный по умолчанию заголовок Error.

uType - Устанавливает содержание и режим работы диалогового окна. Этим параметром может быть комбинация флажков из ниже перечисленных групп флажков. Чтобы обозначить кнопки, показываемые на экране в окне сообщения, задаётся одно из ниже перечисленных значений.

Таблица 2 Возможные значения параметра uType

MB_ABORTRETRYIGNORE

Окно сообщения содержит три командных кнопки: Прекратить (Abort), Поторить (Retry) и Пропустить (Ignore).

MB_CANCELTRYCONTINUE

Microsoft® Windows® 2000/XP: Окно сообщения содержит три командных кнопки: Отменить (Cancel), Попытаться снова (Try Again), Продолжить (Continue). Используйте этот тип окна сообщения вместо типа MB_ABORTRETRYIGNORE.

MB_HELP

Windows 95/98/Me, Windows NT® 4.0 и выше: Добавляет в окно сообщения кнопку Справка (Help). Когда пользователь щелкает по кнопке Справка (Help) или нажимает клавишу F1, система отправляет владельцу сообщение WM_HELP.

MB_OK

Окно сообщения содержит одну командную кнопку: OK. Это - значение по умолчанию.

MB_OKCANCEL

Окно сообщения содержит две командных кнопки: OK и Отменить (Cancel).

MB_RETRYCANCEL

Окно сообщения содержит две командных кнопки: Поторить (Retry) иОтменить (Cancel).

MB_YESNO

Окно сообщения содержит две командных кнопки: Да (Yes) и Нет (No).

MB_YESNOCANCEL

Окно сообщения содержит три командных кнопки: Да (Yes), Нет (No) иОтменить (Cancel).

Если окно сообщения имеет кнопку Отменить (Cancel), то функция возвращает значение IDCANCEL, если или обрабатывается клавиша ESC, или выбрана кнопка Отменить (Cancel). Если окно сообщения не имеет кнопки Отменить (Cancel), нажатия ESC не имеет никакого действия.

Если функция завершается ошибкой, возвращаемое значение равняется нулю. Если функция завершается успешно, возвращаемое значение - одно из ниже перечисленных значений пункта меню.

Таблица 3 Возвращаемые значения

IDABORT

Была выбрана кнопка Прекратить (Abort).

IDCANCEL

Была выбрана кнопка Отменить (Cancel).

IDCONTINUE

Была выбрана кнопка Продолжить (Continue).

IDIGNORE

Была выбрана кнопка Пропустить (Ignore).

IDNO

Была выбрана кнопка Нет (No).

IDOK

Была выбрана кнопка OK.

IDRETRY

Была выбрана кнопка Поторить (Retry).

IDTRYAGAIN

Была выбрана кнопка Попытаться снова (Try Again).

IDYES

Была выбрана кнопка Да (Yes).

Функция ExitProcess

Есть две функций прекращения выполнения процесса TerminateProcess и ExitProcess. Функция TerminateProcess прекращает процесс с стороны, а функция ExitProcess прекращает из нутри. Использовать TerminateProcess не являеться хорошим стилем так как при вызове и выполнении этой функции не освобождаться связанные DLL и ресурсы.

VOID ExitProcess

(

UINT uExitCode // код возврата

);

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

Функция LoadIcon

Этa функция позволяет загрузить иконку из ресурсов.

HICON LoadIcon

(

HINSTANCE hInstance, // указатель на приложение

LPCTSTR lpIconName // идентификатор

);

Если функция завершится неудачно, то вернется значение NULL. Эта функция вернет указатель на икону в том случае, если ее параметры совпадают с параметрами установленными в SM_CXICON и SM_CYICON, которые можно получить функцией GetSystemMetric.

Функция LoadMenu

Функция LoadMenu загружает заданный ресурс меню из исполняемого (.exe) файла программы, связанного с экземпляром приложения.

HMENU LoadMenu

(

HINSTANCE hInstance,

LPCTSTR lpMenuName

);

hInstance - Дескриптор модуля, содержащего ресурс меню, который будет загружен.

lpMenuName - Указатель на символьную строку с нулем в конце, которая содержит имя ресурса меню. Или же, этот параметр может состоять из идентификатора ресурса в младшем слове и нулей в старшем слове. Чтобы создать это значение, используйте макрокоманду MAKEINTRESOURCE.

Если функция завершается успешно, возвращаемое значение - дескриптор ресурса меню. Если функция завершается ошибкой, возвращаемое значение - NULL.

Функция SendMessage

Функция SendMessage отправляет заданное сообщение окну или окнам. Функция вызывает оконную процедуру для заданного окна и не возвращает значение до тех пор, пока оконная процедура не обработает сообщение. Чтобы отправить сообщение и возвратить немедленно значение, используются функции SendMessageCallback или SendNotifyMessage. Чтобы поместить сообщение в очередь сообщений потока и возвратить немедленно значение, используются функции PostMessage илиPostThreadMessage.

LRESULT SendMessage

(

HWND hWnd,

UINT Msg,

WPARAM wParam,

LPARAM lParam

);

hWnd - Дескриптор окна, оконная процедура которого примет сообщение. Если этот параметр - HWND_BROADCAST, сообщение отправляется всем окнам верхнего уровня в системе, включая заблокированные или невидимые, не имеющие владельца, перекрывающие и выскакивающие окна; но сообщение не отправляется дочерним окнам.

Msg - Определяет сообщение, которое будет отправлено.

wParam - Определяет дополнительную конкретизирующую сообщение информацию.

lParam - Определяет дополнительную конкретизирующую сообщение информацию.

Величина возвращаемого значения определяет результат обработки сообщения; он зависит от отправленного сообщения.

Функция SetMenu

Функция SetMenu назначает новое меню для заданного окна.

BOOL SetMenu

(

HWND hWnd,

HMENU hMenu

);

hWnd - Дескриптор окна, к которому назначается меню.

hMenu - Дескриптор нового меню. Если этот параметр имеет значение NULL, текущее меню окна удаляется.

Если функция завершается успешно, величина возвращаемого значения - не нуль.Если функция завершается ошибкой, величина возвращаемого значения - нуль.

Функция LoadAccelerators

Функция LoadAccelerators загружает заданную таблицу клавиш-ускорителей.

HACCEL LoadAccelerators

(

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

LPCTSTR lpTableName // адрес строки с названием таблицы

);

hInstance - Идентифицирует экземпляр модуля, чей исполняемый файл содержит таблицу клавиш-ускорителей для загрузки.

lpTableName - Указывает на строку с символом нуля в конце, которая именует таблицу клавиш-ускорителей для загрузки. Альтернативно, этот параметр может определять, что идентификатор ресурса таблицы клавиш-ускорителей в младшем слове и нуль в старшем слове. Может быть использована макрокоманда MAKEINTRESOURCE, чтобы создать это значение.

Если функция завершается успешно, величина возвращаемого значения - дескриптор загруженной таблицы клавиш-ускорителей. Если функция не выполняет задачу, величина возвращаемого значения - NULL.

Функция TranslateAccelerator

Функция TranslateAccelerator обрабатывает клавиши - ускорители для команд меню. Функция транслирует сообщение WM_KEYDOWN или WM_SYSKEYDOWN в сообщение WM_COMMAND или WM_SYSCOMMAND (если имеется элемент для клавиши в заданной таблице клавиш-ускорителей), а затем передает сообщение WM_COMMAND или WM_SYSCOMMAND непосредственно соответствующей оконной процедуре. TranslateAccelerator не возвращает значения до тех пор, пока оконная процедура не обработает сообщение.

int TranslateAccelerator

(

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

HACCEL hAccTable, // дескриптор таблицы клавиш-ускорителей

LPMSG lpMsg // адрес структуры с сообщением

);

hWnd - Идентифицирует окно, сообщения которого должны быть оттранслированы.

hAccTable - Идентифицирует таблицу клавиш-ускорителей. Таблица должна быть загружена при помощи вызова функции LoadAccelerators или создана вызовом функции CreateAcceleratorTable.

lpMsg - Указывает на структуру MSG, которая содержит информацию сообщения, извлеченного из очереди сообщений вызывающего потока при помощи использования функции GetMessage или PeekMessage.

Если функция завершается успешно, величина возвращаемого значения - TRUE. Если функция не выполняет задачу, величина возвращаемого значения - FALSE.

Функция GetMessage

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

В отличие от GetMessage, функция PeekMessage не ждет, когда предыдущее помещенное в очередь сообщение возвратит значение.

BOOL GetMessage

(

LPMSG lpMsg,

HWND hWnd,

UINT wMsgFilterMin,

UINT wMsgFilterMax

);

lpMsg - Указатель на структуру MSG, которая принимает информацию из очереди сообщений потока.

hWnd - Дескриптор окна, чьи сообщения должны быть извлечены. Окно должно принадлежать вызывающему потоку. Если hWnd имеет занчение NULL, GetMessage извлекает сообщения для любого окна, которое принадлежит вызывающему потоку и сообщения потока, помещенные в очередь вызывающего потока при помощи использования функции PostThreadMessage.

wMsgFilterMin - Определяет целочисленную величину самого маленького значения сообщения, которое будет извлечено. Чтобы задать первое сообщение клавиатуры используется сообщение WM_KEYFIRST, а чтобы задать первое сообщение мыши WM_MOUSEFIRST.

wMsgFilterMax - Определяет целочисленную величину самого большого значения сообщения, которое будет извлечено.

Используется сообщение WM_KEYLAST, чтобы задать первое сообщение клавиатуры или WM_MOUSELAST, чтобы задать последнее сообщение мыши.

Если wMsgFilterMin и wMsgFilterMax являются оба нулевыми, функция GetMessage возвращает все доступные сообщения (то есть никакой фильтрации в диапазоне значений не выполняется).

Если функция извлекает какое-то сообщение, а не WM_QUIT, величина возвращаемого значения - не нуль. Если функция извлекает сообщение WM_QUIT, величина возвращаемого значения - нуль.

Если имеется ошибка, величина возвращаемого значения -1 (минус 1). Например, функция завершается ошибкой, если hWnd - недопустимый дескриптор окна или lpMsg - недопустимый указатель. Чтобы получить дополнительные сведения об ошибке, вызовите функцию GetLastError.

Функция DispatchMessage

Функция DispatchMessage распределяет сообщение оконной процедуре. Обычно она используется, чтобы доставить сообщение, извлеченное функцией GetMessage.

LRESULT DispatchMessage

(

const MSG* lpmsg

);

lpmsg - Указатель на структуру MSG, которая содержит сообщение.

Величина возвращаемого значения определяется значением, которое возвращает оконная процедура. Несмотря на то, что это значение зависит от отправляемого сообщения, возвращаемое значение, как правило, игнорируется.

Функция PostQuitMessage

Функция PostQuitMessage указывает системе, что поток сделал запрос на то, чтобы завершить свою работу (выйти). Это обычно используется в ответ на сообщение WM_DESTROY.

void PostQuitMessage

(

int nExitCode

);

nExitCode - Определяет код завершения прикладной программы. Это значение используется как параметр wParam сообщения WM_QUIT.

Возвращаемых значений нет.

Функция CreateDialogParam

Функция CreateDialogParam создает немодальное диалоговое окно из шаблона ресурса блока диалога. Перед показом диалогового окна на экране, функция передает в процедуру блока диалога определяемое программой значение сообщения WM_INITDIALOG, как параметр lParam. Прикладная программа может использовать это значение, чтобы инициализировать органы управления диалогового окна.

HWND CreateDialogParam

(

HINSTANCE hInstance,

LPCTSTR lpTemplateName,

HWND hWndParent,

DLGPROC lpDialogFunc,

LPARAM dwInitParam

);

hInstance - Дескриптор модуля, исполняемый файл которого содержит шаблон диалогового окна.

lpTemplateName - Определяет шаблон диалогового окна. Этот параметр - или указатель на строку символов с нуль-терминатором в конце, которая определяет имя шаблона диалогового окна, или целочисленное значение, которое определяет идентификатор ресурса шаблона блока диалога. Если параметр определяет идентификатор ресурса, его старшее слово должно быть нуль, а младшее слово должно содержать идентификатор. Вы можете использовать макрокоманду MAKEINTRESOURCE, чтобы создать это значение.

hWndParent - Дескриптор окна, которое владеет диалоговым окном.

lpDialogFunc - Указатель на процедуру диалогового окна. Дополнительную информацию о процедуре диалогового окна, см. в описании DialogProc.

dwInitParam - Устанавливает значение, передаваемое процедуре диалогового окна в параметре lParam сообщения WM_INITDIALOG.

Если функция завершается успешно, возвращаемое значение - дескриптор диалогового окна. Если функция завершается ошибкой, возвращаемое значение - NULL.

Функция DestroyWindow

Функция DestroyWindow уничтожает определенное окно. Функция посылает сообщения WM_DESTROY и WM_NCDESTROY окну, чтобы дезактивировать его и удалить фокус клавиатуры из него. Функция также уничтожает меню окна, очищает очередь потоков сообщений, уничтожает таймеры, удаляет монопольное использование буфера обмена и разрывает цепочку просмотра окон буфера обмена (если окно имеет наверху цепочку просмотров). Если определенное окно - родитель или владелец окон, DestroyWindow автоматически уничтожает связанные дочерние или находящиеся в собственности окна, когда она уничтожает окно владельца или родителя. Функция сначала уничтожает дочерние или находящиеся в собственности окна, и затем она уничтожает окно владельца или родителя. DestroyWindow также уничтожает немодальные диалоговые окна, созданные функциейCreateDialog.

BOOL DestroyWindow

(

HWND hWnd // дескриптор для разрушения окна

);

hWnd - Идентификатор окна, которое будет разрушено.

Если функция завершается успешно, возвращаемое значение отлично от нуля. Если функция не выполняет задачу, возвращаемое значение нулевое.

Функция TranslateMessage

Функция TranslateMessage переводит сообщения виртуальных клавиш в символьные сообщения. Символьные сообщения помещаются в очереди сообщений вызывающего потока для прочтения в следующий раз, когда поток вызовет функцию GetMessage или PeekMessage.

BOOL TranslateMessage

(

const MSG* lpMsg

);

lpMsg - Указатель на структуру MSG, которая содержит информацию о сообщении извлеченную из очереди сообщений вызывающего потока при помощи использования функции GetMessage или PeekMessage.

Если сообщение переведено (то есть символьное сообщение помещено в очереди сообщений потока), величина возвращаемого значения не нуль.

Если сообщение является WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN или WM_SYSKEYUP, величина возвращаемого значения - не ноль, независимо от результата перевода.

Если сообщение не переведено (то есть символьное сообщение не помещено в очереди сообщений потока), величина возвращаемого значения - нуль.

Функция LoadCursor

Функция LoadCursor загружает заданный ресурс курсора из исполняемого (.EXE) файла, связанного с экземпляром прикладной программы.

HCURSOR LoadCursor

(

HINSTANCE hInstance,

LPCTSTR lpCursorName

);

hInstance - Дескриптор экземпляра модуля, исполняемый файл которого содержит загружаемый курсор.

lpCursorName - Указатель на строку с символом нуля в конце, содержащую имя ресурса загружаемого курсора. Или же, этот параметр может состоять из идентификатора ресурса, в младшем слове и нулей в старшем слове. Может также использоваться макрокоманда MAKEINTRESOURCE, чтобы создать это значение.

Чтобы использовать предопределенный курсор, прикладная программа должна установить параметр hInstance в значение NULL, а параметр lpCursorName в одно из следующих значений:

Таблица 4 Значения lpCursorName

Значение

Предназначение

IDC_APPSTARTING

Стандартная стрелка и маленькие песочные часы.

IDC_ARROW

Стандартная стрелка.

IDC_CROSS

Перекрестие.

IDC_HAND

Windows 98/Me, Windows 2000/XP: Рука.

IDC_HELP

Стрелка и вопросительный знак.

IDC_IBEAM

Балочный указатель (в форме двутавровой балки)

IDC_ICON

Устаревшее для приложений, помеченных как версия 4.0 или выше.

IDC_NO

Перечеркнутый круг.

IDC_SIZE

Устаревшее для приложений, помеченных как версия 4.0 или выше. ИспользуетсяIDC_SIZEALL.

IDC_SIZEALL

Четырехконечная стрелка, указывающая север, юг, восток и запад.

IDC_SIZENESW

Двухконечная стрелка, указывающая северо-восток и юго-запад.

IDC_SIZENS

Двухконечная стрелка, указывающая север и юг.

IDC_SIZENWSE

Двухконечная стрелка, указывающая северо-запад и юго-восток.

IDC_SIZEWE

Двухконечная стрелка, указывающая запад и восток.

IDC_UPARROW

Вертикальная стрелка.

IDC_WAIT

Песочные часы.

Если функция завершается успешно, возвращаемое значение - дескриптор недавно загруженного курсора. Если функция завершается ошибкой, возвращаемое значение - NULL. [3],[4]

3. Листинг

Файл Program.inc:

; константы

; сообщение приходит при закрытии окна

WM_CLOSE equ 10h

WM_INITDIALOG equ 110h

WM_SETICON equ 80h

WM_COMMAND equ 111h

WM_SETCURSOR equ 20h

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

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

EXTERN LoadCursorA@8:NEAR

; структуры

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

MSGSTRUCT STRUC

MSHWND DD ?

MSMESSAGE DD ?

MSWPARAM DD ?

MSLPARAM DD ?

MSTIME DD ?

MSPT DD ?

MSGSTRUCT ENDS

Файл resource.rc:

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

#define WS_SYSMENU 0x00080000L

#define WS_MINIMIZEBOX 0x00020000L

#define WS_MAXIMIZEBOX 0x00010000L

#define WS_POPUP 0x80000000L

#define VK_F1 0x70

#define VK_F2 0x71

#define VK_F3 0x72

#define VK_F4 0x73

#define VK_F5 0x74

#define VK_F6 0x75

#define VK_F7 0x76

#define VK_F8 0x77

#define st WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX

MENUP MENU

{

POPUP "&Первая группа ресурсов"

{

MENUITEM "&1) Иконки", 1

MENUITEM SEPARATOR

MENUITEM "&2) Курсоры", 2

MENUITEM SEPARATOR

MENUITEM "&3) Битовые картинки",3

MENUITEM SEPARATOR

MENUITEM "&4) Строки",4

MENUITEM SEPARATOR

MENUITEM "&5) Диалоговые окна",5

MENUITEM SEPARATOR

}

POPUP "&Вторая группа ресурсов"

{

MENUITEM "&1) Меню",6

MENUITEM SEPARATOR

MENUITEM "&2) Акселераторы",7

MENUITEM SEPARATOR

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

{

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

}

}

MENUITEM "&Выход",10

}

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

#define IDI_ICON1 1

#define IDI_CUR1 2

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

IDI_ICON1 ICON "my_icon.ico"

IDI_CUR1 CURSOR "my_arrow.cur"

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

DIAL1 DIALOG 100, 100, 340, 220

STYLE WS_POPUP | st

CAPTION "Пример Курсовой работы по Операционным системам"

FONT 14, "TimesNewRoman"

{}

MENUP ACCELERATORS

{

VK_F1, 1, VIRTKEY, ALT

VK_F2, 2, VIRTKEY, ALT

VK_F3, 3, VIRTKEY, ALT

VK_F4, 4, VIRTKEY, ALT

VK_F5, 5, VIRTKEY, ALT

VK_F6, 6, VIRTKEY, ALT

VK_F7, 7, VIRTKEY, ALT

}

Файл Program.asm:

.386P

; плоская модель

.MODEL FLAT, stdcall

include menu1.inc

; директивы компоновщику для подключения библиотек

includelib user32.lib

includelib kernel32.lib

IDC_CROSS equ 32515

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

_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

STR11 DB "Иконка (от англ. icon) -- элемент графического интерфейса, небольшая картинка, представляющая приложение, файл, каталог, окно, компонент операционной системы, устройство", 0

STR12 DB "Курсор (указатель мыши) (англ. cursor -- указатель, стрелка прибора) -- экранная пометка, показывающая место на экране, где появится следующий символ ", 0

STR13 DB "BMP (от англ. Bitmap Picture) -- формат хранения растровых изображений, разработанный компанией Microsoft. Кроме этого, структуры из этого формата используются некоторыми WinAPI-функциями подсистемы GDI. ", 0

STR14 DB " Строковый тип (англ. string «нить, вереница») -- тип данных, значениями которого является произвольная последовательность (строка) символов алфавита. ", 0

STR15 DB "Диалоговое окно (англ. dialog box) -- в графическом пользовательском интерфейсе специальный элемент интерфейса, окно, предназначенное для вывода информации и (или) получения ответа от пользователя. ", 0

STR21 DB "Меню системы. Оно является центральной отправной точкой для запуска программ, а также открытия недавних документов и доступа к свойствам системы", 0

STR22 DB "Клавиатурный акселератор - это функциональная клавиша или последовательность клавиш, которые оператор может нажимать для исполнения команды элемента меню. ", 0

ACC DWORD ?

_DATA ENDS

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

_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'

START:

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

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

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

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

; [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 1 ; идентификатор иконки

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

CALL LoadIconA@8

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

PUSH EAX

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

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], 1

JNE L7

PUSH 0 ; MB_OK

PUSH OFFSET STR2

PUSH OFFSET STR11

PUSH 0

CALL MessageBoxA@16

JMP FINISH

L7:

CMP WORD PTR [EBP+10H], 2

JNE L8

PUSH 0 ; MB_OK

PUSH OFFSET STR2

PUSH OFFSET STR12

PUSH 0

CALL MessageBoxA@16

JMP FINISH

L8:

CMP WORD PTR [EBP+10H], 3

JNE L9

PUSH 0 ; MB_OK

PUSH OFFSET STR2

PUSH OFFSET STR13

PUSH 0

CALL MessageBoxA@16

JMP FINISH

L9:

CMP WORD PTR [EBP+10H], 4

JNE L10

PUSH 0 ; MB_OK

PUSH OFFSET STR2

PUSH OFFSET STR14

PUSH 0

CALL MessageBoxA@16

JMP FINISH

L10:

CMP WORD PTR [EBP+10H], 5

JNE L21

PUSH 0 ; MB_OK

PUSH OFFSET STR2

PUSH OFFSET STR15

PUSH 0

CALL MessageBoxA@16

JMP FINISH

L21:

CMP WORD PTR [EBP+10H], 6

JNE L22

PUSH 0 ; MB_OK

PUSH OFFSET STR2

PUSH OFFSET STR21

PUSH 0

CALL MessageBoxA@16

JMP FINISH

L22:

CMP WORD PTR [EBP+10H], 7

JNE L4

PUSH 0 ; MB_OK

PUSH OFFSET STR2

PUSH OFFSET STR22

PUSH 0

CALL MessageBoxA@16

JMP FINISH

L4:

CMP WORD PTR [EBP+10H], 10

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

_TEXT ENDS

END START

Файл Program.bat:

ml /c /Cp /Gz /coff /nologo %Program.asm

rc %resource.rc

link /subsystem:windows % Program.obj resource.RES

pause

4. Результат работы программы

Рис. 1 Результат работы программы

Рис. 2 Результат работы программы

Вывод

В ходе выполнения курсовой работы самостоятельно были изучены основы программирования на 32-битном ассемблере. Составлена программа на языке ассемблера для 32 разрядных микропроцессоров семейства Intel, демонстрирующая применение макросредств в ассемблере.

Список литературы

1. Пирогов Владислав Юрьевич. Ассемблер для Windows. -- М.: Издатель Молгачева С.В., 2002. --552 с., ил.

2. Методические указания для выполнения курсовой работы «Изучение операционной системы Windows» по курсу «Операционные системы» для студентов специальности 23.01.00 «Вычислительные машины, комплексы, системы и сети»

3. MSDN - Windows API по-русски [Электронный ресурс ]. - URL:

http://www.vsokovikov.narod.ru/New_MSDN_API/index_msdn.htm

4. Win 32 API по шагам [Электронный ресурс ]. - URL:

http://www.firststeps.ru/mfc/winapi/win/

5. Основы программирования на ассемблере. 32-битное программирование

[Электронный ресурс ]. - URL: http://it.kgsu.ru/Asm_32/as32og.html

Размещено на Allbest.ru


Подобные документы

  • График функции. Дескриптор окна консоли. Процедура обработки сообщений. Регестрация класса окна с помощью функции RegisterClass. Обработчик сообщений по умолчанию. Текст программы. Процедура WNDProc. Главная функция. Управление вызывающей функции.

    практическая работа [311,0 K], добавлен 11.10.2008

  • Описание функций, использующихся в программах. Основы 32-битного программирования на языке Assembler для ОС WINDOWS. Использование функции invoke, которая позволяет намного сократить текст программы и делает приложения похожими на программы для "ЯВы".

    курсовая работа [252,6 K], добавлен 20.02.2015

  • Программирование в операционной системе Windows. Работа с потоками и процессами ОС. Методы их создания. Основы вызова API-функций. Пример создания диалогового окна без использования файла ресурсов. Разработка программы с помощью 32-битного ассемблера.

    курсовая работа [107,6 K], добавлен 18.05.2014

  • Рассмотрение правил создания, открытия и закрытия собственного ключа реестра. Описание функций, выполняющих процедуры сохранения произведенного изменения, добавления или удаления данных из ключей. Осуществление выборки информации из системного реестра.

    реферат [24,5 K], добавлен 03.10.2010

  • Основы программирования на 32-битном Ассемблере, разработка с его помощью программы, демонстрирующей работу одного из разделов ОС Windоws. Описание используемых АРI-функций как интерфейса программирования приложений. Листинг программы, результаты работы.

    курсовая работа [164,5 K], добавлен 18.05.2014

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

    курсовая работа [254,3 K], добавлен 20.05.2013

  • Понятия шаблонов функции и класса, правила описания на языке С++. Разработка и отлаживание в среде программирования программ, содержащих шаблоны функций и классов. Шаблон функции square, возвращающей квадрат переменной. Создание шаблона класса массива.

    лабораторная работа [162,6 K], добавлен 25.05.2013

  • Описание использованного набора макросредств. Список использованных констант и структур. Основы вызова API-функций. Основы программирования на 32-битном ассемблере. Формирование объектного кода, содержащего текст исходной программы в машинном виде.

    курсовая работа [150,4 K], добавлен 18.05.2014

  • Основы организации приложения в Windows. Посылка и передача сообщений для окон. Создание и отображение главного окна приложения. Деактивация приложения, его фазы. Сообщения клавиатуры и функции для работы с ней. Определение состояния отдельных клавиш.

    лекция [65,7 K], добавлен 24.06.2009

  • Основные функции библиотеки динамической компоновки (DLL) в операционной системе Windows. Характеристика механизмов связывания в среде Windows. Описание функций, использующихся в программах. Анализ примеров реализации DLL. Процесс использования ресурсов.

    курсовая работа [365,3 K], добавлен 18.05.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.