Страница 5 из 7 Использование диалогового окна свойств печати Чтобы отобразить диалог свойств печати, необходимо сначала заполнить структуру 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; }
|