Использование стандартных диалогов - Использование диалогового окна свойств печати
ОГЛАВЛЕНИЕ
Использование диалогового окна свойств печати
Чтобы отобразить диалог свойств печати, необходимо сначала заполнить структуру PRINTDLGEX, а затем вызвать функцию PrintDlgEx.
Чтобы заставить функцию PrintDlgEx вернуть контекст устройства (в переменной hDC) выбранного принтера, необходимо установить флаг PD_RETURNDC в переменной Flags структуры PRINTDLG.
Изначально, переменные hDevMode и hDevNames установлены в NULL. Если функция возвратит S_OK, то эти переменные будут содержать дескрипторы на структуры DEVMODE и 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;
// Показываем диалоговое окно свойств печати.
hResult = PrintDlgEx(pPDX);
if ( (hResult == S_OK) &&
pPDX->dwResultAction == PD_RESULT_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;
}