Эта тема описывает типовой код, который показывает на экране набор страниц Свойства печати (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; } |