Вывод на печать в Visual C++ MFC

Рейтинг: 0Ответов: 1Опубликовано: 25.03.2011

Не могу разобраться с проблемой. Как вывести на печать текст с альбомной ориентацией (вертикально), не используя диалога принтера? Как заставить принтер извлекать бумагу нужного мне размера, а не формата А4, после окончания печати?

Ответы

▲ 1

Как-то так:

// Получить принтер по умолчанию
PRINTDLG pd;

AfxGetApp()->GetPrinterDeviceDefaults(&pd);

HANDLE mode =  CopyHandle(pd.hDevMode);

// Выбрать установки по умолчанию
LPDEVMODE pMode = (LPDEVMODE) GlobalLock(mode);

if (pMode->dmFields & DM_ORIENTATION)
    pMode->dmOrientation = DMORIENT_LANDSCAPE;

if (pMode->dmFields & DM_PAPERSIZE)
    pMode->dmPaperSize = DMPAPER_A3;

GlobalUnlock(mode);

CopyHandle: чтобы работать со своим хэндлом. Его потом надо будет освободить (когда он уже не будет больше нужен) с помощью GlobalFree.

HANDLE CopyHandle(HANDLE handle)
{
    HANDLE copy = NULL

    if (handle) {
        DWORD length = GlobalSize(h);

        if (copy = GlobalAlloc(GHND, length))
        {
            BYTE* from = (BYTE *)GlobalLock(copy);
            BYTE* to   = (BYTE *)GlobalLock(h);

            CopyMemory(from, to, length);

            GlobalUnlock(copy);
            GlobalUnlock(h);
        }
    }

    return copy;
}