3027

Использование модального диалога

Лабораторная работа

Информатика, кибернетика и программирование

Программирование под Windows Использование модального диалога На основе приложения простейшего приложение создать, приложение обеспечивающее при получении сообщения WM_PAINT вывод некоторого изображения в окно.  Добавить в приложение возможност...

Русский

2012-10-23

69.5 KB

18 чел.

Программирование под Windows

Использование модального диалога

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

  1.  Добавить в приложение возможность работы с диалоговой панелью, появляющейся после выбора пункта меню "Характеристики" осуществлять ввод значений характеристик изображения и интервала между сообщениями от таймера при помощи элементов управления.
  2.  Для выбора цвета изображения использовать Стандартную диалоговую панель выбора цвета (ChooseColor), ограничить возможность выбора цвета пользователем (заранее заданный диапазон цветов), заменить шаблон диалоговой панели на пользовательский.
  3.  * По желанию: использовать хотя бы один из «общих элементов управления» (comctl32.dll).

Список сообщений, обязательных для обработки функцией главного окна: WM_PAINT, WM_DESTROY, WM_CREATE, WM_LBUTTONDOWN, WM_RBUTTONDOWN, WM_KEYDOWN, WM_TIMER, WM_COMMAND. Остальные сообщения передать на обработку стандартной оконной функции.

Методические указания

Для создания шаблона диалоговой панели в файле ресурсов следует выполнить следующий действия: выбрать меню Insert -> выбрать пункт Resourse -> отметить тип ресурса Dialog -> выбрать кнопку New -> отредактировать шаблон диалога (по умолчанию он имеет идентификатор (IDD_DIALOG1) -> сохранить изменения.

Созданный и отредактированный шаблон меню должен иметь элементы управления, позволяющие изменять (редактировать) такие обязательные характеристики изображения как размер, местоположение и цвет (для каждой компоненты цвета предусмотреть отдельный элемент управления), а также характеристики вида изображения и интервала между сообщениями от таймера при помощи элементов управления.

В исходном файле приложения изменить тип памяти для структуры с характеристиками изображения и переменной для хранения интервала dTimer - сделать их глобальными переменными.

Создать диалоговую процедуру DlgProc, в ней (для работы с элементами управления использовать функции SendMessage, SendDlgItemMessage или другие функции для работы с элементами управления):

при обработке сообщения WM_INITDIALOG в соответствующие поля панели диалога поместить значения характеристик изображения (из структуры характеристик) и интервала dTimer между сообщениями WM_TIMER;

при обработке сообщения WM_COMMAND от кнопки IDOK - присвоить значения из полей панели диалога в соответствующие поля структуры характеристик и переменную dTimer.

В оконной функции главного окна при обработке сообщения WM_COMMAND от пункта меню ID_SETVALUE удалить выдачу сообщения функцией MessageBox. Вместо этого при помощи функции DialogBox вызвать диалоговую панель, шаблон которой описан в виде ресурса IDD_DIALOG1, а диалоговой функцией является функция DlgProc.

Проверить возвращаемое функцией DialogBox значение. Если оно равно IDOK, то сделать следующие действия:

объявить всю рабочую область как недействительную (функция InvalidateRect);
послать окну сообщение о перерисовке (функция
UpdateWindow).
уничтожить таймер с номером
nTimer;
создать новый таймер с номером
nTimer и интервалом dTimer.

Реализовать выбор цвета рисунка пользователем при помощи стандартного диалога Цвет(Color). Подключить функцию ChooseColor, которая создает   стандартное диалоговое окно Цвет(Color).

Синтаксис

BOOL ChooseColor

(

   LPCHOOSECOLOR lpcc  // указывает на структуру с данными инициализации

);

Параметры

lpcc Указатель на структуру CHOOSECOLOR, которая содержит информацию, используемую, чтобы инициализировать диалоговое окно. Когда функция ChooseColor возвращает значение, эта структура содержит информацию о цвете, выбранном пользователем.

Возвращаемые значения

Если пользователь щелкает мышью по кнопке OK диалогового окна, возвращаемое значение не нуль. Элемент rgbResult структуры CHOOSECOLOR содержит значения RGB цвета, выбранного пользователем. Если пользователь отменяет или закрывает Диалоговое окно Цвет (Color), или происходит ошибка, возвращаемое значение нулевое. Чтобы получить дополнительные данные об ошибке, вызовите функцию CommDlgExtendedError, которая может возвратить одно из следующих значений:

CDERR_FINDRESFAILURE CDERR_MEMLOCKFAILURE

CDERR_INITIALIZATION CDERR_NOHINSTANCE

CDERR_LOCKRESFAILURE CDERR_NOHOOK

CDERR_LOADRESFAILURE CDERR_NOTEMPLATE

CDERR_LOADSTRFAILURE CDERR_STRUCTSIZE

CDERR_MEMALLOCFAILURE

Замечания
Диалоговое окно Цвет (
Color) не поддерживает палитры. Выбор цветов, предлагаемый диалоговым окном, ограничен цветами системы и размытыми версиями этих цветов.
Вы можете предоставить фильтр - процедуру
CCHookProc для диалогового окна Цвет (Color). Фильтр - процедура может обрабатывать сообщения, посылаемые в диалоговое окно. Чтобы подключить фильтр - процедуру, установите флажок CC_ENABLEHOOK в элементе Flags структуры CHOOSECOLOR и установите адрес ее в элементе lpfnHook.

Пример:

CHOOSECOLOR cc;                 // структура

static COLORREF acrCustClr[16]; // массив цветов

HWND hwnd;                      // окно - владелец

HBRUSH hbrush;                  // дескриптор кисти

static DWORD rgbCurrent;        // изначальный цвет

// Заполняем CHOOSECOLOR

ZeroMemory(&cc, sizeof(cc));

cc.lStructSize = sizeof(cc);

cc.hwndOwner = hwnd;

cc.lpCustColors = (LPDWORD) acrCustClr;

cc.rgbResult = rgbCurrent;

cc.Flags = CC_FULLOPEN | CC_RGBINIT;

if (ChooseColor(&cc)==TRUE) {

   hbrush = CreateSolidBrush(cc.rgbResult);

   rgbCurrent = cc.rgbResult;

}

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

Фильтр - процедура CCHookProc - определяемая программой или определенная библиотекой процедура повторного вызова, которая используется стандартным диалоговым окном Цвет (Color). Фильтр - процедура принимает сообщения или сообщения, предназначенные для заданной по умолчанию процедуры диалогового окна.

Синтаксис

UINT APIENTRY CCHookProc

(

HWND hdlg,   // дескриптор окна блока диалога

UINT uiMsg,   // код сообщения

WPARAM wParam,   // параметр сообщения

LPARAM lParam    // параметр сообщения

);

Параметры

Hdlg Дескриптор окна блока диалога Цвет (Color), для которого предназначено сообщение.

uiMsg Идентифицирует получаемое сообщение.
wParam Определяет дополнительную информацию о сообщении. Точное значение зависит от значения параметра uiMsg.

lParam Определяет дополнительную информацию о сообщении. Точное значение зависит от значения параметра uiMsg.

Если параметр uiMsg указывает на сообщение WM_INITDIALOG, lParam - указатель на структуру CHOOSECOLOR, содержащую значения, установленные, когда было создано диалоговое окно.

Возвращаемые значения
Если фильтр - процедура возвращает нуль, заданная по умолчанию процедура диалогового окна обрабатывает сообщение.
Если фильтр - процедура возвращает значение отличное от нуля, заданная по умолчанию процедура диалогового окна игнорирует сообщение.

Когда вы используете функцию ChooseColor, чтобы создать диалоговое окно Цвет (Color), вы можете предоставить фильтр - процедуру CCHookProc, чтобы обрабатывать сообщения или предупреждения, предназначенные для процедуры диалогового окна. Чтобы разрешать действие фильтр - процедуры, используйте структуру CHOOSECOLOR, которую вы передали в функцию создающую диалоговое окно. Определите адрес фильтр - процедуры в элементе lpfnHook, и установите флажок CC_ENABLEHOOK в элементе Flags.
Заданная по умолчанию процедура диалогового окна обрабатывает сообщение
WM_INITDIALOG перед передачей его в фильтр - процедуру. Все другие сообщения сначала принимает фильтр - процедура. Затем, возвращаемое значение фильтр - процедуры определяет, обрабатывает ли заданная по умолчанию процедура диалогового окна сообщение или игнорирует его.
Если фильтр - процедура обрабатывает сообщение
WM_CTLCOLORDLG, она должна возвратить допустимый дескриптор кисти для закрашивания фона диалогового окна. Вообще, если фильтр - процедура обрабатывает какое-либо сообщение WM_CTLCOLOR*, она должна возвратить допустимый дескриптор кисти для закрашивания фона определяемого элемента управления.
Не вызывайте функцию
EndDialog из фильтр - процедуры. Вместо этого, фильтр - процедура может вызывать функцию PostMessage, чтобы послать сообщение WM_COMMAND со значением IDABORT в процедуру диалогового окна. Регистрация IDABORT закрывает диалоговое окно и вынуждает функцию блока диалога возвратить значение ЛОЖЬ (FALSE). Если Вам нужно знать, почему фильтр - процедура закрыла диалоговое окно, вы должны предоставить свой собственный механизм связи между фильтр - процедурой и вашей прикладной программой.

Вы можете делить на подклассы стандартные элементы управления общего диалогового окна. Однако, и процедура стандартного диалогового окна может тоже делить на подклассы элементы управления. По этой причине, вы должны делить на подклассы элементы управления тогда, когда ваша фильтр - процедура обрабатывает сообщение WM_INITDIALOG. Это гарантирует, что ваша процедура подкласса получит определенные элементом управления сообщения раньше процедуры подкласса, установленной процедурой диалогового окна.

CCHookProc - метка - заместитель для определяемого программой или определенного библиотекой имени функции. Тип LPCCHOOKPROC - указатель на фильтр - процедуру CCHookProc.

Структура CHOOSECOLOR содержит информацию, которую использует функция ChooseColor, чтобы инициализировать стандартное диалоговое окно Цвет (Color). После того, как пользователь закрывает диалоговое окно, система возвращает информацию о выборе пользователя в этой структуре.

Синтаксис 

typedef struct

{      

DWORD lStructSize;

HWND hwndOwner;

HWND hInstance;

COLORREF rgbResult;

COLORREF* lpCustColors;

DWORD Flags;

LPARAM lCustData;

LPCCHOOKPROC lpfnHook;

LPCTSTR lpTemplateName;

} CHOOSECOLOR;

Элементы

lStructSize Определяет длину структуры, в байтах.
hwndOwner
Идентифицирует окно, которое владеет диалоговым окном. Этот элемент может быть любой правильный дескриптор окна или это может быть значение ПУСТО (
NULL), если блок диалога не имеет владельца.

hInstance Если флажок CC_ENABLETEMPLATEHANDLE установлен в элементе Flags, элемент hInstance - дескриптор объекта памяти, содержащего шаблон диалогового окна. Если флажок CC_ENABLETEMPLATE установлен, hInstance идентифицирует модуль, который содержит шаблон диалогового окна, именованный при помощи элемента lpTemplateName. Если ни CC_ENABLETEMPLATEHANDLE, ни CC_ENABLETEMPLATE не установлен, этот элемент игнорируется.

rgbResult Если флажок CC_RGBINIT установлен, элемент rgbResult определяет выбранный первоначально цвет, когда создавалось диалоговое окно. Если среди доступных цветов определяемого значения цвета нет, система выбирает самый близкий доступный чистый тон. Если rgbResult - нуль или CC_RGBINIT не установлен, первоначально выбранный цвет черный. Если пользователь щелкает мышью по кнопке OK, элемент rgbResult устанавливает цвет выбранный пользователем.

lpCustColors Указатель на массив из 16 значений COLORREF, который содержит для пользовательских палитр цветов значения красного, зеленого, синего (RGB) в диалоговом окне. Если пользователь изменяет эти цвета, система модифицирует массив новыми значениями RGBChooseColor, вы должны распределить статическую память для массива.

Flags Установка битов флажков, которые вы можете использовать, чтобы инициализировать стандартное диалоговое окно Цвет (Color). Когда блок диалога возвращает значение, он устанавливает эти флажки, чтобы показать ввод данных пользователем. Этот элемент может быть комбинацией следующих флажков:

  •  CC_ENABLEHOOK - Разрешает действие фильтр - процедуры, которая определена в элементе lpfnHook этой структуры. Этот флажок используется только для того, чтобы инициализировать диалоговое окно.
  •  CC_ENABLETEMPLATE - Указывает, что элементы hInstance и lpTemplateName определяют шаблон диалогового окна, чтобы использовать его вместо заданного по умолчанию шаблона. Этот флажок используется только для того, чтобы инициализировать диалоговое окно.
  •  CC_ENABLETEMPLATEHANDLE - Указывает, что элемент hInstance идентифицирует блок данных, который содержит предварительно загружаемый шаблон диалогового окна. Система игнорирует элемент lpTemplateName, если этот флажок установлен. Этот флажок используется только для инициализации диалогового окна.
  •  CC_FULLOPEN - Заставляет диалоговое окно показывать дополнительные элементы управления, которые позволяют пользователю создавать пользовательские цвета. Если этот флажок не установлен, пользователь должен щелкнуть мышью по кнопке Определить дополнительный цвет (Define Custom Color), чтобы показать элементы управления дополнительным цветом.
  •  CC_PREVENTFULLOPEN - Запрещает работу кнопки Определить дополнительные цвета (Define Custom Colors).
  •  CC_RGBINIT - Заставляет диалоговое окно использовать цвет, определяемый в элементе rgbResult как исходный выбранный цвет.
  •  CC_SHOWHELP - Заставляет диалоговое окно отображать кнопку Справка (Help). Элемент hwndOwner должен определить окно, которое примет зарегистрированные сообщения HELPMSGSTRING, переданное диалоговым окном, когда пользователь щелкает мышью по кнопке Справка (Help).

lCustData Устанавливает определяемые программой данные, которые система передает в фильтр - процедуру, идентифицированную элементом lpfnHook. Когда система передает сообщение WM_INITDIALOG фильтр - процедуре, параметр lParam сообщения является указателем на структуру CHOOSECOLOR, определяемую, когда диалоговое окно было создано. Фильтр - процедура может использовать этот указатель, чтобы получить значение lCustData.

lpfnHook Указатель на фильтр - процедуру CCHookProc, которая может обрабатывать сообщения, предназначенные для диалогового окна. Этот элемент игнорируется, если в элементе Flags не установлен флажок CC_ENABLEHOOK.

lpTemplateName Указатель на строку с нуль-терминатором в конце, которая именует ресурс шаблона диалогового окна в модуле, идентифицированном элементом hInstance. Этот шаблон заменяет стандартный шаблон диалогового окна. Для перечисления ресурсов диалогового окна, значение lpTemplateName может быть возвращено макрокомандой MAKEINTRESOURCE. Этот элемент игнорируется, если в элементе Flags не установлен флажок CC_ENABLETEMPLATE.

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

Для всех общих диалоговых окон за исключением диалоговых окон в стиле Проводника (Explorer-style) Открыть (Open ) и Сохранить как (Save As), вы изменяете заданный по умолчанию шаблон, чтобы создать пользовательский шаблон, который заменит заданный по умолчанию. Пользовательский шаблон определяет тип и позицию стандартных элементов управления также как и любых дополнительных элементов управления.

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

Тип диалогового окна    Файл шаблона Включаемый файл

Цвет (Color)     COLOR.DLG  COLORDLG.H

Найти (Find)     FINDTEXT.DLG DLGS.H

Шрифт (Font)     FONT.DLG  DLGS.H

Открыть (Open) (многократный выбор)   FILEOPEN.DLG DLGS.H

Открыть (Open) (однократный выбор)   FILEOPEN.DLG DLGS.H

Параметры страницы (Page Setup)   PRNSETUP.DLG DLGS.H

Печатать (Print)     PRNSETUP.DLG DLGS.H

Параметры печати (Print Setup) (устаревший)  PRNSETUP.DLG DLGS.H

Заменить (Replace)     FINDTEXT.DLG DLGS.H

Чтобы включить пользовательский шаблон, вы должны установить флажок в элементе Flags соответствующей структуры для диалогового окна. Если шаблон - ресурс в прикладной программе или в динамически компонуемой библиотеке, установите флажок ENABLETEMPLATE в элементе Flags, а элементы структуры hInstance и lpTemplateName используйте, чтобы идентифицировать имя ресурса и модуль. Если шаблон уже в памяти, установите флажок ENABLETEMPLATEHANDLE в элементе Flags и используйте элемент hInstance, чтобы идентифицировать объект памяти, который содержит шаблон.

В большинстве случаев, вы должны также разрешить работу фильтра (hook) для диалогового окна, чтобы поддерживать и обрабатывать вводимую информацию для дополнительных элементов управления в вашем пользовательском шаблоне.


 

А также другие работы, которые могут Вас заинтересовать

40068. Создание лексико-семантической основы ИПЯ. Часть 2. Систематизация лексических единиц. Построение классификационной схемы понятий 38 KB
  Построение классификационной схемы понятий Цель работы: Освоить методы систематизации лексических единиц. Овладеть правилами деления объема понятий; 2. Технология работы: Найти в словаре определения заданных понятий и проанализировать их с точки зрения указания в дефиниции на родовое делимое понятие. Требования к отчету: Итоги выполнения задания представить в виде классификационной схемы понятий: Системы классификации Комбинационные Перечислительные УДК ББК...
40069. Лингвистическое обеспечение сайтов 40 KB
  Сформировать умения определять состав лингвистического обеспечения сайтов. Задание 1: Проанализировать состав ИПЯ используемых для подготовки информационных продуктов и услуг информационных учреждений. Таблица 1 Состав ИПЯ используемых для подготовки информационных продуктов и услуг Наименование информационного продукта или услуги Наименование используемых ИПЯ Назначение функция ИПЯ 1 2 3 Технология работы: Проанализируйте структуру сайта заданного информационного учреждения...
40070. Объектно-признаковый язык 55 KB
  Таблица 1 Виды фактографической информации Лексическая единица Вид информации фактическая прогнозная количественная качественная Технология работы: Проанализировать лексическую единицу см. По результатам тематического поиска в базе данных Дипломные работы отобрано 34 документа; 4. Таблица 2 – Типы лексических единиц Лексическая единица Тип лексической единицы Кемеровский государственный университет культуры и искусств номенклатурный знак Технология работы: Проанализировать...
40071. Государственный рубрикатор научно-технической информации как ИПЯ 48.5 KB
  Охарактеризовать ГРНТИ как ИПЯ. Овладеть навыками кодирования с помощью ГРНТИ. Определить сферу применения ГРНТИ.
40072. Технология расчета контрольного числа для кодов классификаторов технико-экономической и социальной информации 45.5 KB
  Рассмотреть методы расчета контрольного числа для кодов для кодов классификаторов ТЭСИ. Приобрести навыки расчета контрольного числа для кодов классификаторов ТЭСИ. Обеспечивающие средства: методика расчета контрольного числа перечни кодов.
40073. Лингвистическое обеспечение сайтов 63 KB
  Приложение 1 Перечень сайтов библиотек и информационных учреждений подлежащих анализу Российская государственная библиотека www.ru Российская национальная библиотека www.ru Государственная публичная научнотехническая библиотека России www.ru Государственная публичная научнотехническая библиотека Сибирского отделения Российской Академии наук Библиотека по естественным наукам РАН www.
40074. Классификаторы технико-экономической и социальной информации как ИПЯ 70.5 KB
  Охарактеризовать классификаторы ТЭСИ как ИПЯ. Овладеть навыками кодирования с помощью классификаторов ТЭСИ. Определить возможности использования классификаторов ТЭСИ при упорядочении объектов и сферу их применения. Обеспечивающие средства: классификаторы ТЭСИ ББК ГРНТИ УДК Библионорматив машиночитаемый вариант УДК ГРНТИ первичные...
40075. Алфавитно-предметная классификация как ИПЯ 69.5 KB
  Приобрести навыки формулирования предметных рубрик 2. Определить возможности использования АПК Обеспечивающие средства: первичные и вторичные документы; перечни лексических единиц; приложение Правила формулирования предметных рубрик. Задание 1: Определить вид заданных предметных рубрик Требования к отчету: Итоги выполнения задания представить в виде таблицы 1: Таблица 1. Виды предметных рубрик Предметная рубрика Вид и подвид предметной рубрики Технология работы: Проанализировать структуру заданной...
40076. Сфера применения дескрипторных информационно-поисковых языков 56 KB
  Оценить возможности использования дескрипторных ИПЯ при индексировании документов и запросов. Обеспечивающие средства: дескрипторные словари отраслевые информационнопоисковые тезаурусы перечни ключевых слов. Определить необходимый для проведения операции координатного индексирования отраслевой информационнопоисковый тезаурус или дескрипторный словарь.