Ресурсы в ОС 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