Win32 API. Библиотека стандартных диалоговых окон

ОГЛАВЛЕНИЕ

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

Об общих диалоговых окнах

Этот краткий обзор описывает стандартные диалоговые окна и объясняет, как использовать их в прикладных программах, разработанных при помощи Microsoft ® Win32 ® API. Стандартные диалоговые окна включают в себя диалоговые окна работы с файлом Открыть (Open) и Сохранить как (Save As), редактирующие диалоговые окна Найти (Find) и Заменить (Replace), диалоговые окна для печати Печать (Print), Параметры Печати (Print Setup) и Параметры Страницы (Page Setup) и диалоговые окна Шрифт (Font) и Цвет(Color).

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

Начиная с версии 4.0 Windows NT ® Microsoft, поддержка стандартных диалоговых окон - та же самая, что и в Windows ® 95 Microsoft.

 

Типы Диалоговых окон

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

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

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

Найти (Find) Показывает диалоговое окно, в котором пользователь может вводить с клавиатуры строку для поиска. Пользователь может также устанавливать параметры поиска, такие как направление поиска и поиск по принципу чувствительности к регистру. Используется функция FindText и структура FINDREPLACE.

Шрифт (Font) Показывает списки доступных шрифтов, размеров (кеглей) в пунктах, и другие атрибуты шрифта, которые пользователь может выбирать. Используется функция ChooseFont и структура CHOOSEFONT.

Открыть (Open) Отображает на экране перечни дисков, каталогов и имен файлов с расширением, из которых пользователь может выбрать для показа список имен файлов. Пользователь может ввести с клавиатуры имя файла или выбрать его из списка, который определяет файлы предназначенные для открытия. Используется функция GetOpenFileName и структура OPENFILENAME.

Печать (Print) Показывает на экране информацию об установленном принтере и его конфигурации. Пользователь может выбирать параметры задания по выводу на печать, такие как диапазон страниц для печати и число копий и запускать процесс печатания. Используется функция PrintDlg и структура PRINTDLG.

Параметры страницы (Page Setup) Показывает на экране конфигурацию текущей страницы. Пользователь может выбирать параметры конфигурации страницы, такие как ориентация бумаги, размер, источник и поля. Используется функция PageSetupDlg и структура PAGESETUPDLG.

Заменить (Replace) Показывает диалоговое окно, в котором пользователь может ввести с клавиатуры строку, которую надо найти и строку замены. Пользователь может устанавливать параметры поиска, такие как, является ли поиск чувствительным к регистру и параметры замены, такие как область замены. Используется функция ReplaceText и структура FINDREPLACE.

Сохранить как (Save As) Показывает списки дисков, каталогов и имен файлов с расширениями, из которых пользователь может выбрать для показа список имен файлов. Пользователь может ввести с клавиатуры имя файла или выбрать его из списка, чтобы определить имя под которым сохранится файл. Используется функция GetSaveFileName и структура OPENFILENAME.

Замечание: Хотя диалоговое окно Параметры печати (Print Setup) тоже доступно, оно было заменено диалоговым окном Параметры страницы (Page Setup). Новые прикладные программы, написанные для Windows 95 или Windows NT версии 3.51 или позже как правило должны использовать диалоговое окно Параметры страницы (Page Setup), а не диалоговое окно Параметры печати (Print Setup).

Все стандартные диалоговые окна модальные, за исключением диалоговых окон Найти (Find) и Заменить (Replace). Модальные диалоговые окна должны быть закрыты пользователем до того, как функция, используемая, чтобы создать диалоговое окно, сможет возвратить значение. Диалоговые окна Найти (Find) и Заменить (Replace) немодальные; функция возвращает значение перед закрытием блока диалога. Если вы используете диалоговые окна Найти (Find) и Заменить (Replace), вы должны тоже использовать функцию IsDialogMessage в основном цикле обработки сообщений вашей прикладной программы, чтобы гарантировать, что эти диалоговые окна правильно обрабатывают ввод данных с клавиатуры, таких как клавиши TAB и ESC


 

Флажки инициализации стандартных диалоговых окон

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

Например, вы устанавливаете значение CF_EFFECTS в элементе Flags структуры CHOOSEFONT, чтобы предписать диалоговому окну Шрифт (Font) показывать на экране набор элементов управления. Эти средства управления позволяют пользователю выбирать цвет логического шрифта, а также использовать эффекты перечеркивания и подчеркивания.

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

 

Настройки стандартного диалогового окна

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

В этом разделе обсуждаются следующие методы настройки общего диалогового окна:

  1. Обеспечение настроек шаблона блока диалога, который определяет, дополнительные элементы управления или изменяет стандартные средства управления
  2. Создание фильтра (hook), чтобы контролировать и фильтровать сообщения, пересылаемые в процедуру диалогового окна
  3. Использование зарегистрированных сообщений, чтобы принимать или передавать информацию в диалоговое окно
  4. Обеспечение поддержки справки для стандартного диалогового окна

Настройка шаблонов

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

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

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

 

Фильтр (hook) - процедуры для общих диалоговых окон

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

1. Стандартный фильтр (hook) - процедура, используется с наиболее общими диалоговыми окнами

2. Фильтр (hook) - процедура, поддерживающая диалоговые окна Открыть (Open) и Сохранить как (Save As) в стиле Проводника

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

  • WM_INITDIALOG - Заданная по умолчанию процедура диалогового окна обрабатывает сообщение перед передачей его в фильтр - процедуру. Параметр сообщения lParam является указателем на структуру инициализации, определяя, когда диалоговое окно было создано.
  • Все другие сообщения - Фильтр - процедура сначала принимает сообщение. Затем, возвращаемое значение фильтр(hook) - процедуры определяет, обрабатывает ли заданная по умолчанию процедура сообщение диалогового окна или она игнорирует его.

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

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

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

Тип общего диалогового окна						Фильтр - процедура
Цвет (Color) CCHookProc
Найти или Заменить (Find or Replace) FRHookProc
Шрифт (Font) CFHookProc
Открыть или Сохранить как (Open or Save As) (стиль Проводника) OFNHookProc
Открыть или Сохранить как (Open or Save As) (Старый стиль) OFNHookProcOldStyle
Печатать (Print) PrintHookProc
Параметры Страницы (Page Setup) PageSetupHook

Для диалогового окна Параметры страницы (Page Setup), вы можете также определить фильтр - процедуру PagePaintHook. Это - специальная фильтр - процедура, которую вы можете использовать, чтобы настроить вид макета страницы, отображаемой диалоговым окном Page Setup.

Обратите внимание, что диалоговое окно Print Setup было заменено диалоговым окном Page Setup, которое должно использоваться новыми прикладными программами, написанными для Windows 95 или для Windows NT версии 3.51 или позже. Однако для совместимости с более ранними версиями Windows, функция PrintDlg продолжает поддерживать показ диалогового окна Print Setup. Вы можете дать фильтр - процедуру SetupHookProc для диалогового окна Параметры страницы (Page Setup).


Сообщения стандартного диалогового окна

Общие диалоговые окна используют сообщения, чтобы информировать вашу оконную или фильтр - процедуру, когда происходят определенные события. Кроме того, имеются сообщения, которые вы можете пересылать в стандартное диалоговое окно, чтобы извлечь информацию или управлять поведением или видом диалогового окна. Этот раздел описывает сообщения стандартного диалогового окна, регистрируемые функцией RegisterWindowMessage, сообщения, используемые диалоговыми окнами Шрифт (Font) и Параметры страницы (Page Setup) и сообщения, используемые диалоговыми окнами в стиле Проводника Открыть (Open) и Сохранить как … (Save As).

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

  • COLOROKSTRING - Диалоговое окно Цвет (Color) посылает это сообщение фильтр - процедуре, когда пользователь выбирает цвет и щелкает мышью по кнопке OK. Фильтр - процедура может принять цвет или отклонить его и заставить диалоговое окно оставаться открытым.
  • FILEOKSTRING - Диалоговое окно Открыть (Open) или Сохранить как (Save As) посылает это сообщение фильтр - процедуре, когда пользователь выбирает имя файла и щелкает мышью по кнопке OK. Фильтр - процедура может принять имя файла или отклонить его и заставить диалоговое окно оставаться открытым. Для диалоговых окон в стиле Проводника Открыть (Open) и Сохранить как (Save As), это сообщение было заменено уведомительным сообщением CDN_FILEOK.
  • FINDMSGSTRING - Диалоговое окно Найти (Find) или Заменить (Replace) передает это сообщение оконной процедуре своего родительского окна, когда пользователь щелкает мышью по кнопке Искать дальше (Find Next), Заменить (Replace) или Заменить Все (Replace All), или закрывает диалоговое окно. Параметр сообщения lParam указывает на структуру FINDREPLACE, которая содержит информацию, введенную пользователем.
  • HELPMSGSTRING - Все стандартные диалоговые окна посылают это сообщение оконной процедуре своего родительского окна, когда пользователь щелкает мышью по кнопке Справка (Help). Для диалоговых окон в стиле Проводника Открыть (Open) и Сохранить как (Save As), это сообщение было заменено уведомительным сообщением CDN_HELP.
  • LBSELCHSTRING - Диалоговые окна Открыть (Open) или Сохранить как (Save As) передают это сообщение в фильтр - процедуру, когда пользователь изменяет выбор в окне со списком Имя файла (Filename). Для диалоговых окон в стиле Проводника Открыть (Open) и Сохранить как (Save As) это сообщение было заменено уведомительным сообщением CDN_SELCHANGE.
  • SETRGBSTRING - Фильтр - процедура может посылать это сообщение диалоговому окну Цвет (Color), чтобы установить выбор текущего цвета.
  • SHAREVISTRING - Диалоговое окно Открыть (Open) или Сохранить как (Save As) посылает это сообщение фильтр - процедуре, если происходит ошибка совместного доступа для выбранного файла, когда пользователь щелкает мышью по кнопке OK. Для диалоговых окон в стиле Проводника Открыть (Open) и Сохранить как (Save As) это сообщение было заменено уведомительным сообщением CDN_SHAREVIOLATION.

Некоторые стандартные диалоговые окна посылают и принимают другие сообщения окна. Фильтр - процедура для диалогового окна Шрифт (Font) может посылать любое из сообщений WM_CHOOSEFONT_* в диалоговое окно Шрифт (Font). Для получения дополнительной информации, см. Диалоговое окно Шрифт (Font). Диалоговое окно Page Setup, если вы включили фильтр - процедуру PagePaintHook, посылает сообщения WM_PSD_*. Для получения дополнительной информации, см. Диалоговое окно Параметры страницы (Page Setup).

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

 

Поддержка Справки

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

Контекстно-зависимая Справка

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

  1. Путем выбора элемента управления и нажатия клавиши F1
  2. Щелчком мыши по кнопке ? в области заголовка, а затем щелчком мыши по элементу управления
  3. Щелчком правой кнопки мыши над элементом управления

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

Действие пользователя				Сообщение
Пользователь щелкнул правой кнопкой мыши
над элементом управления. WM_CONTEXTMENU
Пользователь нажал на клавишу F1. WM_HELP
Пользователь щелкнул мышью по кнопке ? в
области заголовка окна, а затем щелкнул
мышью по элементу управления. WM_HELP

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

Кнопка Справка

Вы можете показать кнопку Справка (Help) в любом из стандартных диалоговых окон, устанавливая значение SHOWHELP в элементе Flags структуры инициализации для диалогового окна. Если вы показываете кнопку Справка (Help), вы должны обработать запрос пользователя о справке. Обработка может быть выполнена или в одной из оконных процедур вашей прикладной программы или в фильтр - процедуре для диалогового окна. Обычно, запрос о справке вы должны обрабатывать, вызывая функцию WinHelp.

Чтобы обработать сообщения справки в одной из ваших оконных процедур, вы должны получить идентификатор сообщения для строки, определенный значением HELPMSGSTRING и идентифицировать окно, которое принимает сообщения. Чтобы получить идентификатор сообщения, установите HELPMSGSTRING как параметр в вызываемой функции RegisterWindowMessage. Когда вы создаете стандартное диалоговое окно, используйте элемент hwndOwner структуры инициализации диалогового окна, чтобы идентифицировать окно, которое должно принять сообщения. Процедура диалогового окна посылает сообщение оконной процедуре всякий раз, когда пользователь выбирает кнопку Справка (Help).

Чтобы обрабатывать сообщения справки в фильтр - процедуре, вы должны обработать сообщение WM_COMMAND. Фильтр - процедура обеспечивает справку, если параметр wParam этого сообщения указывает, что пользователь нажал кнопку Справка (Help). Идентификатор кнопки Справка (Help) - константа pshHelp, определена в файле < b>.

Фильтр - процедуры для стандартных диалоговых окон в стиле Проводника Открыть и Сохранить как, не принимают сообщения WM_COMMAND для кнопки Справка (Help). Вместо этого, диалоговое окно посылает уведомительное сообщение CDN_HELP фильтр - процедуре, когда нажата кнопка Справка (Help).

 

Диалоговое окно Цвет

Диалоговое окно Цвет (Color) возвращает значения RGB цвета, выбранного пользователем. Пользователь может выбирать из набора основных цветов, определенных драйвером дисплея или из набора дополнительных цветов. Вы должны определить начальную установку дополнительных цветов, но вы можете дать возможность пользователям создавать свои собственные дополнительные цвета.

Вы создаете и показываете диалоговое окно Цвет (Color), инициализируя структуру CHOOSECOLOR и передавая параметры структуры в функцию ChooseColor.

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

Если пользователь щелкает мышью по кнопке OK, ChooseColor возвращает значение ИСТИНА (TRUE). Элемент rgbResult структуры CHOOSECOLOR содержит значения RGB цвета, выбранного пользователем. Значение цвета RGB устанавливает индивидуальную интенсивность красного, зеленого и синего цветов, которые создают выбранный цвет. Индивидуальные значения находятся в пределах от 0 до 255. Используйте макрокоманды GetRValue, GetBValue и GetGValue, чтобы извлечь индивидуальные значения цвета из RGB цвета.

Если пользователь отменяет диалоговое окно Цвет (Color) или происходит ошибка, ChooseColor возвращает значение ЛОЖЬ (FALSE>), а элемент rgbResult не определяется. Чтобы определять причину ошибки, вызовите функцию CommDlgExtendedError, чтобы получить расширенное значение ошибки.

Основное и улучшенное диалоговые окна Цвет (Color)

Диалоговое окно Цвет (Color) имеет базисную версию и улучшенную модификацию. Базисная версия имеет элементы управления, которые показывают базисные и дополнительные цвета, из которых пользователь может выбирать. Улучшенная модификация включает базисные элементы управления и дополнительные, которые позволяют пользователю создавать дополнительные цвета. Базисная версия диалогового окна Цвет (Color) включает кнопку Определение дополнительных цветов (Define Custom Colors). Пользователь может щелкать мышью по этой кнопке, чтобы отобразить улучшенную версию. Вы можете дать указание диалоговому окну Цвет (Color), чтобы всегда показывать это улучшение, установив флажок CC_FULLOPEN в элементе Flags структуры CHOOSECOLOR. Чтобы запретить пользователю создание дополнительных цветов, вы можете установить флажок CC_PREVENTFULLOPEN, чтобы отключить кнопку Define Custom Colors.

Основные цвета представляют собою выбор цветов, доступных на данном устройстве. Фактическое число отображаемых цветов определяется драйвером дисплея. Например, драйвер VGA показывает 48 цветов, а драйвера дисплея с черно-белым изображением показывает только 16.

Дополнительные цвета -это цвета, которые вы устанавливаете или которые создает пользователь. Когда вы создаете цветное диалоговое окно, вы должны использовать элемент lpCustColors структуры CHOOSECOLOR, чтобы установить начальные исходные значения для 16 дополнительных цветов. Если улучшенная версия диалогового окна Цвет (Color) открыта, пользователь может создавать дополнительный цвет одним из следующих методов:

  1. Перемещением курсора мыши в элементе управления цветом спектра и плавной регулировки яркости
  2. Вводя с клавиатуры значения красного, зеленого и синего (RGB) в полях редактирования Красный, Зеленый и Синий
  3. Вводя с клавиатуры значения оттенка, насыщенности и яркости (HSL) в редактируемые поля элементов управления Оттенок (Hue), Насыщенность (Sat), и Яркость (Lum)

Чтобы добавить новый дополнительный цвет в поддерживаемой цветовой гамме дисплея, пользователь может щелкнуть по кнопке Добавить дополнительные цвета (Add to Custom Colors). Это также заставляет диалоговое окно копировать значение RGB нового цвета в соответствующий элемент в массиве, указанном элементом lpCustColors. Чтобы сохранить новые дополнительные цвета между обращениями к функции ChooseColor, вы должны отвести статическую память для массива. Для получения дополнительной информации о цветовых моделях RGB и HSL, см. Цветовые модели, используемые диалоговым окном Цвет (Color).

Настройка диалогового окна Цвет (Color)

Чтобы настроить диалоговое окно Цвет (Color), вы можете использовать любой из нижеследующих следующих методов:

  1. Установить значения в структуре CHOOSECOLOR, когда создаете диалоговое окно.
  2. Обеспечить пользовательским шаблоном.
  3. Обеспечить фильтром - процедурой.

Вы можете изменять вид и поведение диалогового окна Цвет (Color), устанавливая флажки в элементе Flags структуры CHOOSECOLOR. Например, вы можете установить флажок CC_SOLIDCOLOR, чтобы предназначить диалоговое окно для показа только плотных тонов. Чтобы заставить диалоговое окно первоначально выбрать цвет, отличающийся от черного, установите флажок CC_RGBINIT и определите цвет в элементе rgbResult.

Вы можете дать пользовательский шаблон для Диалогового окна Цвет (Color), например, если вы желаете включить дополнительные элементы управления, которые являются уникальными в вашей прикладной программе. Функция ChooseColor использует ваш пользовательский шаблон вместо заданного по умолчанию шаблона.

Чтобы обеспечить пользовательским шаблоном для диалогового окна Цвет (Color)

  1. Создайте пользовательский шаблон, изменяя заданный по умолчанию шаблон, определяемый в файле COLOR.DLG. Идентификаторы элементов управления, используемые в заданном по умолчанию шаблоне диалогового окна Цвет (Color), определены в заголовочном файле COLORDLG.H.
  2. Используйте структуру CHOOSECOLOR, чтобы включить шаблон, как указано ниже:

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

Или

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

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

Чтобы включить фильтр - процедуру для диалогового окна Цвет (Color)

1. Установите флажок CC_ENABLEHOOK в элементе Flags структуры CHOOSECOLOR.

В элементе lpfnHook определите адрес фильтра - процедуры.

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

Диалоговое окно посылает зарегистрированное сообщение COLOROKSTRING фильтру - процедуре, когда пользователь щелкает мышью по кнопке OK. Фильтр - процедура может отклонить выбранный цвет и заставить диалоговое окно оставаться открытым, возвращая нуль, когда оно принимает это сообщение. Фильтр - процедура может заставить диалоговое окно выбрать специфический цвет, посылая зарегистрированное сообщение SETRGBSTRING диалоговому окну. Чтобы использовать эти зарегистрированные сообщения, вы должны передать константы COLOROKSTRING и SETRGBSTRING в функцию RegisterWindowMessage, чтобы получить идентификатор сообщения. Вы можете затем использовать идентификатор, чтобы обнаружить и обработать сообщения, посланные из диалогового окна, или посылать сообщения диалоговому окну.


 

Цветовые модели, используемые диалоговым окном Цвет (Color)

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

Цветовая модель RGB

Цветовая модель RGB используется, чтобы обозначить цвета для дисплеев и других устройств, которые излучают свет. Допустимые значения красного, зеленого и синего цвета располагаются в диапазоне от 0 до 255, где 0 указывает на минимум интенсивности, а 255 указывает на максимум интенсивности. 

Ниже перечислены восемь цветов и их связанные значения системе RGB.

Цвет 			Значения RGB
Красный (Red) 255, 0, 0
Зеленый (Green) 0, 255, 0
Синий (Blue) 0, 0, 255
Голубой (Cyan) 0, 255, 255
Фиолетовый (Magenta) 255, 0, 255
Желтый (Yellow) 255, 255, 0
Белый (White) 255, 255, 255
Черный (Black) 0, 0, 0

Windows сохраняет внутренние цвета как 32-разрядные значения RGB, которые имеют следующую шестнадцатеричную форму:

0x00bbggrr

Младший байт содержит значение для относительной интенсивности красного; второй байт содержит значение для зеленого и третий байт содержит значение для синего цвета. Старший байт должен быть нулевой.

Вы можете использовать RGB макрокоманду, чтобы получить значение RGB, основанное на определяемых интенсивностях для красных, зеленых и синих компонентов. Используйте макрокоманды GetRValue, GetBValue и GetGValue, чтобы извлечь индивидуальные цвета из значений цветов RGB.

Цветовая модель HSL

Диалоговое окно Цвет (Color) предоставляет средства управления для определения значений HSL

В диалоговом окне Цвет (Color), насыщенность и значения яркости должна быть в диапазоне 0 до 240, и значение оттенка должно быть в диапазоне 0 до 239.

Преобразование значений HSL в значения RGB

Процедура диалогового окна, данная в файле COMDLG32.DLL для диалогового окна Цвет (Color) содержит код, который преобразовывает значения HSL в соответствующие значения RGB. Ниже - несколько цветов и их связанные значения HSL и RGB.

Цвет 			Значения HSL	Значения RGB
Красный (Red) (0, 240, 120) (255, 0, 0)
Зеленый (Green) (40, 240, 120) (255, 255, 0)
Синий (Blue) (80, 240, 120) (0, 255, 0)
Голубой (Cyan) (120, 240, 120) (0, 255, 255)
Фиолетовый (Magenta) (160, 240, 120) (0, 0, 255)
Желтый (Yellow) (200, 240, 120) (255, 0, 255)
Белый (White) (0, 0, 240) (255, 255, 255)
Черный (Black) (0, 0, 0) (0, 0, 0)


Диалоговое окно Шрифт (Font)

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

Вы создаете и показываете диалоговое окно Шрифт (Font), инициализируя структуру CHOOSEFONT и передавая ее в функцию ChooseFont.

Если пользователь щелкает мышью по кнопке OK, функция ChooseFont возвращает значение ИСТИНА (TRUE) и устанавливает элементы структуры LOGFONT, указанные элементом lpLogFont структуры CHOOSEFONT. Вы можете использовать структуру LOGFONT с функцией CreateFontIndirect, чтобы создать логический шрифт. Функция ChooseFont также устанавливает другие элементы CHOOSEFONT, чтобы обозначить выбор пользователя.

Если пользователь отменяет (закрывает) диалоговое окно Шрифт (Font), или происходит ошибка, ChooseFont возвращает значение ЛОЖЬ (FALSE) и содержание структуры LOGFONT не определяет. Вы можете определить причину ошибки, используя функцию CommDlgExtendedError, чтобы возвратить расширенное значение ошибки.

Флажки инициализации диалогового окна Шрифт (Font)

Перед обращением к функции ChooseFont, - элемент Flags структуры CHOOSEFONT должен определить флажки CF_SCREENFONTS, CF_PRINTERFONTS или CF_BOTH, чтобы указать, должно ли диалоговое окно перечислять экранные шрифты, встроенные шрифты принтера или оба. Если вы определяете флажок CF_PRINTERFONTS или CF_BOTH, элемент hDC структуры CHOOSEFONT должен определять дескриптор контекста устройства для принтера.

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

Чтобы показать элементы управления, которые позволяют пользователю выбирать зачеркивание, подчеркивание и параметры цвета для шрифта

1. Установите флажок CF_EFFECTS. Вы можете использовать элемент rgbColors структуры CHOOSEFONT, чтобы определить начальный цвет шрифта.

Чтобы определить начальные значения элементов управления Шрифт (Font), Стиль Шрифта (Font Style), Размер (Size), Зачеркивание (Strikeout) и Подчеркивание (Underline) диалогового окна

1. Установите флажок CF_INITTOLOGFONTSTRUCT, чтобы использовать элементы структуры LOGFONT для установки начальных значений.

2. Вы можете также использовать флажки CF_NOFACESEL, CF_NOSTYLESEL и CF_NOSIZESEL, чтобы выборочно запретить отображать диалоговому окну начальные значения для соответствующих средств управления. Это полезно при работе с выбранным текстом, который имеет больше чем один шрифт, стиль, или размер в пунктах. Эти значения должны быть также установлены в элементе Flags, когда функция ChooseFont возвращает значения, если пользователь не выбрал соответствующее значение.

Чтобы инициализировать управляющий элемента Стиль Шрифта (Font Style) в определяемом имени стиля.

1. Установите флажок CF_USESTYLE и используйте элемент lpszStyle, чтобы определить имя стиля.

Чтобы показать клавишу Применить (Apply)

1. Установите флажок CF_APPLY и обеспечьте фильтр - процедурой, чтобы обработать сообщение WM_COMMAND для кнопки Применить (Apply). Фильтр - процедура может послать сообщение WM_CHOOSEFONT_GETLOGFONT диалоговому окну, чтобы извлечь адрес структуры LOGFONT, которая содержит текущие параметры для шрифта.

Чтобы показать клавишу Справка (Help)

1. Установите флажок CF_SHOWHELP. Элемент hwndOwner должен идентифицировать окно, которое принимает зарегистрированное сообщение HELPMSGSTRING, когда пользователь щелкает мышью по кнопке Help.

Чтобы ограничить показ шрифтов диалогового окна

1. Установите любую комбинацию флажков CF_TTONLY, CF_FIXEDPITCHONLY, CF_NOVECTORFONTS, CF_NOVERTFONTS, CF_SCALABLEONLY и CF_WYSIWYG. Вы можете также ограничивать доступные стили, размеры в пунктах и эффекты отображения для некоторых шрифтов диалогового окна, используя значение CF_NOSIMULATIONS.

Чтобы ограничить число имен начертания шрифта, стилей и размеров в пунктах, которые пользователь может устанавливать

1. Установите флажок CF_FORCEFONTEXIST, чтобы ограничить пользователя установкой только разрешенных имен начертания, стилей и размеров в пунктах шрифта.

2. Установите флажок CF_LIMITSIZE, чтобы ограничить пользователя установкой размера в пунктах в диапазоне, определяемом элементами nSizeMin и nSizeMax.

Ограничить или отключить комбинированный блок Набор символов (Scripts)

1. Установите флажок CF_NOSCRIPTSEL, чтобы отключить комбинированный блок Набор символов или установите флажок CF_SELECTSCRIPT, чтобы ограничить выбор в нем установленных наборов символов.

Настройка диалогового окна Шрифт (Font)

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

Чтобы обеспечить пользовательским шаблоном диалоговое окно Шрифт (Font)

1. Создайте индивидуальный шаблон, изменив заданный по умолчанию, который определен в файле FONT.DLG. Идентификаторы элементов управления, используемые по умолчанию в шаблоне блока диалога Шрифт (Font), определены в DLGS.H файле.

2. Используйте структуру CHOOSEFONT, чтобы шаблону, как ниже перечислено, разрешить:

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

-ИЛИ-

Если ваш пользовательский шаблон - уже в памяти, установите флажок CF_ENABLETEMPLATEHANDLE. Используйте элемент hInstance, чтобы идентифицировать объект памяти, который содержит шаблон.

Вы можете предоставить диалоговому окну Шрифт (Font) фильтр (hook) - процедуру CFHookProc. Фильтр (hook) - процедура может обрабатывать сообщения, переданные в диалоговое окно. Она также может передавать сообщения блоку диалога. Если вы используете пользовательский шаблон, чтобы определить дополнительные элементы управления, вы должны предоставить фильтр (hook) - процедуру, чтобы обрабатывать ввод данных для ваших элементов управления.

Чтобы включить фильтр (hook) - процедуру для диалогового окна Шрифт (Font)

1. Установите флажок CF_ENABLEHOOK в элементе Flags структуры CHOOSEFONT.

2. Определите адрес фильтр (hook) - процедуры в элементе lpfnHook.

После обработки сообщения WM_INITDIALOG, процедура диалогового окна передает сообщение WM_INITDIALOG фильтр (hook) - процедуре. Параметр lParam этого сообщения - указатель на структуру CHOOSEFONT, используемую, чтобы инициализировать диалоговое окно.

Фильтр (hook) - процедура может передавать сообщения WM_CHOOSEFONT_GETLOGFONT, WM_CHOOSEFONT_SETLOGFONT и WM_CHOOSEFONT_SETFLAGS блоку диалога, чтобы получать и устанавливать текущие значения и флажки диалогового окна.


Диалоговые окна Открыть (Open) и Сохранить как (Save As)

Диалоговое окно Открыть (Open) позволяет пользователю, определить диск, каталог и имя файла или набора файлов, которые надо открыть. Вы создаете и показываете диалоговое окно Открыть (Open), инициализируя структуру OPENFILENAME и передавая структуру в функцию GetOpenFileName.

Диалоговое окно Сохранить как (Save As) позволяет пользователю, определить диск, каталог и имя файла, которые надо сохранить. Вы создаете и показываете диалоговое окно Save As, инициализируя структуру OPENFILENAME и передавая структуру в функцию GetSaveFileName.

Начиная с Windows 95 и Windows NT версии 4.0, имеется новая версия диалоговых окон Открыть (Open) и Сохранить как (Save As), которые обеспечивают функции интерфейса пользователя, являясь сходными с Проводником Windows. Однако, Win32 продолжает поддерживать диалоговые окна Открыть(Open) и Сохранить как (Save As) старого стиля для прикладных программ, которые должны поддерживать интерфейс пользователя, не противоречащий более ранними версиями Windows.

В дополнение к различиям во внешнем виде, диалоговые окна старого стиля и в стиле Проводника отличаются в своем использовании пользовательских шаблонов и фильтр (hook) - процедур для настройки диалоговых окон. Однако, блоки диалога в стиле Проводника и старом стиле в наиболее базисных действиях, таких как определение фильтра имени файла, проверка правильности ввода пользователем и получение имени файла, определяемого пользователем, имеют одинаковое поведение. Для получения дополнительной информации о диалоговых окнах в стиле Проводника и старого стиля, см. Настройка диалоговых окон Открыть и Сохраните Как.

Если пользователь определяет имя файла и щелкает мышью по кнопке OK, функция GetOpenFileName или GetSaveFileName возвращает значение ИСТИНА (TRUE). Буфер, указанный элементом lpstrFile структуры OPENFILENAME содержит полный путь и имя файла, определенное пользователем.

Если пользователь отменяет диалоговое окно Открыть (Open) или Сохранить как (Save As), или происходит ошибка, функция возвращает значение ЛОЖЬ (FALSE). Чтобы определять причину ошибки, вызовите функцию CommDlgExtendedError, чтобы извлечь расширенное значение ошибки. Если буфер lpstrFile слишком маленький, чтобы принять полное имя, CommDlgExtendedError возвращает FNERR_BUFFERTOOSMALL и первые 2 байта буфера, указанного элементом lpstrFile, приведенные к целочисленному значению, устанавливающему размер, требуемый, чтобы принять полное имя файла.

Диалоговые окна стиля Проводника доступны только 32-разрядным прикладным программам. 16-разрядные прикладные программы не могут использовать переключение (thunking), чтобы показать диалоговое окно в стиле Проводника.

Windows 95: 32-разрядные прикладные программы, которые используют диалоговые окна старого стиля, делают это, используя "переходник" (thunk). Это означает, что любой указатель, переданный вашей фильтр (hook) - процедуре - не устойчивая копия данных. Например, указатель OPENFILENAME, переданный в сообщении WM_INITDIALOG - не указывает на буфер, который вы первоначально определили. Если вы должны передать частные данные вашей фильтр (hook) - процедуре, отошлите ее в структуру и сохраните указатель на структуру в элементе lCustData структуры OPENFILENAME.

Имена файлов и каталоги

Информация в этом разделе применяется для диалоговых окон Открыть (Open) и Сохранить как (Save As) как в стиле Проводника, так и в старом стиле.

Перед вызовом функции GetOpenFileName или GetSaveFileName, элемент lpstrFile структуры OPENFILENAME должен указывать на буфер, который примет имя файла. Элемент nMaxFile должен определять размер, в байтах (для версии ANSI) или символах (для версии Уникода), буфера lpstrFile.

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

Чтобы извлечь только имя файла и расширение, установите элемент lpstrFileTitle так, чтобы он указывал на буфер, а в элементе nMaxFileTitle установите размер, в байтах (версия ANSI) или символах (версия Уникода), буфера. Или же, вы можете передать буфер lpstrFile при вызове функции GetFileTitle, чтобы получить отображение имени выбранного файла. Однако обратите внимание, что имя файла, которое GetFileTitle возвращает, включает в себя расширение только в том случае, если это является выбором пользователя для отображающихся имен файлов.

Диалоговое окно использует текущий каталог для процесса вызова в качестве начального каталога от которого отображаются файлы и каталоги. Используйте функции GetCurrentDirectory или SetCurrentDirectory, чтобы получить или изменить ваш текущий каталог. Чтобы определить другой начальный каталог без изменения вашего текущего каталога, используйте элемент lpstrInitialDir, для определения имени каталога. Диалоговое окно автоматически изменит ваш текущий каталог, когда пользователь выберет другой диск или каталог. Чтобы диалоговому окну запретить изменять ваш текущий каталог, установите флажок OFN_NOCHANGEDIR. Этот флажок не мешает пользователю изменять каталоги для поиска файла.

Чтобы определить заданное по умолчанию расширение имени файла, используйте элемент lpstrDefExt. Если пользователь задает имя файла, которое не имеет расширения, диалоговое окно добавляет свое заданное по умолчанию расширение. Если вы определяете заданное по умолчанию расширение, а пользователь определяет имя файла с другим расширением, диалоговое окно устанавливает флажок OFN_EXTENSIONDIFFERENT.

Чтобы позволить пользователю выбрать из каталога несколько файлов, установите флажок OFN_ALLOWMULTISELECT. Для совместимости со старыми прикладными программами, заданное по умолчанию диалоговое окно многокомпонентного выбора использует пользовательский интерфейс старого стиля. Чтобы показать диалоговое окно многокомпонентного выбора в стиле Проводника, вы должны к тому же установить флажок OFN_EXPLORER.

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

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

 

Фильтры

Информация в этой статье применяется к диалоговым окнам Открыть (Open) и Сохранить как (Save As) как старого стиля, так и в стиле Проводника.

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

Чтобы определить фильтры, установите элемент lpstrFilter структуры OPENFILENAME, чтобы указать на буфер, который содержит массив пар строк фильтра. Последняя строка в массиве должна сопровождаться дополнительным символом нуля.

Строка образца может быть комбинацией допустимых символов имени файла и звездочки (*). Звездочка - подстановочный знак, который представляет любую комбинацию допустимых символов в имени файла. Диалоговое окно показывает только те файлы, которые соответствуют образцу. Чтобы определить множество образцов для того же самого описания, вы должны использовать точку с запятой (;), чтобы отделять образцы. Обратите внимание, что пробелы в строке образца могут привести к непредвиденным результатам.

Следующий фрагмент кода определяет два фильтра. Фильтр с описанием "Источник" имеет два образца. Если пользователь выбирает этот фильтр, диалоговое окно показывает только файлы, которые имеют .C и .CXX расширения.

OPENFILENAME ofn;       // структура общего диалогового окна
ofn.lpstrFilter = "Source\0*.C;*.CXX\0All\0*.*\0"
ofn.nFilterIndex = 1;

Элемент nFilterIndex структуры OPENFILENAME определяет индекс, который указывает, какие фильтры первоначально использует диалоговое окно. Первый фильтр в буфере имеет индекс 1, второй 2, и так далее. Если пользователь изменяет фильтр при использовании диалогового окна, элемент nFilterIndex при возврате устанавливается в индекс выбранного фильтра.

Вы можете создать пользовательский фильтр, устанавливая элементе lpstrCustomFilter адрес буфера, который содержит одиночный фильтр, а, в элементе nMaxCustFilter устанавливаете размер буфера, в символах или байтах. Диалоговое окно всегда помещает пользовательский фильтр в начале списка фильтров и, при возврате, всегда модифицирует часть образца фильтра образцом из фильтра, выбранного пользователем.

Для диалоговых окон в стиле Проводника, заданное по умолчанию расширение может измениться, если пользователь выбирает другой фильтр. Если пользователь выбирает фильтр, у которого первый шаблон имеет форму *.xxx (то есть расширение не включает групповой символ), диалоговое окно использует xxx как заданное по умолчанию расширение. Это происходит, только в том случае, если вы определили заданное по умолчанию расширение в элементе lpstrDefExt структуры OPENFILENAME. Например, если пользователь выбирает фильтр " Source\0*.C; *.CXX\0 ", заданное по умолчанию расширение изменяется на "C". Однако, если бы вы определили фильтр как "Source\0*.C*\0", заданное по умолчанию расширение не изменилось бы, потому что расширение включает подстановочный знак. 

Проверка правильности Файла и Каталога

За исключением того что отмечено, информация в этой статье разделе применяется для диалогового окна Открыть(Open) и Сохранить как (Save As) как в стиле Проводника, так и в старом стиле.

Диалоговое окно автоматически проверяет правильность имен файлов вводимых с клавиатуры пользователем, чтобы гарантировать, что имена содержат только допустимые символы. Чтобы отменить проверку правильности символов имени файла, установите флажок OFN_NOVALIDATE.

Чтобы заставить диалоговое окно проверить, что пользователь определил имя существующего файла, установите флажок OFN_FILEMUSTEXIST. Чтобы заставить сделать проверку, что определяемый путь существует, установите флажок OFN_PATHMUSTEXIST. Если вы устанавливаете флажок OFN_CREATEPROMPT, диалоговое окно запрашивает у пользователя разрешение создать несуществующий файл. Если этот флажок установлен, и пользователь выбирает, чтобы создать новый файл, диалоговое окно закрывается, и функция возвращает определяемое имя. Иначе, диалоговое окно остается открытым.

Когда используется диалоговое окно Сохранить как (Save As), вы можете предписать диалоговому окну запросить у пользователя разрешение записать поверх существующего файла, установив флажок OFN_OVERWRITEPROMPT.

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

Если вы включаете фильтр - процедуру, диалоговое окно предупреждает фильтр - процедуру, когда происходит сетевая ошибка совместного доступа для имени файла, определяемого пользователем. Если вы устанавливаете флажок OFN_EXPLORER, диалоговое окно посылает сообщение CDN_SHAREVIOLATION фильтр - процедуре. Если Вы не устанавливаете OFN_EXPLORER, диалоговое окно посылает фильтр - процедуре зарегистрированное сообщение SHAREVISTRING. Чтобы оградить диалоговое окно от посылки каких-либо сообщений об ошибках совместного доступа, установите флажок OFN_SHAREAWARE.

Если пользователь выбирает отмечаемый блок "только для чтения", диалоговое окно при возврате устанавливает флажок OFN_READONLY. Чтобы скрыть отмечаемый блок Открыть Как Только для Чтения (Open As Read Only), установите флажок OFN_HIDEREADONLY. Чтобы оградить диалоговое окно от возвращающихся имен существующих файлов, которые имеют признак "только для чтения", установите флажок OFN_NOREADONLYRETURN.

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


Пользовательская настройка диалогового окна Открыть (Open) и Сохранить как (Save As)

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

Информацию о настройках диалогового окна в стиле Проводника, см. в статьях Фильтр - процедуры стиля Проводника, Пользовательские шаблоны стиля Проводника и Идентификаторы элементов управления стиля Проводника. Информацию о настройках диалогового окна старого стиля, см. в статье Настройки диалоговых окон старого стиля.

Следующая таблица суммирует различия между этими двумя стилями.

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

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

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

Старый стиль
Пользовательский шаблон Пользовательский шаблон заменяет заданный по умолчанию шаблон. Создается
пользовательский шаблон изменением заданного шаблона по умолчанию, определяемого в
файле FILEOPEN.DLG.

Заданный по умолчанию заголовок диалогового окна и в стиле Проводника и в старом стиле является или "Открыть (Open)", или "Сохранить Как. (Save As)" Чтобы изменить заголовок, определите новый заголовок в элементе lpstrTitle структуры OPENFILENAME.

 

Фильтр - процедуры для диалоговых окон в стиле Проводника

Вы можете настроить Диалоговое окно Открыть (Open) или Сохранить как (Save As) в стиле Проводника, при помощи предоставления фильтр - процедуры, пользовательского шаблона или вместе того и другого. Если Вы даете фильтр - процедуру для блока диалога в стиле Проводника, система создает диалоговое окно, которое является дочерним для заданного по умолчанию блока диалога. Фильтр - процедура действует как процедура диалогового окна для дочернего блока диалога. Это дочернее диалоговое окно базируется на пользовательском шаблоне или, если ни один не предоставлен, на шаблоне, заданном по умолчанию. Для получения дополнительной информации, см. статью Пользовательские шаблоны в стиле Проводника. Чтобы включить фильтр - процедуру для диалогового окна Открыть (Open) или Сохранить как (Save As) в стиле Проводника, используйте структуру OPENFILENAME, когда Вы создаете диалоговое окно. Установите флажки OFN_ENABLEHOOK и OFN_EXPLORER в элементе Flags, и определите адрес фильтр - процедуры OFNHookProc в элементе lpfnHook. Если Вы предоставляете фильтр - процедуру и не установили флажок OFN_EXPLORER, Вы должны использовать фильтр - процедуру OFNHookProcOldStyle и получите интерфейс пользователя в старом стиле. Для получения дополнительной информации, см. статью Настраивающиеся диалоговые окна в старом стиле.

Фильтр - процедура в стиле Проводника принимает разнообразные сообщения до тех пор, пока диалоговое окно открыто. Эти сообщения включают в себя:

  1. Сообщение WM_INITDIALOG и другие стандартные сообщения блока диалога типа WM_CTLCOLORDLG, которое является сообщением элемента управления цветом.
  2. Набор уведомительных сообщений WM_NOTIFY, которые указывают на действия, принимаемые пользователем или на другие события диалогового окна.
  3. Сообщения для любых дополнительных средств управления, которые Вы определили, устанавливая шаблон дочернего блока диалога.

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

Если Вы предоставляете фильтр - процедуру для блока диалога в стиле Проводника, заданная по умолчанию процедура диалогового окна создает дочерний блок диалога, когда заданная по умолчанию процедура диалогового окна обрабатывает сообщение WM_INITDIALOG. Фильтр - процедура действует как процедура диалогового окна для дочернего блока диалога. В это время, фильтр - процедура принимает собственное сообщение WM_INITDIALOG с параметром lParam установленным по адресу структуры OPENFILENAME, используемой, чтобы инициализировать блок диалога. После того, как дочернее диалоговое окно заканчивает обрабатывать собственное сообщение WM_INITDIALOG, заданная по умолчанию процедура диалогового окна перемещает стандартные средства управления, если необходимо, чтобы создать место для любых дополнительных средств управления дочернего диалогового окна. Заданная по умолчанию процедура диалогового окна затем посылает уведомительное сообщение CDN_INITDONE фильтр - процедуре.

Фильтр - процедура принимает уведомительные сообщения WM_NOTIFY, указывающие на действия, предпринимаемые пользователем в диалоговом окне. Вы можете использовать некоторые из этих сообщений, чтобы управлять поведением диалогового окна. Например, фильтр - процедура принимает сообщение CDN_FILEOK, когда пользователь выбирает имя файла и щелкает мышью по кнопке OK. В ответ на это сообщение, фильтр - процедура может использовать функцию SetWindowLong, чтобы отклонить выбранное имя и заставить диалоговое окно оставаться открытым.

Параметр lParam для каждого сообщения WM_NOTIFY - указатель на структуру OFNOTIFY, которая определяет действие. Кодовая группа в заголовке структуры OFNOTIFY содержит один из следующих кодов сообщения.

  • CDN_FILEOK - Пользователь щелкнул по кнопке OK; диалоговое окно собирается закрыться.
  • CDN_FOLDERCHANGE - Пользователь открыл новую папку или каталог.
  • CDN_HELP - Пользователь щелкнул по кнопке Справка.
  • CDN_INITDONE - Система закончила инициализировать диалоговое окно, а диалоговое окно закончило обрабатывать сообщение WM_INITDIALOG. А также, система закончила упорядочивать элементы управления в стандартном блоке диалога, чтобы создать место для элементов управления дочернего диалогового окна (если оно есть).
  • CDN_SELCHANGE - Пользователь выбрал новый файл или папку из списка файлов.
  • CDN_SHAREVIOLATION - Стандартное диалоговое окно столкнулось с нарушением правил совместного доступа к файлу, который собирается быть возвращенным.
  • CDN_TYPECHANGE - Пользователь выбрал новый тип файла из списка типов фалов.

Эти сообщения WM_NOTIFY заменяют зарегистрированные сообщения FILEOKSTRING, LBSELCHSTRING, SHAREVISTRING и HELPMSGSTRING, используемые предыдущими версиями Диалоговых окон Открыть (Open) и Сохранить как (Save As). Однако, фильтр - процедура также принимает замененное сообщение после сообщения WM_NOTIFY, если обработка WM_NOTIFY не использует SetWindowLong, чтобы установить значение DWL_MSGRESULT в отличное от нуля.

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

  • CDM_GETFILEPATH - Извлекает путь и имя файла выбранного файла.
  • CDM_GETFOLDERIDLIST - Извлекает список идентификаторов элемента, соответствующего текущей папке, которую диалоговое окно открыло. Для получения информации о списках идентификаторов элемента, см. статью Идентификаторы элемента и списки идентификаторов.
  • CDM_GETFOLDERPATH - Извлекает путь текущей папки или каталога в диалоговом окне.
  • CDM_GETSPEC - Извлекает имя (не, включая путь) текущего файла, выбранного в диалоговом окне.
  • CDM_HIDECONTROL - Скрывает заданный элемент управления.
  • CDM_SETCONTROLTEXT - Устанавливает текст в заданном элементе управления.
  • CDM_SETDEFEXT - Устанавливает в диалоговом окне заданное по умолчанию расширение имени файла.

 



Пользовательские шаблоны в стиле Проводника

Чтобы определить дополнительные элементы управления для Диалогового окна Открыть (Open) или Сохранить как (Save As) в стиле Проводника, используйте структуру OPENFILENAME, чтобы задать шаблон для дочернего диалогового окна, которое содержит дополнительные элементы управления. Если ваш шаблон дочернего блока диалога - ресурс в прикладной программе или динамически компонуемой библиотеке, установите флажок OFN_ENABLETEMPLATE в элементе Flags и используйте элементы структуры hInstance и lpTemplateName, чтобы идентифицировать имя ресурса и модуль. Если шаблон уже в памяти, установите флажок OFN_ENABLETEMPLATEHANDLE и используйте элемент hInstance, чтобы идентифицировать объект памяти, который содержит шаблон. При обеспечении шаблона дочернего блока диалога для диалогового окна в стиле Проводника, Вы должны также установить флажок OFN_EXPLORER; иначе, система предположит, что Вы даете шаблон замены для диалогового окна старого стиля. Обычно, если Вы даете дополнительные средства управления, Вы должны также давать фильтр - процедуру в стиле Проводника для обработки сообщений новых элементов управления.

Вы можете создать свой шаблон дочернего диалогового окна также, как вы делаете любой другой шаблон, за исключением того, что вы можете определить стили WS_CHILD и WS_CLIPSIBLINGS и должны определить стили DS_3DLOOK и DS_CONTROL. Система требует стиля WS_CHILD, потому что ваш шаблон определяет дочерний блок диалога Открыть (Open) или Сохранить как (Save As) по умолчанию. Стиль WS_CLIPSIBLINGS гарантирует, что дочернее диалоговое окно не перерисовывает никакое из элементов управления в заданном по умолчанию диалоговом окне. Стиль DS_3DLOOK проверяет, что внешний вид элементов управления в дочернем диалоговом окне непротиворечиво элементам управления в заданном по умолчанию диалоговом окне. Стиль DS_CONTROL подтверждает, что пользователь может использовать клавишу TAB и другие клавиши передвижения, чтобы передвигаться между всеми элементами управления, созданными по умолчанию или пользовательскими, в пользовательском диалоговом окне.

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

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

Заданная по умолчанию процедура диалогового окна обрабатывает сообщения для всех элементов управления в заданном по умолчанию диалоговом окне, но фильтр - процедура принимает уведомительные сообщения WM_NOTIFY для действий пользователя на этих элементах управления как описано в статье Фильтр - процедуры для диалоговых окон в стиле Проводника.

 

Идентификаторы элементов управления в стиле Проводника

Win32 SDK обеспечивает шаблоном заданного по умолчанию диалогового окна для диалоговых окон старого стиля, но он не включает в себя шаблон заданного по умолчанию диалогового окна в силе Проводника. Это потому, что диалоговые окна в стиле Проводника позволяют вам добавлять ваши собственные средства управления, но не поддерживают изменение шаблона для стандартных средств управления. Однако, в некоторых случаях, вам возможно необходимо знать идентификаторы элементов управления, используемых в заданных по умолчанию шаблонах. Например, сообщения CDM_HIDECONTROL и CDM_SETCONTROLTEXT требуют идентификатора элемента управления.

Следующая таблица показывает идентификаторы стандартных элементов управления диалоговых окон Открыть (Open) и Сохранить как (Save As) в стиле Проводника. Идентификаторы - это константы, определенные в файлах DLGS.H и WINUSER.H.

  • cmb2 - Поле с раскрывающимся списком, которое показывает текущий диск или папку и позволяет пользователю выбрать диск или папку, которые надо открыть
  • stc4 - Метка для комбинированного блока cmb2
  • lst1 - Окно списка, которое показывает содержание текущего диска или папки
  • stc1 - Метка для окна списка lst1
  • edt1 - Редактируемое поле, которое показывает имя текущего файла, или в который пользователь может вводить с клавиатуры имя файла, для его открытия
  • stc3 - Метка для редактируемого поля edt1
  • cmb1 - Поле с раскрывающимся списком, которое показывает список фильтров типов файлов
  • stc2 - Метка для поля с раскрывающимся списком cmb1
  • chx1 - Отмечаемый блок только для чтения
  • IDOK - Кнопка управления OK (командная кнопка)
  • IDCANCEL - Кнопка управления Cancel (командная кнопка)
  • pshHelp - Кнопка управления Help (командная кнопка)

 



Настройка диалоговых окон старого стиля

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

Чтобы включить фильтр - процедуру для диалогового окна Открыть (Open) или Сохранить как (Save As) старого стиля, используйте структуру OPENFILENAME, когда вы создаете диалоговое окно. В элементе Flags установите флажок OFN_ENABLEHOOK, а в элементе lpfnHook установите адрес фильтр - процедуры OFNHookProcOldStyle. Процедура диалогового окна посылает фильтр - процедуре сообщение WM_INITDIALOG с параметром lParam, который устанавливает адрес структуры OPENFILENAME, используемой, чтобы инициализировать диалоговое окно.

Вы можете использовать структуру OPENFILENAME, чтобы определить пользовательский шаблон для диалогового окна Открыть (Open) или Сохранить как (Save As), используя вместо заданного по умолчанию шаблона. Если ваш пользовательский шаблон - ресурс в прикладной программе или динамически компонуемой библиотеке, в элементе Flags установите флажок OFN_ENABLETEMPLATE и используйте элементы структуры hInstance и lpTemplateName, чтобы идентифицировать имя ресурса и модуль. Если ваш пользовательский шаблон - уже в памяти, установите флажок OFN_ENABLETEMPLATEHANDLE и используйте элемент hInstance, чтобы идентифицировать объект памяти, который содержит шаблон. Создайте пользовательский шаблон, изменяя заданный по умолчанию шаблон, определяемый в файле FILEOPEN.DLG. Идентификаторы элементов управления, используемые по умолчанию в шаблоне блока диалога Найти (Find) и Заменить (Replace), определены в файле DLGS.H.

По умолчанию, функции GetOpenFileName и GetSaveFileName показывают диалоговые окна в стиле Проводника. Если вы желаете показать диалоговое окно старого стиля, то должны предоставить фильтр - процедуру OFNHookProcOldStyle и гарантировать, чтобы флажок OFN_EXPLORER не был установлен в элементе Flags структуры OPENFILENAME.

Если Вы устанавливаете флажок OFN_EXPLORER, система обрабатывает фильтр - процедуру или пользовательский шаблон как настройку на стиль Проводника. Об информации о настройках диалогового окна в стиле Проводника, см. статью Пользовательские шаблоны в стиле Проводника.

 

Диалоговое окно Печать… (Print)

Диалоговое окно Печать (Print) позволяет пользователю выбирать параметры для отдельного задания по выводу на печать. Например, пользователь может определить принтеру для использования, размер страниц для печати и тираж.

Вы создаете и показываете диалоговое окно Печатать (Print), инициализируя структуру PRINTDLG и передавая структуру в функцию PrintDlg.

Если пользователь щелкает мышью по кнопке OK, функция PrintDlg возвращает значение ИСТИНА (TRUE) и использует структуру PRINTDLG, чтобы возвратить информацию о выборе пользователя. Например, элементы hDevMode и hDevNames обычно возвращают глобальные дескрипторы памяти для структур DEVMODE И DEVNAMES. Вы можете использовать информацию в этих структурах, чтобы создать контекст устройства или информационный контекст для выбранного принтера.

Если пользователь отменяет диалоговое окно Печатать (Print) или происходит ошибка, PrintDlg возвращает значение ЛОЖЬ (FALSE). Вы можете определить причину ошибки, используя функцию CommDlgExtendedError, чтобы извлечь расширенное значение ошибки.

Диалоговое окно Печатать (Print) включает в себя группу радио-кнопок Диапазона Печати, которые указывают, желает ли пользователь печатать все страницы, определенное количество страниц, или только выбранный текст. Перед вызовом функции PrintDlg, Вы можете установить один из флажков PD_ALLPAGES, PD_SELECTION или PD_PAGENUMS, чтобы указать, которая кнопка первоначально выбрана. Когда PrintDlg возвращает значение ИСТИНА (TRUE), функция устанавливает один из этих флажков, чтобы указать выбор пользователя. Если установлен флажок PD_PAGENUMS, то элементы nFromPage и nToPage структуры PRINTDLG содержат начальные и конечные страницы, определенные пользователем. Чтобы отключить радио-кнопку Страницы (Pages) и связанные с ней "С: (From:)" и "По: (To:)" редактируемые поля, установите флажок PD_NOPAGENUMS. Чтобы отключать радио-кнопку Выделенный фрагмент (Selection), установите флажок PD_NOSELECTION.

Диалоговое окно включает в себя редактируемое поле, в котором пользователь может вводить с клавиатуры число копий для печати. Если элемент hDevMode структуры PRINTDLG не нулевой (не пустой), элемент dmCopies структуры DEVMODE определяет исходное значение для этого редактируемое поля. Если hDevMode имеет значение ПУСТО (NULL), элемент nCopies структуры PRINTDLG определяет начальное значение. Когда PrintDlg возвращает значение, nCopies обычно указывают количество копий, определяемых пользователем. Однако, если Вы устанавливаете флажок PD_USEDEVMODECOPIESANDCOLLATE, когда создаете диалоговое окно, nCopies всегда устанавливается в 1 при возврате, а элемент dmCopies стурктуры DEVMODE указывает количество копий для печати.

Отмечаемый блок Разобрать по копиям (Collate) указывает, желает ли пользователь сделать сортировку страниц по копиям, если печатается множество копий. Флажок PD_COLLATE устанавливается, если отмечаемый блок Разобрать по копиям (Collate) отмечен. Если ваша прикладная программа не поддерживает многочисленные копии или имитацию сортировки, установите флажок PD_USEDEVMODECOPIESANDCOLLATE в элементе Flags структуры PRINTDLG. Это отключит отмечаемый блок Разобрать по копиям (Collate) и редактируемое поле "Число копий: (Number of Copies)", если драйвер принтера не поддерживает многочисленные копии и сортировку.

Отмечаемый блок Печать в файл (Print To File) указывает, что пользователь желает послать вывод информации в файл, а не на принтер. Вы можете установить этот флажок PD_PRINTTOFILE, так чтобы изначально в отмечаемом блоке была проставлена "галочка". Чтобы скрыть отмечаемый блок, установите флажок PD_HIDEPRINTTOFILE. Чтобы отключить его, установите флажок PD_DISABLEPRINTTOFILE. Если пользователь выбирает параметр Print To File, функция PrintDlg устанавливает флажок PD_PRINTTOFILE и возвращает значение "ФАЙЛ: (FILE)" со смещением указывающим на элемент wOutputOffset структуры DEVNAMES. Когда вы вызываете функцию StartDoc, чтобы начать печать, определите эту строку "ФАЙЛ: (FILE)" в элементе lpszOutput структуры DOCINFO. Определение этой строки заставляет подсистему печати сделать запрос у пользователя об имени файла, куда выводить информацию.

По умолчанию, диалоговое окно Печать (Print) первоначально показывает информацию о текущем заданном по умолчанию принтере. Вы можете предписать ему, чтобы показать информацию для другого установленного принтера, инициализируя структуру DEVMODE или DEVNAMES и присваивая глобальный дескриптор памяти для структуры в элементе hDevMode или hDevNames. Имя устройства, которое Вы определяете в элементе dmDeviceName структуры DEVMODE или в элементе wDriverOffset структуры DEVNAMES, должно идентифицировать устройство принтера, которое также внесено в список в разделе [Devices] файла WIN.INI. Если устройство не внесено в список, PrintDlg возвращает ошибку.

Вы можете предписать функции PrintDlg, чтобы создать контекст устройства или информационный контекст для принтера, устанавливая флажок PD_RETURNDC или PD_RETURNIC в элементе Flags структуры PRINTDLG. Функция возвращает дескриптор контекста устройства или информационного контекста в элементе hDC. Если Вы используете флажок PD_RETURNDC, Вы можете использовать контекст устройства, чтобы сделать вывод информации на принтер.

Чтобы извлечь информацию о заданном по умолчанию принтере без показа её в диалоговом окне Печать (Print), установите флажок PD_RETURNDEFAULT. В этом случае, функция PrintDlg возвращает немедленно после установки в элементах hDevMode и hDevNames дескрипторов для структур, содержащих информацию.

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

Настройки диалогового окна Печать (Print)

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

Чтобы дать пользовательский шаблон для диалогового окна Печать (Print)

1. Создайте пользовательский шаблон, изменяя заданный по умолчанию шаблон, определенный в файле PRNSETUP.DLG. Идентификаторы элементов управления, используемых в заданном по умолчанию шаблоне блока диалога Печать (Print) определены в файле DLGS.H.

2. Используйте структуру PRINTDLG, чтобы разрешить шаблону действия как ниже указано. Если ваш пользовательский шаблон - ресурс в прикладной программе или динамически компонуемой библиотеке, установите флажок PD_ENABLEPRINTTEMPLATE в элементе Flags. Используйте элементы hInstance и lpPrintTemplateName структуры, чтобы идентифицировать модуль и имя ресурса.

ИЛИ

1. Если ваш пользовательский шаблон - уже в памяти, установите флажок PD_ENABLEPRINTTEMPLATEHANDLE. Используйте элемент hPrintTemplate, чтобы идентифицировать объект памяти, который содержит шаблон.

Вы можете предоставить фильтр - процедуру PrintHookProc для диалогового окна Печать (Print). Фильтр - процедура может обрабатывать сообщения, посылаемые в диалоговое окно. Она может также посылать сообщения диалоговому окну. Если Вы используете пользовательский шаблон, чтобы определить дополнительные элементы управления, Вы должны предоставить фильтр - процедуру, чтобы обрабатывать вводимую информацию для ваших средств управления.

Чтобы включить фильтр - процедуру для диалогового окна Печать (Print)

1. Установите флажок PD_ENABLEPRINTHOOK в элементе Flags структуры PRINTDLG.

2. Определите адрес фильтр - процедуры в элементе lpfnPrintHook.

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

 

Диалоговое окно Установки для Печати (Print Setup)

Вы можете создать и показать диалоговое окно Установки для Печати (Print Setup), устанавливая флажок PD_PRINTSETUP при вызове функции PrintDlg. Однако, диалоговое окно Установки для печати (Print Setup) заменяется диалоговым окном Установки Страницы (Page Setup) и не должно использоваться в новых прикладных программах.

Ниже следующие флажки применяются только для диалогового окна Установки для Печати (Print Setup):

PD_ENABLESETUPHOOK
PD_ENABLESETUPTEMPLATE
PD_ENABLESETUPTEMPLATEHANDLE  

Диалоговое окно Параметры Страницы (Page Setup)

Диалоговое окно Параметры Страницы (Page Setup) позволяет пользователю устанавливать следующие отличительные признаки напечатанной страницы:

  1. Тип бумаги (конверт, формат 8,5х14 дюймов(legal), формат 10х14 дюймов (letter) и т. д.)
  2. Источник бумаги (ручная подача, непрерывная подача, устройство подачи бумаги по листам, и т. д.)
  3. Ориентация страницы (портретная или альбомная)
  4. Ширина полей страницы.

Атрибуты, представленные в диалоговом окне, изменяются в зависимости от возможностей принтера.

Вы создаете и показываете диалоговое окно Параметры Страницы (Page Setup), инициализируя структуру PAGESETUPDLG и передавая параметры структуры в функцию < b>.

Если пользователь щелкает мышью по кнопке OK, PageSetupDlg возвращает значение ИСТИНА (TRUE) после установки различных элементов в структуре PAGESETUPDLG, чтобы определить выбор пользователя. Элементы ptPaperSize и rtMargin содержат значения, определяемые пользователем. Элементы hDevMode и hDevNames содержат глобальные дескрипторы памяти для структур DEVMODE и DEVNAMES. Эти структуры содержат дополнительную информацию о странице, также как и информацию о принтере. Вы можете использовать эту информацию, чтобы подготовить вывод данных, которые будут пересланы в выбранный принтер.

Следующая иллюстрация показывает вариант диалогового окна Параметры страницы (Page Setup).

Если пользователь отменяет диалоговое окно Параметры страницы (Page Setup), или происходит ошибка, PageSetupDlg возвращает значение ЛОЖЬ (FALSE). Чтобы определить причину ошибки, вызовите функцию CommDlgExtendedError, чтобы возвратить расширенное значение ошибки.

 

Инициализация диалогового окна Параметры страницы (Page Setup)

По умолчанию, диалоговое окно Параметры страницы (Page Setup) показывает информацию о текущем заданном по умолчанию принтере. Чтобы предписать диалоговому окну показать информацию об особенностях принтера, установите элементы структуры DEVMODE или DEVNAMES и присвойте глобальные дескрипторы памяти этих структур соответствующим элементам в PAGESETUPDLG. Если Вы определяете имя принтера, который в настоящее время не установлен, диалоговое окно показывает сообщение об ошибке. Чтобы запретить диалоговому окну отображать сообщения об ошибках, используйте значение PSD_NOWARNING. Чтобы извлечь информацию о заданном по умолчанию принтере без показа её в Диалоговом окне Параметры страницы (Page Setup), используйте значение PSD_RETURNDEFAULT.

Если заданная по умолчанию система мер - дюймы, диалоговое окно использует тысячные части дюймов как заданную по умолчанию единицу измерения. Если заданная по умолчанию система мер метрическая, диалоговое окно использует сотые миллиметра как заданные по умолчанию единицы измерения. Чтобы отменить заданную по умолчанию единицу измерения, установите флажок PSD_INHUNDREDTHSOFMILLIMETERS или PSD_INTHOUSANDTHSOFINCHES в элементе Flags структуры PAGESETUPDLG.

Начальные значения для полей, по умолчанию, один дюйм,. Если Вы устанавливаете флажок PSD_MARGINS, диалоговое окно показывает первоначальное значение поля страницы, определенное в элементе rtMargin. По умолчанию минимальное значение для полей, которое пользователь может установить - минимальные поля, допускаемые принтером. Если Вы устанавливаете флажок PSD_MINMARGINS, диалоговое окно обеспечивает минимальные поля, определенные в элементе rtMinMargin.

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

  • PSD_DISABLEMARGINS - Отключает редактируемые поля, в которые пользователь вводит с клавиатуры величину поля
  • PSD_DISABLEORIENTATION - Отключает радио-кнопки Книжная (Portrait) и Альбомная (Landscape) ориентация
  • PSD_DISABLEPAPER - Отключает элементы управления для выбора размера и источника бумаги
  • PSD_DISABLEPRINTER - Отключает командную кнопку Принтер

Настройка диалогового окна Параметры страницы (Page Setup)

Вы можете предоставить пользовательский шаблон для диалогового окна Параметры страницы (Page Setup), например, если Вы желаете включать дополнительные элементы управления, которые являются уникальными в вашей прикладной программе. Функция PageSetupDlg использует ваш пользовательский шаблон вместо заданного по умолчанию шаблона.

Чтобы предоставить пользовательский шаблон для диалогового окна Параметры страницы (Page Setup).

1. Создайте пользовательский шаблон, изменяя заданный по умолчанию шаблон, определенный в файле PRNSETUP.DLG. Идентификаторы элемента управления, используемые по умолчанию в шаблоне блока диалога Параметры страницы (Page Setup) определены в файле DLGS.H.

2. Используйте структуру PAGESETUPDLG, чтобы разрешить шаблону как ниже указано:

Если ваш пользовательский шаблон - ресурс в прикладной программе или динамически компонуемой библиотеке, установите флажок PSD_ENABLEPAGESETUPTEMPLATE в элементе Flags. Используйте элементы hInstance и lpPageSetupTemplateName структуры, чтобы идентифицировать имя ресурса и модуль.

ИЛИ

Если ваш индивидуальный шаблон уже в памяти, установите флажок PSD_ENABLEPAGESETUPTEMPLATEHANDLE. Используйте элемент hPageSetupTemplate, чтобы идентифицировать объект памяти, который содержит шаблон.

Чтобы фильтровать сообщения, пересылаемые в процедуру диалогового окна, Вы можете предоставить фильтр - процедуру PageSetupHook. Если Вы используете пользовательский шаблон, чтобы определить дополнительные элементы управления, Вы должны предоставить фильтр - процедуру PageSetupHook, которая будет обрабатывать ввод данных для ваших элементов управления. Кроме того, Вы можете предоставить фильтр - процедуру PagePaintHook, чтобы настроить содержание макета страницы, отображаемой диалоговым окном Параметры страницы (Page Setup). Для получения дополнительной информации о фильтр - процедуре PagePaintHook, см. статью Настройка Макета страницы.

Чтобы включить фильтр - процедуру PageSetupHook

1. Установите флажок PSD_ENABLEPAGESETUPHOOK в элементе Flags структуры PAGESETUPDLG.

2. Определите адрес фильтр - процедуры в элементе lpfnPageSetupHook.

После обработки своего сообщения WM_INITDIALOG процедура диалогового окна посылает сообщение WM_INITDIALOG фильтр - процедуре PageSetupHook. Параметр lParam этого сообщения - указатель на структуру PAGESETUPDLG, используемую, чтобы инициализировать диалоговое окно. 


 

Настройка макета страницы

Диалоговое окно Параметры страницы (Page Setup) включает в себя изображение макета страницы, который показывается, как выбор пользователя воздействуют на вид распечатки выводимых данных. Изображение состоит из прямоугольника, который представляет собою выбранный тип бумаги или конверта, с прямоугольником пунктира, представляющим текущие поля, а неполные символы (греческий текст) показывают, как будет смотреться текст на напечатанной странице.

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

Чтобы разрешать действия фильтр - процедуре PagePaintHook.

1. Установите флажок PSD_ENABLEPAGEPAINTHOOK в элементе Flags структуры PAGESETUPDLG.

2. Установите адрес фильтр - процедуры в элементе lpfnPagePaintHook.

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

  • WM_PSD_PAGESETUPDLG - Диалоговое окно собирается сделать прорисовку макета страницы. Фильтр - процедура может использовать это сообщение, чтобы подготовиться к рисованию содержания макета страницы.
  • WM_PSD_FULLPAGERECT - Диалоговое окно собирается сделать прорисовку макета страницы. Это сообщение определяет границы прямоугольника макета страницы.
  • WM_PSD_MINMARGINRECT - Диалоговое окно собирается сделать прорисовку макета страницы. Это сообщение определяет прямоугольник поля страницы.
  • WM_PSD_MARGINRECT - Диалоговое окно собирается сделать прорисовку прямоугольника полей страницы.
  • WM_PSD_GREEKTEXTRECT - Диалоговое окно собирается сделать вывод греческого текста внутри прямоугольника полей страницы.
  • WM_PSD_ENVSTAMPRECT - Диалоговое окно собирается делать прорисовку в прямоугольнике макета страницы в виде конверта с маркой. Это сообщение посылается только для конвертов.
  • WM_PSD_YAFULLPAGERECT - Диалоговое окно собирается делать прорисовку в области адреса возврата в макете страницы в виде конверта. Это сообщение посылается для конвертов и других размеров бумаги.

Если фильтр - процедура возвращает значение ИСТИНА (TRUE) для любого из первых трех сообщений в порядке следования прорисовки (WM_PSD_PAGESETUPDLG, WM_PSD_FULLPAGERECT или WM_PSD_MINMARGINRECT) диалоговое окно больше не посылает сообщения и не прорисовывает макет страницы до тех пор, пока в следующий раз система не потребуется перерисовать макет страницы. Если фильтр - процедура возвращает ЛОЖЬ (FALSE) для всех этих трех сообщений, диалоговое окно посылает остающиеся сообщения в порядке следования прорисовки.

Если фильтр - процедура возвращает значение ИСТИНА (TRUE) для любого из остающихся сообщений в порядке следования прорисовки, диалоговое окно не выводит соответствующую часть макета страницы. Если фильтр - процедура возвращает значение ЛОЖЬ (FALSE) для любого из этих сообщений, диалоговое окно выводит эту часть макета страницы.

Чтобы не дать диалоговому окну рисовать содержание макетов страниц, вы можете установить флажок PSD_DISABLEPAGEPAINTING. Этот флажок не воздействует на вашу фильтр - процедуру PagePaintHook, которая все еще принимает все WM_PSD_* сообщения и может выводить содержание макета страницы.


Диалоговые окна Найти (Find) и Заменить (Replace)

Диалоговое окно Найти (Find) позволяет пользователю определить последовательность символов для поиска, а также параметры для использования, когда делается поиск текста в документе. Диалоговое окно Заменить (Replace) позволяет пользователю определить последовательность символов для поиска и замены этой последовательностью, а также параметры для управления этой операцией.

Вы создаете и отображаете диалоговое окно Найти (Find),инициализируя структуру FINDREPLACE и предавая структуру в функцию FindText. Вы создаете и отображаете диалоговое окно Заменить (Replace),инициализируя структуру FINDREPLACE и предавая структуру в функцию ReplaceText.

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

Если функция FindText или ReplaceText успешно создают диалоговое окно, они возвращают значение дескриптора диалогового окна. Вы можете использовать этот дескриптор для перемещения и установки связи с диалоговым окном. Если функция не может создать диалоговое окно, она возвращает значение ПУСТО (NULL). Вы можете определить причину ошибки путем вызова функции CommDlgExtendedError, чтобы отыскать расширенное значение ошибки. 


 

Зарегистрированное сообщение FINDMSGSTRING

Перед созданием диалогового окна Найти (Find) или Заменить (Replace). Вы должны вызвать функцию RegisterWindowMessage, чтобы получить идентификатор зарегистрированного сообщения FINDMSGSTRING. Вы можете затем использовать этот идентификатор, чтобы определять и обрабатывать сообщения, посылаемые из диалогового окна. Когда пользователь щелкает мышью по кнопке диалогового окна Искать дальше… (Find Next), Заменить (Replace) или Заменить все (Replace All), процедура диалогового окна передает сообщение FINDMSGSTRING в оконную процедуру окна владельца. Когда вы создаете диалоговое окно, элемент hwndOwner структуры FINDREPLACE идентифицирует окно владельца.

Параметр lParam сообщения FINDMSGSTRING указывает на структуру FINDREPLACE, которую вы определили, когда создавали диалоговое окно. Перед передачей сообщения, диалоговое окно устанавливает элементы этой структуры с самыми последними введенными пользователем данными, включая последовательность символов для поиска, замены этой последовательности (если она имеется) и параметрами для операции поиска-замены.

В сообщении FINDMSGSTRING элемент Flags структуры FINDREPLACE включает в себя один из ниже перечисленных флажков, чтобы указать на событие, которое вызвало сообщение:

  • FR_DIALOGTERM - Диалоговое окно закрывается. После того как окно владелец обработает это сообщение, дескриптор диалогового окна далее не будет корректным.
  • FR_FINDNEXT - Пользователь щелкнул мышью по кнопке Искать дальше (Find Next) в диалоговом окне Найти (Find) или Заменить (Replace). Элемент lpstrFindWhat определяет последовательность символов для поиска.
  • FR_REPLACE - Пользователь щелкнул мышью по кнопке Заменить (Replace) в диалоговом окне Заменить (Replace). Элемент lpstrFindWhat устанавливает последовательность символов, которую надо заменить, а элемент lpstrReplaceWith устанавливает последовательность символов, на которую надо заменить.
  • FR_REPLACEALL - Пользователь щелкнул мышью по кнопке Заменить все (Replace All) в диалоговом окне Заменить (Replace). Элемент lpstrFindWhat устанавливает последовательность символов, которую надо заменить, а элемент lpstrReplaceWith устанавливает последовательность символов, на которую надо заменить.

Для сообщения Искать дальше (Find Next) или Заменить все (Replace All) элемент Flags может включать любую комбинацию ниже перечисленных флажков, которые указывают параметры поиска:

  • FR_DOWN - Если установлен, то из радио-кнопок направления выбрана кнопка До конца (Down), которая указывает, что пользователь желает искать от текущего положения каретки в тексте до конца документа. Если флажок FR_DOWN не установлен, выбрана кнопка Вверх (Up), что означает, что пользователь желает осуществлять поиск к началу документа.
  • FR_MATCHCASE - Если флажок установлен, в отмечаемом блоке С учетом регистра (Match Case) стоит галочка, показывая, что пользователь желает, чтобы поиск был чувствителен к регистру. Если FR_MATCHCASE не установлен, в отмечаемом блоке галочки нет, так что поиск должен быть не чувствительным к регистру.
  • FR_WHOLEWORD - Если флажок установлен, в отмечаемом блоке Соответствовать слову только целиком (Match Whole Word Only) стоит галочка, показывая, что пользователь желает осуществить поиск только для целого слова, которое соответствует поисковой последовательности символов. Если FR_WHOLEWORD не установлен, в отмечаемом блоке галочка не стоит, тогда вы должны также осуществлять поиск фрагмента слова, который соответствует поисковой последовательности символов.

 



Настройка диалогового окна Найти (Find) или Заменить (Replace)

Чтобы настроить диалоговое окно Найти (Find) или Заменить (Replace), вы можете использовать любой из ниже перечисленных методов:

  1. Определить значения в структуре FINDREPLACE, когда создается диалоговое окно
  2. Снабдить индивидуальным шаблоном
  3. Предоставить фильтр - процедуру (ловушку)

Когда вы создаете диалоговое окно Найти (Find) или Заменить (Replace), вы можете установить флажки в элементе Flags структуры FINDREPLACE, чтобы скрыть или запретить работу любого из параметров поиска элементов управления. Например, вы можете установить флажок FR_NOMATCHCASE, чтобы запретить работу отмечаемого блока С учетом регистра (Match Case) или установить флажок FR_HIDEMATCHCASE, чтобы скрыть его.

Вы можете снабдить диалоговое окно Найти (Find) или Заменить (Replace) пользовательским шаблоном, к примеру, если вы захотите включить дополнительные элементы управления, которые присущи только вашей прикладной программе. Функции FindText и ReplaceText используют ваш пользовательский шаблон вместо шаблона по умолчанию.

Чтобы снабдить пользовательским шаблоном диалоговое окно Найти (Find) или Заменить (Replace)

1. Создайте индивидуальный шаблон, модифицируя шаблон по умолчанию, определенный в файле FINDTEXT.DLG. Идентификаторы элементов управления, используемые по умолчанию в шаблоне диалога Найти (Find) или Заменить (Replace), определены в файле DLGS.H

2. Чтобы разрешить работу шаблона, используйте структуру FINDREPLACE, как указано ниже:

Если ваш пользовательский шаблон - ресурс в прикладной программе или динамически компонуемой библиотеки, установите флажок FR_ENABLETEMPLATE в элементе Flags. Используйте элементы hInstance и lpTemplateName структуры, чтобы идентифицировать модуль и название ресурса.

ИЛИ

Если ваш пользовательский шаблон уже в памяти, установите флажок FR_ENABLETEMPLATEHANDLE. Используйте элемент hInstance, чтобы идентифицировать объект памяти, который хранит в себе шаблон.

Вы можете предоставить диалоговому окну Найти (Find) или Заменить (Replace) фильтр - процедуру FRHookProc. Фильтр -процедура может обрабатывать сообщения, посылаемые в диалоговое окно. Если вы используете пользовательский шаблон, чтобы определить дополнительные элементы управления, вы должны предоставить фильтр - процедуру для обработки в водимых данных для ваших элементов управления.

Чтобы включить в работу фильтр - процедуру для диалогового окна Найти (Find) или Заменить (Replace)

1. Установите флажок FR_ENABLEHOOK в элементе Flags структуры FINDREPLACE.

2. Определите адрес фильтр - процедуры в элементе lpfnHook.

После обработки своего сообщения WM_INITDIALOG, процедура диалогового окна передаёт сообщение WM_INITDIALOG в фильтр - процедуру. Параметр lParam этого сообщения указывает на структуру FINDREPLACE, которая используется для инициализации диалогового окна.

Если фильтр - процедура в ответ на сообщение WM_INITDIALOG возвращает значение ЛОЖЬ (FALSE), диалоговое окно не будет показано до тех пор, пока его не покажет фильтр - процедура. Чтобы сделать это, сначала выполняют любые другие операции прорисовки, а затем вызывают функции ShowWindow и UpdateWindow. Код ниже дает пример:

// Мы возвратили ЛОЖЬ (FALSE) в ответ на WM_INITDIALOG.  
// Мы выполнили любые другие операции прорисовки.
// Теперь мы показываем диалоговое окно.


ShowWindow(hDlg, SW_SHOWNORMAL);
UpdateWindow(hDlg);


 Использование общих диалоговых окон

 Выбор цвета

Эта статья описывает типовой код, который отображает на экране диалоговое окно Цвет (Color) тогда, когда пользователь собирается выбрать какой-нибудь цвет. Этот типовой код сначала инициализирует структуру CHOOSECOLOR, а затем вызывает функцию ChooseColor, чтобы изобразить диалоговое окно. Если функция возвращает значение ИСТИНА (TRUE), то это служит признаком того, что пользователь выбрал цвет, а типовой код использует выбранный цвет для создания новой сплошной кисти.

Этот пример использует структуру CHOOSECOLOR для инициализации диалогового окна как ниже указано:

  1. Инициализирует элемент lpCustColors с указателем на статический массив COLORREF. Цвета в массиве первоначально черные, но статический массив защищает пользовательские цвета, созданные пользователем, посредством использования последующего вызова ChooseColor.
  2. Устанавливает флажок CC_RGBINIT и инициализирует элемент rgbResult, чтобы определить цвет, который первоначально был выбран, когда диалоговое окно открывалось. Если он не определен, изначально выбирается черный цвет.
  3. Пример, использует статическую переменную rgbCurrent, чтобы сохранить значение выбора между обращениями к ChooseColor.
  4. Устанавливает флажок CC_FULLOPEN, так что диалоговое окно всегда отображает пользовательские дополнительные цвета.
CHOOSECOLOR cc;		// структура стандартного диалогового окна
static COLORREF acrCustClr[16]; // массив пользовательских цветов
HWND hwnd; // окно владелец
HBRUSH hbrush; // дескриптор кисти
static DWORD rgbCurrent; // выбор начального цвета

// Инициализация CHOOSECOLOR
ZeroMemory(&cc, sizeof(CHOOSECOLOR));
cc.lStructSize = sizeof(CHOOSECOLOR);
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;


 

Выбор шрифта

Эта статья описывает типовой код, который отображает диалоговое окно Шрифт (Font), так что пользователь может выбрать атрибуты шрифта. Типовой код сначала инициализирует структуру CHOOSEFONT, а затем вызывает функцию ChooseFont, которая отображает диалоговое окно.

Этот пример устанавливает флажок CF_SCREENFONTS, чтобы определить какое диалоговое окно будет показывать только экранные шрифты. Он устанавливает флажок CF_EFFECTS, чтобы отобразить элементы управления, которые позволяют пользователю выбрать параметры зачёркивания, подчёркивания и цвета шрифта.

Если ChooseFont, возвращает значение ИСТИНА (TRUE) то это указывает на то, что пользователь щёлкнул мышью по кнопке OK, что структура LOGFONT, указанная элементом lpLogFont структуры CHOOSEFONT содержит информацию, которая описывает шрифт и отличительные признаки шрифта, выбранные пользователем. Элемент rgbColors содержит выбранный цвет текста. Типовой код использует эту информацию, чтобы установить шрифт и цвет текста для контекста устройства связанного с окном владельца.

HWND hwnd;                			// окно владельца
HDC hdc; // показываем контекст устройства окна владельца
CHOOSEFONT cf; // структура стандартного диалогового окна
static LOGFONT lf; // структура логического шрифта
static DWORD rgbCurrent; // текущий цвет текста
HFONT hfont, hfontPrev;
DWORD rgbPrev;

// Инициализация CHOOSEFONT
ZeroMemory(&cf, sizeof(CHOOSEFONT));
cf.lStructSize = sizeof (CHOOSEFONT);
cf.hwndOwner = hwnd;
cf.lpLogFont = &lf;
cf.rgbColors = rgbCurrent;

cf.Flags = CF_SCREENFONTS | CF_EFFECTS;

if (ChooseFont(&cf)==TRUE)
{
hfont = CreateFontIndirect(cf.lpLogFont);
hfontPrev = SelectObject(hdc, hfont);
rgbCurrent= cf.rgbColors;
rgbPrev = SetTextColor(hdc, rgbCurrent);
.
.
.
}


Открытие файла

Эта статья описывает типовой код, показывающий диалоговое окно Открыть (Open), в котором пользователь мог бы определить диск, каталог и имя открываемого файла. Типовой код сначала инициализирует структуру OPENFILENAME, а затем вызывает функцию GetOpenFileName, чтобы показать диалоговое окно.

В этом примере элемент lpstrFilter указывает на буфер, который устанавливает два фильтра имен файлов, чтобы пользователь мог выбрать ограничения в отображении имен файлов. Буфер содержит массив строк, оканчивающийся двойным нулем, в котором каждая пара строк определяет фильтр. Элемент nFilterIndex устанавливает, какой использовать шаблон первым, когда создается диалоговое окно.

Этот пример устанавливает флажки OFN_PATHMUSTEXIST и OFN_FILEMUSTEXIST в элементе Flags. Эти флажки принуждают диалоговое окно проверять, перед возвратом, какой путь и имя файла, установленные пользователем, фактически существуют.

Функция GetOpenFileName возвращает значение ИСТИНА (TRUE), если пользователь щелкает мышью по кнопке ОК и устанавливает путь и имя существующего файла. В этом случае, буфер указывает на элемент lpstrFile, который содержит путь и имя файла. Типовой код использует эту информацию при вызове функции CreateFile для открытия файла.

Хотя этот пример не устанавливает флажок OFN_EXPLORER, он по умолчанию показывает диалоговое окно Открыть (Open) в стиле Проводника. Однако, если вы хотите установить фильтр - процедуру или пользовательский шаблон и хотите иметь пользовательский интерфейс в стиле Проводника, вы должны установить флажок OFN_EXPLORER.

OPENFILENAME ofn;			// структура стандартного диалогового окна
char szFile[260]; // буфер для имени файла
HWND hwnd; // окно владельца
HANDLE hf; // дескриптор файла

// Инициализация OPENFILENAME
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd;
ofn.lpstrFile = szFile;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

// Покажем диалоговое окно Открыть (Open).

if (GetOpenFileName(&ofn)==TRUE)
hf = CreateFile(ofn.lpstrFile, GENERIC_READ,
0, (LPSECURITY_ATTRIBUTES) NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
(HANDLE) NULL);


 

Отображение диалогового окна Печать (Print)

Эта статья описывает типовой код, который показывает диалоговое окно Печать (Print), так что пользователь может выбирать параметры для печати документа. Типовой код сначала инициализирует структуру PRINTDLG, а затем вызывает функцию PrintDlg, чтобы показать диалоговое окно.

Этот пример устанавливает флажок PD_RETURNDC в элементе Flags структуры PRINTDLG. Это заставляет функцию PrintDlg возвратить в элементе hDC дескриптор контекста устройства для выбранного принтера. Вы можете использовать дескриптор, чтобы выполнить вывод данных на принтер.

При вводе данных, типовой код устанавливает элементы hDevMode и hDevNames в значение ПУСТО (NULL). Если функция возвращает значение ИСТИНА (TRUE), эти элементы возвращают дескрипторы структурам DEVMODE и DEVNAMES, содержащим вводимые данные пользователем и информацию о принтере. Вы можете использовать эту информацию, чтобы подготовить вывод данных, которые будут пересланы в выбранный принтер.

PRINTDLG pd;
HWND hwnd;

// Инициализация PRINTDLG.
ZeroMemory(&pd, sizeof(PRINTDLG));
pd.lStructSize = sizeof(PRINTDLG);
pd.hwndOwner = hwnd;
pd.hDevMode = NULL; // Не забудьте освободить или сохранить hDevMode.
pd.hDevNames = NULL; // Не забудьте освободить или сохранить hDevNames.
pd.Flags = PD_USEDEVMODECOPIESANDCOLLATE | PD_RETURNDC;
pd.nCopies = 1;
pd.nFromPage = 0xFFFF;
pd.nToPage = 0xFFFF;
pd.nMinPage = 1;
pd.nMaxPage = 0xFFFF;


if (PrintDlg(&pd)==TRUE)
{
// GDI обращается к выполнению вывода данных.
// После выполнения удаляем DC.

DeleteDC(pd.hDC);
}


Установка параметров страницы для печати

Эта статья описывает типовой код, который показывает диалоговое окно Параметры страницы (Page Setup), так что пользователь может выбирать атрибуты страницы для печати, такие как тип бумаги, источник бумаги, ориентация страницы и поля страницы. Типовой код сначала инициализирует структуру PAGESETUPDLG, а затем вызывает функцию PageSetupDlg, чтобы показать диалоговое окно.

Этот пример устанавливает флажок PSD_MARGINS в элементе Flags и использует элемент rtMargin, чтобы определить первоначальные значения полей. В нем устанавливается флажок PSD_INTHOUSANDTHSOFINCHES, который гарантирует, что диалоговое окно выражает размеры поля страницы в тысячных долях дюйма.

При вводе данных, типовой код устанавливает элементы hDevMode и hDevNames в значение ПУСТО (NULL). Если функция возвращает значение ИСТИНА (TRUE), то функция использует эти элементы, чтобы возвратить дескрипторы структурам DEVMODE И DEVNAMES, содержащим вводимые данные от пользователя и информацию о принтере. Вы можете использовать эту информацию, чтобы приготовить вывод данных, которые будут пересланы в выбранный принтер.

В пример также включена фильтр - процедура PagePaintHook, чтобы настраивать рисунок состава макета страницы.

PAGESETUPDLG psd;    		// структура стандартного диалогового окна
HWND hwnd; // окно владельца

// Инициализация PAGESETUPDLG
ZeroMemory(&psd, sizeof(PAGESETUPDLG));
psd.lStructSize = sizeof(PAGESETUPDLG);
psd.hwndOwner = hwnd;
psd.hDevMode = NULL; // Не забудьте освободить или сохранить hDevMode.
psd.hDevNames = NULL; // Не забудьте освободить или сохранить hDevNames.
psd.Flags = PSD_INTHOUSANDTHSOFINCHES | PSD_MARGINS | PSD_ENABLEPAGEPAINTHOOK;
psd.rtMargin.top = 1000;
psd.rtMargin.left = 1250;
psd.rtMargin.right = 1250;
psd.rtMargin.bottom = 1000;
psd.lpfnPagePaintHook = PaintHook;

if (PageSetupDlg(&psd)==TRUE)
{
// Здесь проверим значения размера бумаги и полей страницы
}

Следующий пример показывает типовую фильтр - процедуру PagePaintHook, которая рисует прямоугольник поля страницы в области макета страницы:

BOOL CALLBACK PaintHook(HWND hwndDlg, UINT uMsg, WPARAM wParam,
LPARAM lParam)

{
LPRECT lprc;
COLORREF crMargRect;
HDC hdc, hdcOld;

switch (uMsg)
{
// Нарисуем поля прямоугольника.
case WM_PSD_MARGINRECT:
hdc = (HDC) wParam;
lprc = (LPRECT) lParam;
// Получим системный цвет выделения.
crMargRect = GetSysColor(COLOR_HIGHLIGHT);
// Создаем штрих пунктирное перо для системного выделения цветом
// и выберем его в DC макета страницы.


hdcOld = SelectObject(hdc, CreatePen(PS_DASHDOT, .5, crMargRect));
// Рисуем поля прямоугольника.
Rectangle(hdc, lprc->left, lprc->top, lprc->right, lprc->bottom);
// Возвращаем предыдущее перо DC.
SelectObject(hdc, hdcOld);
return TRUE;
default:
return FALSE;
}
return TRUE;
}



Поиск текста

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

Код для отображения и управления диалоговым окном Заменить (Replace) сходен с вышеупомянутым диалогом, за исключением того, что он использует функцию ReplaceText, чтобы показать диалоговое окно. Диалоговое окно Заменить (Replace) также посылает сообщения в ответ на щелчок пользователя по кнопке Заменить (Replace) и Заменить все (Replace All).

Чтобы использовать диалоговое окно Найти (Find) или Заменить (Replace), вы должны выполнить три отдельные задачи:

  1. Получить идентификатор зарегистрированного сообщения FINDMSGSTRING.
  2. Показать диалоговое окно.
  3. Обработать сообщения FINDMSGSTRING, когда диалоговое окно открыто

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

UINT uFindReplaceMsg;  		// идентификатор сообщения для FINDMSGSTRING
uFindReplaceMsg = RegisterWindowMessage(FINDMSGSTRING);

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

FINDREPLACE fr;      		// структура стандартного диалогового окна
HWND hwnd; // окно владелец
CHAR szFindWhat[80]; // буфер, принимающий строку
HWND hdlg = NULL; // дескриптор диалогового окна Найти (Find)

// инициализация FINDREPLACE
ZeroMemory(&fr, sizeof(FINDREPLACE));
fr.lStructSize = sizeof(FINDREPLACE);
fr.hwndOwner = hwnd;
fr.lpstrFindWhat = szFindWhat;
fr.wFindWhatLen = 80;
fr.Flags = 0;
hdlg = FindText(&fr);

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

Чтобы контролировать сообщения, посланные из диалогового окна, ваша оконная процедура должна проверять зарегистрированное сообщение FINDMSGSTRING и обрабатывать значения, переданные в структуру FINDREPLACE как в примере ниже:

LPFINDREPLACE lpfr;

if (message == uFindReplaceMsg){
// Получим из lParam указатель на структуру FINDREPLACE.

lpfr = (LPFINDREPLACE)lParam;

// Если флажок установлен FR_DIALOGTERM, значит дескриптор,
// идентифицирующий диалоговое окно, неверный.


if (lpfr->Flags & FR_DIALOGTERM)
{
hdlg = NULL;
return 0;
}

// Если флажок установлен FR_FINDNEXT, то вызывается определяемая программой
// подпрограмма поиска, чтобы найти затребованную строку.


if (lpfr->Flags & FR_FINDNEXT)
SearchFile(lpfr->lpstrFindWhat,
(BOOL) (lpfr->Flags & FR_DOWN),
(BOOL) (lpfr->Flags & FR_MATCHCASE));
return 0;
}