
- •1. Краткие теоретические сведения
- •1.1. Общие положения о программировании в Windows
- •1.2.Общие правила вызова функций api
- •1.3. Структура окна
- •1.4. Понятие ресурсов в ос Windows
- •1.4.1. Иконки
- •1.4.2. Курсоры
- •1.4.3. Битовые картинки (*.Bmp)
- •1.4.4. Строки
- •1.4.5.Диалоговые окна
- •1.4.6. Меню
- •1.4.7. Акселераторы
- •2. Описание используемых api-функций и констант
- •2.1. Используемые константы
- •2.2. Используемые функции
- •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