![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Графический интерфейс пользователя в подобных Windows операционных системах определяет структуру приложения, так как код, выполняющий основную работу, является реакцией приложения на события, связанные, в основном, с воздействием пользователя на элементы интерфейса. Средства интерфейса, с которыми имеет дело конечный пользователь, представляют собой рабочий стол, на котором можно разместить приложения для быстрого к ним доступа, панель задач, обеспечивающую оперативное переключение между выполняющимися приложениями, всплывающие меню, которые положено вызывать правой кнопкой мыши и которые содержат описание действий, относящихся к выбранному объекту, общие элементы управления, обеспечивающие единообразный внешний вид приложений. Требования к стилю пользовательского интерфейса регламентируются компанией Microsoft.
Основой графического интерфейса приложения является окно. Окна бывают двух типов: главное окно и вспомогательные окна. Вид главного окна представлен на рис.1.16.
Рис.1.16. Главное окно приложения
Простейшее окно включает в себя рамку, позволяющую изменять его размеры, область заголовка, содержащую системное меню (пиктограмму приложения), текстовый заголовок окна, кнопки свертывания, развертывания и закрытия окна. Основное поле окна называется клиентской областью или областью пользователя и служит для отображения результатов работы приложения в процессе выполнения. Текст программы 2, результат выполнения которой представлен на Рис.1.16 приводится ниже:
.386
model flat,STDCALL
include win32.inc; структуры данных и константы
extrn CreateWindowExA:PROC
extrn DefWindowProcA:PROC
extrn DispatchMessageA:PROC
extrn ExitProcess:PROC
extrn GetMessageA:PROC
extrn GetModuleHandleA:PROC
extrn LoadCursorA:PROC
extrn LoadIconA:PROC
extrn RegisterClassExA:PROC
extrn ShowWindow:PROC
extrn UpdateWindow:PROC
extrn PostQuitMessage:PROC
.data
newhwnd dd 0
wc WNDCLASSEX <?>
msg MSGSTRUCT <?>
hInst dd 0
szTitleName db 'Это наше окно',0
szClassName db 'ASMCLASS32',0
.code
start:
call GetModuleHandleA,0
mov [hInst], eax
reg_class: mov [wc.cbSize],size WNDCLASSEX
mov [wc.style], CS_HREDRAW + CS_VREDRAW + \ CS_GLOBALCLASS
mov [wc.lpfnWndProc], offset WndProc
mov [wc.cbClsExtra], 0
mov [wc.cbWndExtra], 0
mov [wc.hInstance], eax
call LoadIconA,0, IDI_APPLICATION
mov [wc.hIcon], eax
call LoadCursorA,0, IDC_ARROW
mov [wc.hCursor], eax
mov [wc.hbrBackground], COLOR_WINDOW + 1
mov dword ptr [wc.lpszMenuName], 0
mov dword ptr [wc.lpszClassName], offset szClassName
mov dword ptr [wc.hIconSm],0
call RegisterClassExA, offset wc
call CreateWindowExA, WS_EX_CLIENTEDGE, offset szClassName,\
offset szTitleName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,\
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,0,0,[hInst],0
mov [newhwnd], eax
call ShowWindow, [newhwnd],SW_SHOWNORMAL
call UpdateWindow, SW_SHOWNORMAL
msg_loop:
call GetMessageA, offset msg,0,0,0
cmp eax, 0
je end_loop
call DispatchMessageA,offset msg
jmp msg_loop
end_loop:
call ExitProcess,0
;-----------------------------------------------------------------------------
WndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD,\
wparam:DWORD, lparam:DWORD
cmp [wmsg], WM_DESTROY
je wmdestroy
call DefWindowProcA,[hwnd],[wmsg],[wparam],[lparam]
finish: ret
wmdestroy:
call PostQuitMessage,0
jmp finish
WndProc endp
;-----------------------------------------------------------------------------
public WndProc
end start
Схема алгоритма, соответствующего программе 2 приведена в приложении 1.
По тексту программы и из схемы алгоритма следует, что графическое приложение Windows имеет определенную структуру.
После получения дескриптора модуля регистрируется класс и создается основное окно приложения. Здесь же с помощью функции API UpdateWindow обеспечивается отображение окна на экране. Эта часть программы выполняется один раз. Затем следует цикл выборки сообщений, в котором с помощью функции GetMessageA из очередей сообщений нашего процесса извлекается очередное сообщение и передается в адресное пространство процесса. Функция API DispatchMessageA возвращает управление операционной системе, после чего операционная система вызовет оконную процедуру WndProc, в которой будет обработано сообщение. Если в оконной процедуре нет обработчика полученного сообщения, оно функцией DefWindowProcA передается для обработки операционной системе. После обработки сообщения управление передается циклу выборки сообщений, выход из которого произойдет только в случае выполнения функции PostQuitMessage.
Программирование пользовательского графического интерфейса с применением функций Win32 API основано на использовании так называемых ресурсов. Ресурсами являются соответствующим образом оформленные данные, используемые операционной системой для создания внешнего отображения органов управления приложением и средства, обеспечивающие ввод данных в процессе исполнения программы в режиме диалога. Ресурсы описываются в текстовом файле с расширением rc. Файл описания ресурсов после обработки компилятором ресурсов и получения двоичного файла с расширением res с помощью компоновщика объединяется с исполняемым файлом.
Рассмотрим в качестве примера приложение, имеющее меню из двух пунктов, один из которых служит для завершения приложения, другой – для вызова окна диалога, содержащего строковый редактор для ввода произвольного текста. Окно приложения после обращения к меню имеет вид, представленный на рис.1.17., после обращения к диалогу – на рис.1.18, после завершения диалога – на рис. 1.19.
Рис.1.17.
Рис.1.18.
Рис.1.19
Файл описания ресурсов для данного случая назовем Mymenu2.rc. В нем содержится следующий текст:
#define IDM_QUIT 100
#define IDM_ABOUT 101
#define IDM_QUIT1 102
#define IDD_DIALOG 200
#define IDR_NAME 201
#define IDC_STATIC 202
Mymenu2 MENU
{
POPUP "&Меню1"
{
MENUITEM "&Выход",IDM_QUIT,CHECKED
MENUITEM SEPARATOR
MENUITEM "&ДИАЛОГ",IDM_ABOUT
}
}
IDD_DIALOG DIALOG 0, 0, 187, 95
STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP |\
WS_CAPTION | WS_SYSMENU
CAPTION "Ввод имени"
FONT 8, "MS Sans Serif"
{
DEFPUSHBUTTON "OK",IDOK,134,76,50,14
PUSHBUTTON "Cancel",IDCANCEL,73,76,50,14
LTEXT "Ваше имя?",IDC_STATIC,4,36,52,8
EDITTEXT IDR_NAME,72,32,112,14,ES_AUTOHSCROLL
}
Вместо открывающей фигурной скобки можно использовать слово BEGIN, а закрывающей – END.
В шести первых строках текста определены константы, идентифицирующие соответствующие пункты меню, диалог, статический текст, окно редактирования.
Mymenu2 – имя файла, в котором описаны ресурсы – меню и диалог.
Между первой и последней фигурными скобками содержатся описания пунктов меню, которые могут начинаться ключевыми словами POPUP или MENUITEM. Словом POPUP начинается выпадающее меню. В данном случае в главном меню таким образом определен единственный пункт "&Меню1". Амперсанд в начале текста означает, что при отображении этого пункта на экране буква М будет подчеркнута (выделяется следующая за амперсандом буква), а пункт меню может быть вызван совместным нажатием клавиш Alt и M.
Значения необязательного третьего параметра инструкции MENUITEM или второго параметра инструкции POPUP могут быть следующими:
GRAYED – данный пункт меню недоступен и не генерирует сообщения WM_COMMAND. Текст изображается серым цветом.
INACTIVE – данный пункт меню не активен и не генерирует сообщения WM_COMMAND. Текст изображается обычным образом.
CHECKED – слева от текста появляется метка – "галочка".
Инструкция MENUITEM SEPARATOR разделяет изображение пунктов меню горизонтальной чертой.
С помощью инструкции DIALOG задается начальное положение окна диалога и его размеры. Далее определяются стиль окна, заголовок и шрифт.
В скобках находится описание органов управления. Для всех типов дочерних окон элементов управления, за исключением EDITTEXT, SCROLLBAR, LISTBOX, COMBOBOX, формат инструкции следующий:
<Имя ресурса> control_type,'text',xPos,yPos,xWidth,yHeight,iStyle
Для элементов управления типа EDITTEXT в формате инструкции отсутствует текстовое поле. Поле, определяющее стиль, не является обязательным.
Элементы управления – кнопки – DEFPUSHBUTTON и PUSHBUTTON отличаются тем, что нажатие первой будет осуществляться еще и по нажатию клавиши "Enter".
Текст основного файла приложения приводится ниже:
.386
model flat,STDCALL
include win32.inc
IDM_QUIT equ 100
IDM_ABOUT equ 101
IDM_QUIT1 equ 102
IDD_DIALOG = 200
IDR_NAME = 201
IDC_STATIC = 202
extrn DialogBoxParamA:PROC
extrn MessageBoxA:PROC
extrn ExitProcess:PROC
extrn EndDialog:PROC
extrn GetDlgItem:PROC
extrn GetDlgItemTextA:PROC
extrn SetFocus:PROC
extrn CreateWindowExA:PROC
extrn DefWindowProcA:PROC
extrn DispatchMessageA:PROC
extrn ExitProcess:PROC
extrn GetMessageA:PROC
extrn GetModuleHandleA:PROC
extrn LoadCursorA:PROC
extrn LoadIconA:PROC
extrn LoadMenuA:PROC
extrn MessageBoxA:PROC
extrn PostQuitMessage:PROC
extrn RegisterClassA:PROC
extrn ShowWindow:PROC
extrn UpdateWindow:PROC
.data
newhwnd dd 0
lppaint PAINTSTRUCT <?>
msg MSGSTRUCT <?>
wc WNDCLASS <?>
MAX_USER_NAME = 20
szAppName db 'Пример диалога', 0
szHello db 'Здравствуйте '
szUser db MAX_USER_NAME dup (0)
hInst dd 0
szTitleName db 'Это наше окно',0
szClassName db 'ASMCLASS32',0
szabout db 'Возврат?',0
menu_name db 'Mymenu2',0;Имя файла ресурсов
hMenu dd 0
.code
start:
call GetModuleHandleA,0
mov [hInst], eax
reg_class:
mov [wc.clsStyle], CS_HREDRAW + CS_VREDRAW + \ CS_GLOBALCLASS
mov [wc.clsLpfnWndProc], offset WndProc
mov [wc.clsCbClsExtra], 0
mov [wc.clsCbWndExtra], 0
mov eax, [hInst]
mov [wc.clsHInstance], eax
call LoadIconA,0,IDI_APPLICATION
mov [wc.clsHIcon], eax
call LoadCursorA,0,IDC_ARROW
mov [wc.clsHCursor], eax
mov [wc.clsHbrBackground], COLOR_WINDOW + 1
mov dword ptr [wc.clsLpszMenuName],offset menu_name
mov dword ptr [wc.clsLpszClassName], offset szClassName
push offset wc
call RegisterClassA
call LoadMenuA, [hInst],offset menu_name
mov [hMenu],eax
call CreateWindowExA,0,offset szClassName,offset szTitleName,\
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,\
CW_USEDEFAULT,CW_USEDEFAULT,0,eax,[hInst],0
mov [newhwnd], eax
call ShowWindow,[newhwnd],SW_SHOWNORMAL
call UpdateWindow,[newhwnd]
msg_loop:
call GetMessageA,offset msg,0,0,0
cmp ax, 0
je end_loop
call DispatchMessageA,offset msg
jmp msg_loop
end_loop:
call ExitProcess,0
WndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD,\
wparam:DWORD, lparam:DWORD
cmp [wmsg], WM_DESTROY
je wmdestroy
cmp [wmsg], WM_SIZE
je wmsize
cmp [wmsg], WM_CREATE
je wmcreate
cmp [wmsg], WM_COMMAND
je wmcommand
jmp defwndproc
wmcreate:
mov eax, 0
jmp finish
defwndproc:
call DefWindowProcA,[hwnd],[wmsg],[wparam],[lparam]
jmp finish
wmdestroy:
call PostQuitMessage,0
mov eax, 0
jmp finish
wmsize:
mov eax, 0
jmp finish
wmcommand:
mov eax,lparam
cmp ax,0
jne qq3
mov eax,wparam
qq1: cmp ax,IDM_QUIT
jne qq2
qq2: cmp eax,IDM_ABOUT
jne qq3
call DialogBoxParamA,[hInst],IDD_DIALOG,[newhwnd],\
offset ASMWNDPROC,0
cmp eax,IDOK
jne bye
call MessageBoxA,0,offset szHello,offset szAppName,MB_OK
bye:
qq3: mov eax,0
finish:
ret
WndProc endp
ASMWNDPROC Proc stdcall, hDlg:dword, iMsg:dword, wPar:dword,\
lPar:dword
USES ebx, edi, esi
mov eax,[iMsg]
cmp eax,WM_INITDIALOG
je init
cmp eax,WM_COMMAND
jne ret_false
mov eax,[wPar]
cmp eax,IDCANCEL
je cancel
cmp eax,IDOK;IDNO
je qq4
jmp ret_false
qq4: call GetDlgItemTextA, hDlg, IDR_NAME, \
offset szUser, MAX_USER_NAME
mov eax,IDOK
cancel: call EndDialog, hDlg, eax
ret_false: xor eax, eax
ret
init: call GetDlgItem, hDlg, IDR_NAME
call SetFocus, eax
jmp ret_false
ASMWNDPROC endp
public ASMWNDPROC
public WndProc
end start
В простых случаях вывод результатов работы приложений можно обеспечить с помощью функций API _wsprintfA, wvprintfA и TextOutA. Буква «А» в конце имени означает, что функции ориентированны на кодировку ASCII.
Ввод большого объема исходных данных, по-видимому, удобнее всего производить из заранее подготовленного файла.
Дата публикования: 2015-10-09; Прочитано: 306 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!