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

印刷ダイアログで選択したプリンタの情報...
 
通知
すべてクリア

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


ゲキアツ
 ゲキアツ
(@ゲキアツ)
ゲスト
結合: 11年前
投稿: 32
Topic starter  

またお世話になります。

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
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

コードは、どこに記述していますか?
少なくとも
>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
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

追記、
CPageSetupDlgを使うとm_psd構造体でマージンが取得できます。

 CPrintDialog dlg(FALSE, PD_SELECTION | PD_USEDEVMODECOPIES);
マージンの情報は、
 OnBeginPrinting以降で、m_psd構造体から得ないとまずいと思います。


返信引用
ゲキアツ
 ゲキアツ
(@ゲキアツ)
ゲスト
結合: 11年前
投稿: 32
Topic starter  

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 は設定するダイアログで、取得するのとは違うような気がするのです
が、勉強してみます。


返信引用
みい
 みい
(@みい)
ゲスト
結合: 22年前
投稿: 65
 

ん?GetDefaults(規定)→DoModal(プリンタ選択)でその後は同じで
いけたと思うんですが…(VC6の頃だから今は違うのかしら)


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

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


返信引用
ゲキアツ
 ゲキアツ
(@ゲキアツ)
ゲスト
結合: 11年前
投稿: 32
Topic starter  

みい様、有り難うございます。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました