Last Updated 2002/09/10
Programming Tips Visual C++ MFC 印刷  索 引 
用紙サイズ変更後 用紙サイズ取得
2002/09/10

OnFilePrintSetup() にて用紙サイズを設定後,用紙サイズを取得する.
以下の様でよさそうなものだが取得できない.

void CMyView::OnFilePrintSetup() 
{
    int ret;

    // 「プリンタの設定」ダイアログを生成する
    CPrintDialog pd(TRUE);

    // 「プリンタの設定」ダイアログを表示する
    ret = AfxGetApp()->DoPrintDialog(&pd);
    if(ret == IDOK) {
        PRINTDLG  PRT_DLG;
        LPDEVMODE lpDevMode;

        AfxGetApp()->GetPrinterDeviceDefaults(&PRT_DLG);

        // DEVMODEテーブルを確保する。
        lpDevMode = (LPDEVMODE)GlobalLock(PRT_DLG.hDevMode);
        if(lpDevMode != NULL) {
            CSize PaperSize;

            // ここで、用紙サイズを正常に取得できない。
            PaperSize.cx = lpDevMode->dmPaperWidth;
            PaperSize.cy = lpDevMode->dmPaperLength;

            // DEVMODEテーブルを解放する。
            GlobalUnlock(PRT_DLG.hDevMode);
        }
    }
}
この方法だと次に変更した時に前回設定した用紙サイズが取得される.



Escape(GETPHYSPAGESIZE, 0, NULL, (LPVOID)&size));

を用いれば用紙サイズが取得可能である.



CSize CxxxApp::GetPaperSize()
{
    UpdatePrinterSelection(FALSE);  // デフォルトのプリンタを取得
    CDC dc;
    if(CreatePrinterDC(dc)) {
        CSize size;
        // sizeに紙サイズを取得する
        VERIFY(dc.Escape(GETPHYSPAGESIZE, 0, NULL, (LPVOID)&size));
        // 1インチあたりのピクセル数を取得
        double dPPIX = (double )dc.GetDeviceCaps(LOGPIXELSX);
        double dPPIY = (double )dc.GetDeviceCaps(LOGPIXELSY);
        // mm単位に直す
        size.cx = (int )(floor(((double )size.cx / dPPIX) * 25.4 + .5));
        size.cy = (int )(floor(((double )size.cy / dPPIY) * 25.4 + .5));
        return size;
    } else {
        TRACE("プリンタDCの作成に失敗\n");
        return CSize(210, 297);       // とりあえずA4縦を返す
    }
}

しかし、DEVMODEの dmPaperWidth と dmPaperLength でなぜ取得できないかは不明である.


参照
プリンタの設定
用紙サイズの変更
給紙方法の設定
前後のTips
用紙サイズ変更後 用紙サイズ取得

DSS ProgrammingTipsCGI Ver2.02