Win32 API. Библиотека стандартных диалоговых окон
Страница 29. Установка параметров страницы для печати


Установка параметров страницы для печати

Эта статья описывает типовой код, который показывает диалоговое окно Параметры страницы (Page Setup), так что пользователь может выбирать атрибуты страницы для печати, такие как тип бумаги, источник бумаги, ориентация страницы и поля страницы. Типовой код сначала инициализирует структуру PAGESETUPDLG, а затем вызывает функцию PageSetupDlg, чтобы показать диалоговое окно.

Этот пример устанавливает флажок PSD_MARGINS в элементе Flags и использует элемент rtMargin, чтобы определить первоначальные значения полей. В нем устанавливается флажок PSD_INTHOUSANDTHSOFINCHES, который гарантирует, что диалоговое окно выражает размеры поля страницы в тысячных долях дюйма.

При вводе данных, типовой код устанавливает элементы hDevMode и hDevNames в значение ПУСТО (NULL). Если функция возвращает значение ИСТИНА (TRUE), то функция использует эти элементы, чтобы возвратить дескрипторы структурам DEVMODE И DEVNAMES, содержащим вводимые данные от пользователя и информацию о принтере. Вы можете использовать эту информацию, чтобы приготовить вывод данных, которые будут пересланы в выбранный принтер.

В пример также включена фильтр - процедура PagePaintHook, чтобы настраивать рисунок состава макета страницы.

PAGESETUPDLG psd; // структура стандартного диалогового окна
HWND hwnd; // окно владельца

// Инициализация PAGESETUPDLG
ZeroMemory(&psd, sizeof(PAGESETUPDLG));
psd.lStructSize = sizeof(PAGESETUPDLG);
psd.hwndOwner = hwnd;
psd.hDevMode = NULL; // Не забудьте освободить или сохранить hDevMode.
psd.hDevNames = NULL; // Не забудьте освободить или сохранить hDevNames.
psd.Flags = PSD_INTHOUSANDTHSOFINCHES | PSD_MARGINS | PSD_ENABLEPAGEPAINTHOOK;
psd.rtMargin.top = 1000;
psd.rtMargin.left = 1250;
psd.rtMargin.right = 1250;
psd.rtMargin.bottom = 1000;
psd.lpfnPagePaintHook = PaintHook;

if (PageSetupDlg(&psd)==TRUE)
{
// Здесь проверим значения размера бумаги и полей страницы
}

Следующий пример показывает типовую фильтр - процедуру PagePaintHook, которая рисует прямоугольник поля страницы в области макета страницы:

BOOL CALLBACK PaintHook(HWND hwndDlg, UINT uMsg, WPARAM wParam,
LPARAM lParam)

{
LPRECT lprc;
COLORREF crMargRect;
HDC hdc, hdcOld;

switch (uMsg)
{
// Нарисуем поля прямоугольника.
case WM_PSD_MARGINRECT:
hdc = (HDC) wParam;
lprc = (LPRECT) lParam;
// Получим системный цвет выделения.
crMargRect = GetSysColor(COLOR_HIGHLIGHT);
// Создаем штрих пунктирное перо для системного выделения цветом
// и выберем его в DC макета страницы.


hdcOld = SelectObject(hdc, CreatePen(PS_DASHDOT, .5, crMargRect));
// Рисуем поля прямоугольника.
Rectangle(hdc, lprc->left, lprc->top, lprc->right, lprc->bottom);
// Возвращаем предыдущее перо DC.
SelectObject(hdc, hdcOld);
return TRUE;
default:
return FALSE;
}
return TRUE;
}


 
« Предыдущая статья   Следующая статья »