Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Графический интерфейс пользователя



Графический интерфейс пользователя в подобных 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; Прочитано: 293 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.025 с)...