Last Updated 2002/09/03
Programming Tips Visual C++ MFC 印刷  索 引 
ハードコピー
2002/09/03

ディスプレイのデバイスコンテキストを DIB に変換.
プリンターのデバイスコンテキストを StretchDIBits() する.

ディスプレイのデバイスコンテキストとプリンターのデバイスコンテキストは互換性がないので一度 DIB に変換する.

HBITMAP で扱われるビットマップはデバイス依存ビットマップ(DDB)である.
ディスプレイドライバの DDB をプリンタの DC に転送しようと(StretchBlt)すると,プリンタドライバはディスプレイドライバの DDB を自分の DDB と解釈して処理してしまうため,うまく印刷されない.

ディスプレイの DDB をいったんデバイス非依存ビットマップ(DIB)に変換してからプリンタの DC に転送するようにする.


画面のビットマップをプリンタにきれいに出力するには,GetDIBits() を使用して hMemoryDC から DIB データを作る.それを StretchDIBits() を使ってプリンタに出力する.
GetDIBits() は,"samples\sdk\win32\wincap32\dibutil.c" を参照


また以下の方法でも可能.

    RECT     rect;
    GetDesktopWindow() -> GetWindowRect(&rect);

    CDC      dispDC;
    dispDC.CreateDC("DISPLAY", NULL, NULL, NULL);

    CPrintDialog dlg(FALSE);
    dlg.GetDefaults();

    CDC dc;
    dc.Attach(dlg.CreatePrinterDC());
    dc.SetMapMode(MM_LOMETRIC);

    DOCINFO di;
    ZeroMemory(&di, sizeof(di));
    di.cbSize = sizeof(di);
    dc.StartDoc(&di);
    dc.StartPage();
    dc.StretchBlt(0, 0, 2000, -2500,
                  &dispDC, 0, 0, rect.right, rect.bottom,
                  SRCCOPY);
    dc.EndPage();
    dc.EndDoc();


参照
前後のTips
ハードコピー

DSS ProgrammingTipsCGI Ver2.02