Эта тема описывает типовой код, который показывает на экране набор страниц Свойства печати (Print Property Sheet), так что пользователь может выбрать варианты печати документа. Типовой код сначала размещает и инициализирует структуру PRINTDLGEX, затем вызывает функцию PrintDlgEx, чтобы показать на экране вкладку свойств.
Типовой код устанавливает флажок PD_RETURNDC в члене Flags структуры PRINTDLG. Это заставляет функцию PrintDlgEx возвратить дескриптор контекста устройства выбранного принтера в члене hDC структуры. Вы можете использовать дескриптор в функциях, которые формируют изображение вывода данных, отправленных принтеру.
При вводе данных, типовой код устанавливает члены hDevMode и hDevNames в значение ПУСТО (NULL). Если функцией возвращено значение S_OK, эти члены возвращают дескрипторы, а структуры DEVNAMES содержат введенные данные пользователем и информацию о принтере. Вы можете использовать эту информацию, чтобы подготовить вывод данных, которые были отправлены в выбранный принтер.
После завершения операции печати, типовой код освобождает буфера DEVMODE и DEVNAMES и вызывает функцию, которая удаляет контекст устройства.
Пример
HRESULT DisplayPrintPropertySheet(
HWND hWnd // Окно, которое владеет вкладками свойств.
)
{
HRESULT hResult;
LPPRINTDLGEX pPDX = NULL;
LPPRINTPAGERANGE pPageRanges = NULL;
// Размещение структуры PRINTDLGEX.
pPDX = (LPPRINTDLGEX)GlobalAlloc(GPTR, sizeof(PRINTDLGEX));
if (!pPDX)
return E_OUTOFMEMORY;
// Размещение массива структур PRINTPAGERANGE.
pPageRanges = (LPPRINTPAGERANGE) GlobalAlloc(GPTR,
10 * sizeof(PRINTPAGERANGE));
if (!pPageRanges)
return E_OUTOFMEMORY;
// Инициализация структуры PRINTDLGEX.
pPDX->lStructSize = sizeof(PRINTDLGEX);
pPDX->hwndOwner = hWnd;
pPDX->hDevMode = NULL;
pPDX->hDevNames = NULL;
pPDX->hDC = NULL;
pPDX->Flags = PD_RETURNDC | PD_COLLATE;
pPDX->Flags2 = 0;
pPDX->ExclusionFlags = 0;
pPDX->nPageRanges = 0;
pPDX->nMaxPageRanges = 10;
pPDX->lpPageRanges = pPageRanges;
pPDX->nMinPage = 1;
pPDX->nMaxPage = 1000;
pPDX->nCopies = 1;
pPDX->hInstance = 0;
pPDX->lpPrintTemplateName = NULL;
pPDX->lpCallback = NULL;
pPDX->nPropertyPages = 0;
pPDX->lphPropertyPages = NULL;
pPDX->nStartPage = START_PAGE_GENERAL;
pPDX->dwResultAction = 0;
// Вызов вкладки свойств Печать (Print).
hResult = PrintDlgEx(pPDX);
if ( (hResult == S_OK) &&
pPDX->dwResultAction == PD_RESULT_PRINT) {
// Пользователь щелкнул по кнопке Печать (Print), т. о.
// используется DC и другая информация возвращаемая в
// структуру PRINTDLGEX, чтобы напечатать документ
}
if (pPDX->hDC != NULL)
DeleteDC(pPDX->hDC);
if (pPDX->hDevMode != NULL)
GlobalFree(pPDX->hDevMode);
if (pPDX->hDevNames != NULL)
GlobalFree(pPDX->hDevNames);
return hResult;
}
|