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 でなぜ取得できないかは不明である.
参照
プリンタの設定
用紙サイズの変更
給紙方法の設定