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) для диалогового окна, чтобы поддерживать и обрабатывать вводимую информацию для дополнительных элементов управления в вашем пользовательском шаблоне.


 

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

54542. Экономический либерализм и направления его исследований 17.37 KB
  Формирования в развитых странах мира основ рыночных экономических отношений повлекло за собой государственное вмешательство в экономическую деятельность, которое являлось основной преградой в приумножении национального богатства и в достижении согласованности во взаимоотношениях хозяйствующих субъектов как на внутреннем
54543. Неоклассическое направление развития экономической теории 17.42 KB
  Создание неоклассического направления связано с работами английского экономиста Альфреда Маршалла (1842–1924). Именно он со своими «Принципами Экономикса» считается основателем англо – американской школы экономической науки, получившей значительное влияние и в других странах
54544. Делимость натуральных чисел 1.71 MB
  Как не выполняя деления определить делится ли данное число на 9 на 3 Работа с карточками У каждого учащегося на парте лежат карточки с числами: 2 3 5 910 Учитель показывает число учащиеся поднимают карточку с его делителями. Задание 1 Проверка: Задание 2 Проверка: Какие числа называются простыми какие составными Назовите простые числа пятого десятка 41; 43; 47 второго десятка 11; 13; 17; 19.
54545. NATURE. ENVIRONMENTAL PROTECTION 69 KB
  The biggest polluter today is the car. Exhaust fumes are the main cause of bad air quality, which can make people feel ill and have difficulty breathing. This problem is especially bad in some cities where on days when there is not much wind, a brown layer of smog hangs in the air. The number of cars is increasing every year, and this causes serious congestion. Governments then build new roads to try to improve the situation, but this means that they cut down trees and destroy more of the countryside.
54546. Nature and Weather 57 KB
  Aims of the lesson. To develop academic communication skills, critical thinking, students’ listening comprehension. To encourage responsible leadership, stimulate research activities using new technologies. To help people to understand the global threats facing our planet and take actions to improve the situation.
54547. Натюрморт. Тоновий малюнок 340 KB
  Мета уроку: продовжувати знайомство з жанром натюрморту; формувати вміння передавати форму об’єм; фактуру предмета працювати над композицією розвивати спостережливість гостроту зору. Під кінець роботи обов’язково розглянути малюнок з певної відстані. Малюнок 1 Малюнок 2 Малюнок 3 Малюнок 4 Малюнок 5 Малюнок 6 Малюнок 7.
54548. Бабусина наука 33 KB
  Щоб ми швидше дістались її дому бабуся нам підказала коротку дорогу. Діти рухаються згідно інструкції Бабуся виходить з хати. Бабуся: Добрий день мої дорогенькі Як я рада вас бачити Ви так виросли Ви ж збираєтесь іти до школи Готові 2. Бабуся: Зараз я перевірю на дошці виставлено 10 тварин та 10 птахів.
54549. ЯК ПИСАТИ НАУКОВУ РОБОТУ З ФІЛОЛОГІЇ 82 KB
  Безумовно сьогоднішній учитель має можливість через інет†знайти вимоги до змісту та оформлення роботи наприклад на сайтах МАНУ та МОНУ: mn. Я маю чималий досвід цієї роботи: 15 моїх учнів захищали наукові роботи усі брали участь у конкурсізахисті обласного рівня лише двоє не отримали призових місць четверо захищали роботи на Всеукраїнському рівні усі мали призові місця два І місця та два ІІІ м. Пропоную до Вашої уваги деякі порадиспостереження що народилися в процесі багаторічної роботи з учнями над науковими дослідженнями....
54550. Біологія – наука про живу природу 162 KB
  Передбачувані результати навчального заняття: А Знати:; що вивчає наука біологія; основні ознаки живого; основні галузі біології; принципи класифікації організмів; значення біології у практичній діяльності людини Б Нормувати: теоретичний матеріал у вигляді усної розповіді та діалогу; В Цінувати: старанність ініціативність працьовитість; переконання у справедливості; особисту точку зору. До неї входять: Ботаніка ботане рослина вивчає рослини. Зоологія зоон тварина вивчає тварини.