印刷ダイアログで選択したプリンタの情報取得

[戻る]
ゲキアツ 2014/03/29(土) 11:22:03
またお世話になります。

MFC, SDI アプリで印刷を行います。
プリンタの余白を取得したいのですが、既定のプリンタの余白は下記のコードで取得でき
ます。
しかし、印刷ダイアログで選択したプリンタの余白の取得方法が解りません。
何かヒントでも教えて戴きたく、よろしくお願いいたします。

CPrintDialog pd(FALSE);
pd.GetDefaults();
CDC dc;
dc.Attach(pd.m_pd.hDC);
int nPMLeft = (254*dc.GetDeviceCaps(PHYSICALOFFSETX)/dc.GetDeviceCaps
(LOGPIXELSX)+5)/10;    // 左余白
int nPMTop = (254*dc.GetDeviceCaps(PHYSICALOFFSETY)/dc.GetDeviceCaps(LOGPIXELSY)
+5)/10;    // 上余白

ITO 2014/03/29(土) 19:05:18
コードは、どこに記述していますか?
少なくとも
>CPrintDialog pd(FALSE);
>pd.GetDefaults();
は、
 CView::OnInitialUpdate()
内に、
>CDC dc;
>dc.Attach(pd.m_pd.hDC);
>int nPMLeft = (254*dc.GetDeviceCaps(PHYSICALOFFSETX)/dc.GetDeviceCaps
(LOGPIXELSX)+5)/10;    // 左余白
>int nPMTop = (254*dc.GetDeviceCaps(PHYSICALOFFSETY)/dc.GetDeviceCaps>>
(LOGPIXELSY)
>+5)/10;    // 上余白
は、
void CWaveMonView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
内に記述しないとまずいと思います。
CDCは、「(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)」
ないの/**/を外して使います。

ITO 2014/03/29(土) 19:22:59
追記、
CPageSetupDlgを使うとm_psd構造体でマージンが取得できます。
例
 CPrintDialog dlg(FALSE, PD_SELECTION | PD_USEDEVMODECOPIES);
マージンの情報は、
 OnBeginPrinting以降で、m_psd構造体から得ないとまずいと思います。

ゲキアツ 2014/03/30(日) 17:13:15
ITO様、有り難うございます。
未熟ゆえに、教えて戴いていることがよく理解できません。

1.
OnInitialUpdate()内に CPrintDialog pd(...); を記述し、
OnBeginPrinting(...)内に dc.Attach(pd.m_pd.hDC); を記述すると、
「pd」が両関数をまたぐので、ビルドエラーになります。

2.
またそれとは別に、CPageSetupDialog を使うコードを OnBeginPrinting(...)内に、
次のように書いてみましたが、マージンを取得しません。
CPageSetupDialog psd(PSD_INHUNDREDTHSOFMILLIMETERS | PSD_MARGINS, this);
int nPMLeft = psd.m_psd.rtMargin.left * 100;
int nPMTop = psd.m_psd.rtMargin.top * 100;
CPageSetupDialog は設定するダイアログで、取得するのとは違うような気がするのです
が、勉強してみます。

みい [E-Mail] 2014/03/31(月) 12:01:54
ん?GetDefaults(規定)→DoModal(プリンタ選択)でその後は同じで
いけたと思うんですが…(VC6の頃だから今は違うのかしら)

ITO 2014/03/31(月) 13:36:28
説明不足でした。
OnInitialUpdate()内は、
CPrintDialog pd(FALSE);
pd.GetDefaults();
CDC dc;
dc.Attach(pd.m_pd.hDC);
で
既定のプリンタの余白を取得します。

OnBeginPrinting(...)内は、

dcの代わりに
void CView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
を
void CView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
に変更して、pDCを使います。
なので、
>CDC dc;
>dc.Attach(pd.m_pd.hDC);
はなしでpDCをそのまま使います。
ではどうでしょうか?

>CPageSetupDialog は設定するダイアログで、取得するのとは違うような気がするので
>すが、勉強してみます。
こちらは、ソフトでマージン等を設定するときに使います。
今回はプリンターの設定情報を使うので違いました。
失礼しました。

ゲキアツ 2014/03/31(月) 19:14:35
[[解決]]
みい様、有り難うございます。

ITO様、出来ました!
void CView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
内で、この pDC をそのまま GetDeviceCaps(...) に使うだけで、印刷ダイアログで切り
替えたプリンタの余白を取得しました。
ありがとうございました。

古いスレッドには追加発言できません。