Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Defpushbutton “ok” IDOK, 64, 60, 32, 14, ws_group




}

Первая строка – имя (AboutBox). Далее следует ключевое слово DIALOG и 4 числа – первые 2 это координаты х и у верхнего левого угла окна диалога относительно рабочей области родительского окна при вызове окна диалога программой. Вторые 2 числа – ширина и высота окна диалога.

Координаты задаются не в пикселях. Х =1/4 средней ширины символа, Y = 1/8 высоты символа.

Внутри фигурных скобок определяются те дочерние окна элементов управления, которые появятся в окне диалога. В нашем окне диалога используются дочерние окна элементов управления трех типов: CTEXT (текст, выровненный по центру), ICON (значок) и DEFPUSHBUTTON (кнопка, выбираемая по умолчанию). Форматинструкций описания следующий:

control-type "text" id, xPos, yPos, xWidth, yHeight [, iStyle ]

Значение iStyle в конце инструкции не является обязательным; оно задает дополнительные стили окна, используя идентификаторы, заданные в заголовочных файлах Windows.

Если с идентификатором WS_GROUP – определяет начало группы, WS_TABSTOP – элемент, который получает фокус по кругу клавишей TAB.

 

 

66. Создание модального окна диалога. Диалоговая процедура, её назначение, и применение.

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

BOOL CALLBACKAboutDlgProc(HWND hDlg, UINT iMsg, WPARAM wParam,LPARAM lParam)

{…}

Параметры такие же как и у оконной процедуры, можно даже вместо hDlg применять hWnd.

Первым сообщением, которое получает окно диалога является WM_INITDIALOG. Это сообщение посылается только процедурам диалога. Если процедура возвращает TRUE, то Windows помещает фокус на ввода на первое дочернее окно элемента, имеющее стиль WS_TABSTOP. Можно использовать SetFocus для установки фокуса, тогда функция возвращает False.

Сообщения для модального окна диалога не проходят через очередь сообщений программы.

66. Создание модального окна диалога. Диалоговая процедура, её назначение, и применение.

Модальные окна — это окна, при появлени которых на экране запрещается доступ к родительскому окну.

Для создания модальных диалоговых окон существует функция

function DialogBoxParam(hInstance: HINST; lpTemplateName: PChar; hWndParent: HWND; lpDialogFunc: TFNDlgProc; dwInitParam: LPARAM): Integer

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

процедура диалога должна быть определена как функция типа CALLBACK. Хотя в качестве описателя окна диалога использовался описатель hDlg, вместо него можно при желании использовать hwnd. процедура диалогового окна возвращает значение типа BOOL. Если оконная процедура не обрабатывает какое-то сообщение, она вызывает DefWindowProc; процедура диалога, если она не обрабатывает сообщение, возвращает FALSE (0), а если обрабатывает, то TRUE. Процедура диалога не обрабатывает сообщения WM_PAINT и WM_DESTROY. Процедура диалога не получит сообщения WM_CREATE; вместо этого она выполняет инициализацию при обработке специального сообщения WM_INITDIALOG. Единственным оставшимся сообщением, которое обрабатывает процедура окна диалога, является WM_COMMAND. Это то сообщение, которое элемент управления кнопка посылает своему родительскому окну тогда, когда либо на ней производится щелчок мышью, либо нажата клавиша <Spacebar> (пробел) и кнопка имеет фокус ввода.

 

66а. Порядок установки начального фокуса в диалоговом окне.

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

66б. Порядок передачи фокуса между дочерними окнами в окне диалога.

Сообщение WM_INITDIALOG является первым сообщением, которое получает процедура диалога. Это сообщение посылается только процедурам диалога. Если процедура диалога возвращает TRUE, то Windows помещает фокус ввода на первое дочернее окно элемента управления, которое имеет стиль WS_TABSTOP. С другой стороны, при обработке сообщения WM_INITDIALOG процедура диалога может использовать функцию SetFocus для того, чтобы установить фокус на одно из дочерних окон управления окна диалога, и тогда она должна вернуть значение FALSE.

66в. Различия в назначении кнопок PUSHBUTTON и DEFPUSHBUTTON в окне диалога.

BS_PUSHBUTTON - создает обычную кнопку, которая посылает

сообщение WM_COMMAND окну-владельцу, когда пользователь

выбирает её.

BS_DEFPUSHBUTTON - создаёт кнопку по умолчанию

(вокруг неё будет тонкая темная рамка). Если

пользователь нажмет ENTER, то запустится обработчик

нажатия на эту кнопку.

66г. Использование клавиатуры для выбора параметров в окне диалога.

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

ALT+mnemonic - Перемещает фокус ввода данных в первый элемент управления (имеющий стиль WS_TABSTOP) после статического элемента управления, содержащего данный символ.

DOWN - Перемещает фокус ввода данных в следующий элемент управления в группе.

ENTER - Посылает сообщение WM_COMMAND процедуре диалогового окна. В параметре wParam установлен IDOK или идентификатор элемента управления командной кнопки заданной по умолчанию.

ESC - Посылает сообщение WM_COMMAND процедуре диалогового окна. В параметре wParam установлен флажок IDCANCEL.

LEFT - Перемещает фокус ввода данных в предыдущий элемент управления в группе.

mnemonic - Перемещает фокус ввода данных в первый элемент управления (имеющий стиль WS_TABSTOP) после статического элемента управления, содержащего данный символ.

RIGHT - Перемещает фокус ввода данных в следующий элемент управления в группе.

SHIFT+TAB - Перемещает фокус ввода в предыдущий элемент управления, который имеет стиль WS_TABSTOP.

TAB - Перемещает фокус ввода в следующий элемент управления, который имеет стиль WS_TABSTOP.

UP - Перемещает фокус ввода данных в предыдущий элемент управления в группе.

 

 

67. Немодальное окно диалога. Функция создания окна. Обработка сообщений от немодальных окон диалога. Цикл обработки сообщений при наличии немодальных окон диалога.

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

Немодальные окна диалога предпочтительнее в том случае, когда пользователь хотел бы на некоторое время оставить окно диалога на экране. Например, в программах обработки текстов немодальные окна диалога часто используются при поиске (Find) и замене (Replace). Если бы окно диалога Find было бы модальным, то пользователю пришлось бы выбрать в меню опцию Find, ввести искомую строку, закрыть окно, чтобы вернуться в документ, а затем при необходимости повторения поиска, снова воспроизвести весь этот процесс. Гораздо удобнее

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

Как уже известно, модальные окна диалога создаются с помощью функции DialogBox. Эта функция возвращает значение только после закрытия окна диалога.

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

создаются с помощью функции CreateDialog. Параметры этой функции те же, что и параметры функции DialogBox:

hDlgModeless = CreateDialog(hInstance, szTemplate, hwndParent, DialogProc);

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

Функция CreateDialog напоминает функцию CreateWindow, с помощью которой создаются обычные окна.

 

Различия между модальными и немодальными окнами диалога

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

• Немодальные окна диалога обычно содержат строку заголовка и значок системного меню. Инструкция STYLE в шаблоне окна диалога для немодального окна диалога будет выглядеть примерно так: STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE

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

• Если без WS_VISIBLE, то после вызова функции CreateDialog необходимо вызвать функцию ShowWindow: hDlgModeless = CreateDialog(...); ShowWindow(hDlgModeless, SW_SHOW);

• Если сообщение предназначено для немодального окна диалога, то функция IsDialogMessage отправляет его оконной процедуре окна диалога и возвращает TRUE (ненулевое значение); в противном случае она возвращает FALSE (0). Функции TranslateMessage и DispatchMessage будут вызываться только в том случае, если hDlgModeless равен 0 или если сообщение не для окна диалога. Если для окна приложения используются быстрые клавиши, то цикл обработки сообщений должен стать таким:

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

{

if(hDlgModeless == 0 ||!IsDialogMessage(hDlgModeless, &msg))

{

if(!TranslateAccelerator(hwnd, hAccel, &msg))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

}

Поскольку глобальные переменные инициализируются нулем, hDlgModeless останется равной 0 до тех пор, пока окно диалога не будет создано; таким образом гарантируется, что функция IsDialogMessage не будет вызвана с недействительным описателем окна. При закрытии немодального окна диалога необходимо принять те же меры предосторожности.

Переменная hDlgModeless может использоваться и в других частях программы для проверки наличия на экране немодального окна диалога. Например, другие окна программы могут посылать окну диалога сообщения, пока hDlgModeless не равна 0.

Для закрытия немодального окна диалога, вместо функции EndDialog, используйте функцию

DestroyWindow. После вызова функции DestroyWindow глобальная переменная hDlgModeless должна быть установлена в 0.

По привычке, пользователь закрывает немодальное окно диалога используя опцию системного меню Close. Хотя опция Close разрешена, оконная процедура окна диалога внутри Windows не обрабатывает сообщения WM_CLOSE. Необходимо сделать это в процедуре диалога:

case WM_CLOSE:

DestroyWindow(hDlg);

hDlgModeless = 0;

break;

Обратите внимание на отличие между параметром hDlg функции DestroyWindow, передаваемым в процедуру диалога и параметром hDlgModeless — глобальной переменной, являющейся возвращаемым значением функции CreateDialog, которая проверяется внутри цикла обработки сообщений.

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

 

68. Описание дочерних окон управления в окнах диалога. Инструкции сокращенного и общего описания дочерних окон управления (в составе окна диалога) в файле ресурсов.

Сокращенное описание:

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

 

Тип элемента управления Класс окна Стиль окна

PUSHBUTTON button BS_PUSHBUTTON | WS_TABSTOP

DEFPUSHBUTTON button BS_DEFPUSHBUTTON | WS_TABSTOP

CHECKBOX button BS_CHECKBOX | WS_TABSTOP

RADIOBUTTON button BS_RADIOBUTTON | WS_TABSTOP

GROUPBOX button BS_GROUPBOX | WS_TABSTOP

LTEXT static SS_LEFT | WS_GROUP

CTEXT static SS_CENTER | WS_GROUP

RTEXT static SS_RIGHT | WS_GROUP

ICON static SS_ICON

EDITTEXT edit ES_LEFT | WS_BORDER | WS_TABSTOP

SCROLLBAR scrollbar SBS_HORZ

LISTBOX listbox LBS_NOTIFY | WS_BORDER | WS_VSCROLL

COMBOBOX combobox CBS_SIMPLE | WS_TABSTOP

Единственной программой, которая понимает эту краткую запись, является компилятор ресурсов (RC). Кроме показанных выше стилей окна, каждое из представленных дочерних окон элементов управления имеет стиль: WS_CHILD | WS_VISIBLE

Для всех типов дочерних окон элементов управления, за исключением EDITTEXT, SCROLLBAR, LISTBOX и COMBOBOX, используется следующий формат инструкций, описывающих элементы управления: control-type "text", id, xPos, yPos, xWidth, yHeight [, iStyle]

А для типов элементов управления EDITTEXT, SCROLLBAR, LISTBOX и COMBOBOX в формат инструкций определения не входит текстовое поле:

control-type id, xPos, yPos, xWidth, yHeight [, iStyle]

В обеих этих инструкциях поле iStyle не является обязательным.

Размеры, которые указываются в шаблонах окон диалога, всегда задаются в единицах 1/4 средней ширины символа и 1/8 его высоты.

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

CHECKBOX "text", id, xPos, yPos, xWidth, yHeight, BS_LEFTTEXT

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

Полная форма:

Например, нельзя создать дочернее окно управления без рамки. По этой причине в компиляторе файла описания ресурсов также определяется и обобщенная форма инструкции окна управления, которая выглядит так: CONTROL "text", id, "class", iStyle, xPos, yPos, xWidth, yHeight

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

PUSHBUTTON "OK", IDOK, 10, 20, 32, 14

можно использовать инструкцию:

CONTROL "OK", IDOK, "button", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP, 10, 20, 32, 14

При компиляции файла описания ресурсов две этих инструкции кодируются одинаково, как в файле с расширением.RES, так и в файле с расширением.EXE.

Если инструкция CONTROL используется в шаблоне окна диалога, нет необходимости включать в нее стили WS_CHILD и WS_VISIBLE. Windows включает их в стиль окна при создании дочерних окон. Кроме этого формат инструкции CONTROL облегчает понимание того, что делает менеджер окна диалога Windows, когда он создает окно диалога. Во-первых, он создает всплывающее окно, родительское окно которого определяется описателем окна, заданным в функции DialogBox. Затем для каждой инструкции элемента управления в шаблоне диалога, менеджер окна диалога создает дочернее окно. Родительским окном каждого из этих дочерних окон управления является всплывающее окно диалога. Приведенная выше инструкция CONTROL преобразуется в вызов функции CreateWindow, которая выглядит следующим образом:

CreateWindow("button", "OK",

WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP,

10 * cxChar / 4, 20 * cyChar / 8,

32 * cxChar / 4,14 * cyChar / 8,

hDlg, IDOK, hInstance, NULL);

где cxChar и cyChar — это ширина и высота символа системного шрифта в пикселях. Параметр hDlg является возвращаемым значением функции CreateWindow, которая создает окно диалога. Параметр hInstance получен при первом вызове функции DialogBox.

 

69. Основные правила интерфейса клавиатуры для дочерних окон управления, описанных в диалоговом окне.

Кнопки OK и Cancel

В шаблоне окна диалога файла описания ресурсов ABOUT2.RC кнопка OK имеет идентификатор IDOK (определенный в заголовочных файлах Windows как 1) а кнопка Cancel имеет идентификатор IDCANCEL (определенный как 2). При этом кнопкой по умолчанию является кнопка OK:

DEFPUSHBUTTON "OK" IDOK, 20, 168, 40, 14, WS_GROUP

PUSHBUTTON "Cancel"IDCANCEL, 80, 168, 40, 14, WS_GROUP

Такое соглашение для кнопок OK и Cancel в окнах диалога вполне обычно; наличие выбираемой по умолчанию кнопки OK помогает работе с интерфейсом клавиатуры. Обычно окно диалога закрывается с помощью либо щелчка мыши на одной из этих кнопок, либо нажатия клавиши <Spacebar>, когда нужная кнопка имеет фокус ввода. Кроме этого оконная процедура окна диалога генерирует сообщение WM_COMMAND при нажатии клавиши <Enter>, независимо от того, какое из окон элементов управления имеет фокус ввода. Младшее слово параметра wParam соответствует значению идентификатора выбираемой по умолчанию кнопки окна диалога до тех пор, пока другая кнопка не получит фокус ввода. В этом случае младшее слово параметра wParam получает значение идентификатора той кнопки, которая имеет фокус ввода. Если в диалоговом окне нет кнопки, выбираемой по умолчанию, то Windows посылает диалоговой процедуре сообщение WM_COMMAND с младшим словом параметра wParam равным IDOK. А при нажатии клавиши <Esc> или <Ctrl>+<Break>, Windows посылает процедуре окна диалога сообщение WM_COMMAND с младшим словом параметра wParam равным IDCANCEL. Таким образом, нет необходимости добавлять в процедуру окна диалога отдельную логику работы с клавиатурой, поскольку те нажатия клавиш, которые обычно приводят к закрытию окна диалога, преобразуются Windows в сообщения WM_COMMAND для этих двух кнопок.

Пример: Функция AboutDlgProc, вызывая функцию EndDialog, обрабатывает эти два сообщения WM_COMMAND:

switch(LOWORD(wParam))

{

case IDOK:

EndDialog(hDlg, TRUE);

return TRUE;

 

case IDCANCEL:

EndDialog(hDlg, FALSE);

return TRUE;

EndDialog – это значение передается обратно в WndProc в качестве возвращаемого значения функции DialogBox:

case IDM_ABOUT:

if(DialogBox(hInstance, "AboutBox", hwnd, AboutDlgProc))

InvalidateRect(hwnd, NULL, TRUE);

return 0;

Если функция DialogBox возвращает TRUE (т. е. ненулевое значение), что означает нажатие кнопки OK, то WndProc должна обновить рабочую область, нарисовав новую фигуру новым цветом. Эти фигура и цвет запоминаются в глобальных переменных iCurrentColor и iCurrentFigure в функции AboutDlgProc, когда она получает сообщение WM_COMMAND с младшим словом параметра wParam равным IDOK. Если функция DialogBox возвращает FALSE, то родительское окно продолжает использовать прежние значения глобальных

переменных iCurrentColor и iCurrentFigure. Величины TRUE и FALSE, как правило, используются в функции EndDialog для того, чтобы просигнализировать оконной процедуре родительского окна о том, какой из кнопок (OK или Cancel) пользователь закрывает окно диалога. Однако параметром функции EndDialog фактически является int, поэтому таким образом можно передавать гораздо больше информации, чем просто значения TRUE или FALSE.

70. Окна Сообщений. Стили и флаги окон. Использование окон сообщений в режиме модального и немодального окна.

Int MessageBox(hWnd,LPSTR szText,LPSTR szCaption,uINT iType)

hWnd – описатель окна родителя.

LPSTR szText – это дальний указатель на оканчивающуюся нулем строку, которая отображается внутри окна сообщения.

LPSTR szCaption – указатель на текст в кэпшине окна сообщения.

uINT iType – флаги, они бывают таких типов:

 

1. MB_OK (по умолчанию), MB_OKCANCEL, MB_YESNO, MB_YESNOCANCEL, MB_RETRYCANCEL, MB_ABORTRETRYIGNORE и MB_HELP. Эти флаги позволяют использовать максимум четыре кнопки.

2. Определяет позицию фокуса на одной из кнопок окна:

MB_DEFBUTTON1 (по умолчанию), MB_DEFBUTTON2, MB_DEFBUTTON3 и MB_DEFBUTTON4

3. Определяет значок, который может появится в окне:

MB_ICONINFORMATION (что аналогично MB_ICONASTERISK), MB_ICONWARNING (аналогично MB_ICONEXCLAMATION), MB_ICONERROR (аналогично MB_ICONSTOP и MB_ICONHAND) и MB_ICONQUESTION. Значки по умолчанию не задаются. Если не будет установлен один из этих флагов, то в окне сообщений не будет значка. Информационный значок (MB_ICONINFORMATION) следует использовать для сообщения состояния, восклицательный знак (MB_ICONWARNING) — для напоминания, вопросительный знак (MB_ICONQUESTION) — для выяснения намерений пользователя и, наконец, значок ошибки (MB_ICONERROR) — для информирования пользователя о наличии серьезных проблем.

4. Определяет модальность окна:

MB_APPLMODAL (по умолч., модальное окно, фокус не удастся перевести на другое окно этого приложения, но можно перевести на окно другого приложения)

MB_SYSTEMMODAL // до закрытия окна другие действия выполнить не удастся

MB_NOFOCUS // появляется окно без фокуса

// чтобы сделать не модальное окно нужно вместо первого параметра указать NULL, что означает, что у окна нет родителя, и в этом случае окно не модальное.

 

Стили окон сообщения:

 

// у окон сообщения нет стилей! Поэтому, если кому-то попадется данный вопрос, спросить, что имеется в виду! НО окно сообщения является альтернативой окну диалога у которого есть стили, поэтому я опишу здесь стили окна диалога.

 

Немодальные окна диалога обычно содержат строку заголовка и значок системного меню. Инструкция STYLE в шаблоне окна диалога для немодального окна диалога будет выглядеть примерно так:

STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE

 

Модальные обычно не имеют пункта WS_SYSMENU.

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...