4.36.3.7 - Структура PRINTDLG

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

Синтаксис

typedef struct tagPD 
{  				
	DWORD lStructSize;
	HWND hwndOwner;
	HANDLE hDevMode;
	HANDLE hDevNames;
	HDC hDC;
	DWORD Flags;
	WORD nFromPage;
	WORD nToPage;
	WORD nMinPage;
	WORD nMaxPage;
	WORD nCopies;
	HINSTANCE hInstance;
	DWORD lCustData;
	LPPRINTHOOKPROC lpfnPrintHook;
	LPSETUPHOOKPROC lpfnSetupHook;
	LPCTSTR lpPrintTemplateName;
	LPCTSTR lpSetupTemplateName;
	HANDLE hPrintTemplate;
	HANDLE hSetupTemplate;
} PRINTDLG;

Элементы
lStructSize
Определяет размер структуры, в байтах.
hwndOwner
Идентифицирует окно, которое владеет блоком диалога. Этот элемент может быть любым допустимым дескриптором окна, или это может быть значение ПУСТО (NULL), если диалоговое окно не имеет никакого владельца.
hDevMode
Идентифицирует перемещаемый объект глобальной памяти, который содержит структуру DEVMODE. Перед вызовом функции PrintDlg, элементы структуры могут содержать данные, используемые, чтобы инициализировать элементы управления диалогового окна. Когда PrintDlg возвращает значение, элементы структуры определяют состояние управляющих элементов диалогового окна.
Если вы используете структуру, чтобы инициализировать управляющие элементы диалогового окна, вы должны распределить доступное пространство памяти и создать структуру DEVMODE. (Вы должны распределить перемещаемый блок памяти).
Если вы не используете структуру, чтобы инициализировать управляющие элементы диалогового окна, hDevMode может иметь значение ПУСТО (NULL). В этом случае, PrintDlg распределяет память для структуры, инициализирует ее элементы и возвращает дескриптор, который идентифицирует структуру.
Если драйвер устройства для определяемого принтера не поддерживает расширенные режимы устройства, когда PrintDlg возвращает значение,то элемент hDevMode имеет значение ПУСТО (NULL).
Если имя устройства (определенное элементом dmDeviceName структуры DEVMODE) не появляется в разделе [devices (устройства)] WIN.INI, PrintDlg возвращает значение ошибки.
Потому что эта структура - перемещаемый объект глобальной памяти, значение которого в hDevMode может изменяться в ходе выполнения PrintDlg.
Для обсуждения того, как система решает возможный конфликт на уровне данных между значениями определеными элементами hDevMode и hDevNames, см. следующий раздел Замечаний.
hDevNamesDEVNAMES. Эта структура содержит три строки, которые определяют название драйвера, название принтера и имя порта вывода данных. Перед вызовом PrintDlg, элементы структуры содержат строки, используемые, чтобы инициализировать управляющие элементы диалогового окна. Когда PrintDlg возвращает значение, элементы структуры содержат строки, введенные с клавиатуры пользователем. Вызывающая прикладная программа использует эти строки, чтобы создать контекст устройства или информационный контекст.
Если вы используете структуру, чтобы инициализировать управляющие элементы диалогового окна, то должны распределить доступную память и создать структуру DEVNAMES. (Вы должны разместить перемещаемый блок общей памяти.)
Если вы не используете структуру, чтобы инициализировать управляющие элементы диалогового окна, hDevNames может иметь значение ПУСТО (NULL). В этом случае, PrintDlg распределяет память для структуры, инициализирует элементы (при помощи использования названия принтера, определяемого в структуре DEVMODE) и возвращает дескриптор, который идентифицирует ее. Функция PrintDlg использует первое название порта, которое принято в разделе [devices устройств] WIN.INI, когда она инициализирует элементы в структуре DEVNAMES. Например, функция использует "LPT1:" как имя порта, если следующая строка применена в разделее [devices устройств]:

PCL / HP LaserJet=HPPCL,LPT1:,LPT2:

Если и hDevMode, и hDevNames имеют значение ПУСТО (NULL), PrintDlg инициализирует hDevNames, используя текущий принтер, заданный по умолчанию.
Поскольку эта структура - перемещаемый объект глобальной памяти, значение hDevNames может изменяться в ходе выполнения PrintDlg.
Для обсуждения того, как система решает возможный конфликт на уровне данных между значениями определяемыми hDevNames и hDevMode, см. раздел Замечаний позже в этой статье.
hDC
Идентифицирует контекст устройства или информационный контекст, в зависимости от того, определяет ли элемент Flags флажок PC_RETURNIC или PD_RETURNDC. Если никакой флажок не установлен, значение этого элемента неопределено. Если оба флажка установлены, флажок PD_RETURNDC имеет приоритет.
Flags
Набор битовых флажков, который вы можете использовать, чтобы инициализировать стандартное диалоговое окно Печать (Print). Когда блок диалога возвращает значение, он устанавливает эти флажки, чтобы обозначить ввод данных пользователем. Этот элемент может быть комбинацией следующих флажков:

nFromPage
Определяет исходное значение для начального поля редактирования текста страницы. Когда функция PrintDlg возвращает значение, элемент nFromPage определяет, что начальная страница задана пользователем. Это значение правильно, только в том случае, если определен флажок PD_PAGENUMS.
nToPage
Определяет исходное значение для конечного поля редактирования текста страницы. Когда функция PrintDlg возвращает значение, элемент nToPage определяет, что конечная страница задана пользователем. Это значение правильно, только в том случае, если определен флажок PD_PAGENUMS.
nMinPage
Определяет минимальное значение для диапазона страниц, определяемых в редактируемых полях От (From) и До (To).
nMaxPage
Определяет максимальное значение для диапазона страниц, определяемых в редактируемых полях От (From) и До (To).
nCopies
Если элемент hDevMode имеет значение ПУСТО (NULL), то содержит исходный тираж для поля редактирования в блоке Копии (Copies); иначе, элемент dmCopies структуры DEVMODE содержит начальное значение. Когда PrintDlg возвращает значения, этот элемент содержит фактический тираж для печати. Если драйвер принтера не поддерживает многочисленные копии, это значение может быть большее чем одна копия и прикладная программа должна отпечатать все запрошенные копии. Если в элементе Flags установлено значение PD_USEDEVMODECOPIESANDCOLLATE, nCopies, при возврате, всегда устанавливается в 1, а элемент dmCopies в DEVMODE принимает фактический тираж, для печати.
hInstance
Если в элементе Flags установлен флажок PD_ENABLEPRINTTEMPLATE или PD_ENABLESETUPTEMPLATE, hInstance - дескриптор прикладной программы или экземпляра модуля, который содержит шаблон диалогового окна, именованный элементом lpPrintTemplateName или lpSetupTemplateName.
lCustData
Устанавливает определяемые программой данные, которые система передает фильтр (hook) - процедуре, идентифицированной элементом lpfnPrintHook или lpfnSetupHook. Когда система посылает сообщение WM_INITDIALOG фильтр (hook) - процедуре, параметр сообщения lParam - указатель на структуру PRINTDLG, которая была определена, когда диалоговое окно было создано. Фильтр (hook) - процедура может использовать этот указатель, чтобы получить значение lCustData.
lpfnPrintHook
Указатель на фильтр (hook) - процедуру PrintHookProc, которая может обрабатывать сообщения, предназначенные для диалогового окна Печать (Print). Этот элемент игнорируется, если в элементе Flags не установлен флажок PD_ENABLEPRINTHOOK.
lpfnSetupHook
Указатель на фильтр (hook) - процедуру SetupHookProc, которая может обрабатывать сообщения, предназначенные для диалогового окна Параметры печати (Print Setup). Этот элемент игнорируется, если в элементе Flags не установлен флажок PD_ENABLESETUPHOOK.
lpPrintTemplateName
Указатель на строку с символом нуля в конце, которая именует ресурс шаблона диалогового окна в модуле, идентифицированном элементом hInstance. Этот шаблон замещает стандартный шаблон диалогового окна Печать (Print). Этот элемент игноририруется, если в элементе Flags не установлен флажок PD_ENABLEPRINTTEMPLATE.
lpSetupTemplateName
Указатель на строку с символом нуля в конце, которая именует ресурс шаблона диалогового окна в модуле, идентифицированном элементом hInstance. Этот шаблон замещает стандартный шаблон диалогового окна Параметры печати (Print Setup). Этот элемент игноририруется, если в Элементе Flags не установлен флажок PD_ENABLESETUPTEMPLATE.
hPrintTemplate
Если в элементе Flags установлен флажок PD_ENABLEPRINTTEMPLATEHANDLE, hPrintTemplate - дескриптор объекта памяти, содержащего шаблон диалогового окна. Этот шаблон замещает стандартный шаблон диалогового окна Печать (Print).
hSetupTemplate
Если в элементе Flags установлен флажок PD_ENABLESETUPTEMPLATEHANDLE, hSetupTemplate - дескриптор объекта памяти, содержащего шаблон диалогового окна. Этот шаблон замещает стандартный шаблон диалогового окна Параметры печати (Print Setup).

Замечания
Имеется возможность конфликта на уровне данных между значениями, определяемыми элементами hDevNames и hDevMode, потому что элемент wDeviceOffset структуры DEVNAMES, как предполагается, является идентичным элементу dmDeviceName структуры DEVMODE. Если это не так, система решает конфликт на уровне данных при помощи использования значения wDeviceOffset.
Если пользователь отмечает "галочкой" окошко метки Разобрать по копиям (Collate) в стандартном диалоговом окне Печать (Print), но драйвер принтера не поддерживает комплектовку, элемент Flags структуры PRINTDLG, возвращенный при помощи PrintDlg включает в себя флажок PD_COLLATE. Кроме того, элемент dmCollate структуры DEVMODE, идентифицированной элементом hDevMode установливается в COLLATE_TRUE. Если флажок PD_COLLATE установлен, прикладная программа должна симулировать комплектовку.
Если флажок PD_USEDEVMODECOPIESANDCOLLATE установлен, окошко метки Разобрать по копиям (Collate) внешне недоступно, если драйвер принтера не поддерживает комплектовку. Это гарантирует то, что пользователь может только выбирать одну копию, и в элементе nCopies будет единица. Если драйвер поддерживает многочисленные копии, dmCopies будет содержать тираж, а в nCopies будет единица.
При записи в функцию PrintDlg, элемент nCopies структуры PRINTDLG определяет тираж, если флажок PD_USEDEVMODECOPIESANDCOLLATE не установлен. При выходе из PrintDlg, nCopies содержит тираж, если драйвер принтера не поддерживает многочисленные копии. Иначе он устанавливается в единицу. Если nCopies больше чем единица при выходе из PrintDlg, прикладная программа должна отпечатать многочисленные копии документа.

Смотри также
CreateDC, CreateIC, PrintDlg, DEVMODE, DEVNAMES, WM_INITDIALOG

Размещение и совместимость PRINTDLG

Windows NT			Да 
Win95				Да 
Win32s				Да 
Импортируемая библиотека		- 
Заголовочный файл			winspool.h 
Unicode				WinNT
Замечания по платформе		Не имеется

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Владимир Соковиков - 20.04.2002