Вопрос № 59989: Здравствуйте, уважаемые эксперты!
Подскажите пожалуйста каким образом можно стандартными API средствами распечатать какую-то область контекста на принтере?
Спасибо!...
Вопрос № 59.989
Здравствуйте, уважаемые эксперты!
Подскажите пожалуйста каким образом можно стандартными API средствами распечатать какую-то область контекста на принтере?
Спасибо!
Отвечает: Sergey A. Wedensky
Здравствуйте, Наумов Сергей Александрович / snov!
В приложении пример функции, выводящей на печать область rcToPrint контекста hDC в область размером WidthInches x HeightInches дюймов, расположенную в левом верхнем углу листа.
Думаю, при желании доработать сможете сами.
Удачи!
Приложение:
Ответ отправил: Sergey A. Wedensky (статус: 6-ой класс)
Ответ отправлен: 24.10.2006, 10:04 Оценка за ответ: 5 Комментарий оценки: Спасибо!
Отвечает: JohnP
Здравствуйте, Сергей Александрович!
Первый шаг - наладка принтера и получение DC принтера.
Для этого может использоваться PrintDlg, с указанием значения PD_RETURNDC в поле Flags структуры PRINTDLG.
// Проверяем возможность устройства, заданного как pd.hDC, использовать для печати ф-ию BitBlt.
if (!(GetDeviceCaps(pd.hDC, RASTERCAPS) & RC_BITBLT))
{
DeleteDC(pd.hDC);
MessageBox(hwnd,
"Printer cannot display bitmaps.",
"Device Error",
MB_OK);
break;
}
После этого:
// Устанавливаем флаг продолжения, используемый в AbortPrintJob
bPrint = TRUE;
// Регистрируем функцию AbortProc, которая используется для прерывания выполнения задания принтера
SetAbortProc(pd.hDC, AbortProc);
// Показываем немодальное диалоговое окно отмены
hdlgCancel = CreateDialog(hinst, (LPTSTR) "AbortDlg", hwnd, (DLGPROC) AbortPrintJob);
// Блокируе окно приложения
EnableWindow(hwnd, FALSE);
Когда приложение регистрирует AbortProc, GDI вызывает эту процедуру периодически во время выполнения задания принтера, чтобы определить окончание задания. Если пользователь отменит задание, GDI сообщит спулеру печати об удалении журнального файла из очереди печати и о переключении принтера в начальное состояние.
//Пример реализации процедуры отмены печати
BOOL CALLBACK AbortProc(HDC hdc, int nCode)
{
MSG msg;
while (PeekMessage((LPMSG) &msg, (HWND) NULL, 0, 0, PM_REMOVE))
{
// Обработка сообщений для окна диалога отмены
if (!IsDialogMessage(hdlgCancel, (LPMSG) &msg))
{
TranslateMessage((LPMSG) &msg);
DispatchMessage((LPMSG) &msg);
}
}
// возвращаем флаг продолжения печати (FALSE - прекратить печать)
return bPrint;
}
Приложение начинает задание, вызывая ф-ию StartDoc.
После начала задания, приложение может определять отдельные страницы в документе, вызывая ф-ии StartPage и EndPage
и делая соответствующие вызовы отдельных ф-ий GDI внутри этих "областей". После определения последней страницы, документ может быть закрыт вызовом EndDoc.
Следующий пример организовывает печать строки текста и растрового изображения. Строка центрирована в верхней части страницы, указывает имя файла изображения. Изображение центрировано вертикально и горизонтально на странице, печатается в тех же пропорциях, в каких отображается в окне приложения (принцип WYSIWYG).