void CTestDlg::OnButton1()
{
CPrintDialog dlg(FALSE);
if (dlg.DoModal() != IDOK) {
return;
}
CDC* pDC = CDC::FromHandle(dlg.GetPrinterDC());
BOOL b = pDC->IsPrinting();
pDC->DeleteDC();
}
このときのIsPrinting()の値がFALSEになるのですが、
これってMFCのOnDraw()などを通さないと使えないフラグなのでしょうか?
最終的には、渡されたHDCだけで、それが印刷かどうかを判断したいのですが。
よろしくお願いいたします。
MSDNを見てみるとCDC::IsPrintingの説明には以下のように書いてあります。
「CDC オブジェクトが現在印刷中の場合は 0 以外を返します。それ以外の場合は 0 を返
します。」
この文面をそのまま取るなら印刷中であるかどうかを判定するフラグなので
印刷用のDCであるかどうかを判定する為のものでは無いと思います。
従って用途を間違っていると思います。
どういう理由で印刷用のDCかどうかを判定したいのかまで説明してくれれば、
何らかの有益な返信がつくかもしれません。
あと、開発環境に関する記述は質問毎に毎回入れてください。
例え前に書込みがあったとしてもそれをわざわざ見に行く人は殆どい無いと思います。
もし初めての書込みなら尚の事、開発環境の説明をお願いします。
> どういう理由で印刷用のDCかどうかを判定したいのかまで説明してくれれば、
> 何らかの有益な返信がつくかもしれません。
ある自作クラスの中に、CDC*を引数に取って
そこに自分自身を描画するメンバ関数を用意してあるのですが、
そのときに印刷時と画面時とで、表示内容を分けたいのです。
また、自作クラス自体はSDIでもダイアログでも使えるので、
今回のようにOnDraw()からではなくCPrintDialogからでも
区別無く使えるようにしたいと思っています。
となると、CPrintDialogのDCに対して
さらに初期情報をセットするものがあるのでしょうか。
> あと、開発環境に関する記述は質問毎に毎回入れてください。
CDCやCPrintDialogが出てくるので、MFCだという説明を端折ってしまいました。
失礼しました。
いえ、開発環境のバージョンとかもお願いします。
MFCの実装もバージョンによって少し違う事がありますし、
IDE上の操作の話になった時にバージョンがわからないと
話が通りにくくなるので最初に説明しておくほうが良いと思います。
考え方だけの話になりますけれど、
表示したイメージをそのまま描画すると言うコンセプトから言うと
実際には描画先の解像度とか縦横のサイズがわかれば、そこから表示イメージと
同じような描画は可能になるので基本的には印刷時かどうかの判定は必要ない事に
なります。現状のMFCの実装で印刷時の処理かどうかを判定する必要があるので
あれば、DCと一緒に描画モードも引数でもらうようにするのが一番話が早いと
思いますよ。
> いえ、開発環境のバージョンとかもお願いします。
重ねて失礼しました。
実際の開発はVC2005で行っていますが、今回の最初のソースはVC6で書きました。
OSはXPです。
> 表示したイメージをそのまま描画すると言うコンセプトから言うと
> 実際には描画先の解像度とか縦横のサイズがわかれば、そこから表示イメージと
> 同じような描画は可能になるので基本的には印刷時かどうかの判定は必要ない事に
> なります。
選択枠や方眼紙状のグリッドなど、
画面描画のときのみ表示したいものがあるのです。
MFCのソースを追いかけてみましたが、
void CView::OnFilePrint()のところで、CDC型のdcPrintに対して、
dcPrint.m_bPrinting = TRUE;
とやっている箇所がありました。
つまり、このm_bPrintingがCDC::IsPrinting()の戻り値で、
印刷開始前に自分でセットしておくもののようです…。
> 現状のMFCの実装で印刷時の処理かどうかを判定する必要があるので
> あれば、DCと一緒に描画モードも引数でもらうようにするのが一番話が早いと
> 思いますよ。
DCを引数に取る関数に「bPrinting」の引数も追加し、この値を
CDC* pDC = CDC::FromHandle(hDC);
pDC->m_bPrinting = bPrinting;
としてみたところ、
内部で描画処理内でIsPrinting()を参照することができました。
この方法でいけそうです。
ありがとうございます。
もう終了していますが、一応書いておきます。
GetDeviceCaps(hdc, TECHNOLOGY);
で DT_RASPRINTER が返されたときはプリンタDCだと判断できます。
上記の処理を
CDC* pDC = CDC::FromHandle(hDC);
if (pDC->GetDeviceCaps(TECHNOLOGY)) {
pDC->m_bPrinting = bPrinting;
}
と置き換えておきました。
このほうが、間違えて印刷以外のDCを渡されても安全ですね。
ありがとうございます。
if (pDC->GetDeviceCaps(TECHNOLOGY) == DT_RASPRINTER)
でした。すみません。
余計なお節介かもしれませんが…
もしあなた以外にもそのソースもしくはモジュールを利用する人がいるなら
コメントはちゃんとつけておいた方がいいですよ
CDC::IsPrinting()本来の用途とは違う意味で使ってしまっているので
> CDC::IsPrinting()本来の用途とは違う意味で使ってしまっているので
そうなのですか?
CDC::m_bPrintingのフラグはCView::OnFilePrint()の中で
手動でセットされてビューのOnDraw()に渡されているようなので、
このフレームワークを通さないCPrintDialog経由での印刷も
同じようにこのフラグを立ててから各描画に渡せばよいのかと思ったのですが、
こういう使いかたは誤っていますでしょうか?
実際に使われている意味と同じ意味で使っているならOKだと思います。
CDC::m_bPrintingは印刷中である事を示すフラグですから
実際に印刷用の描画を行うタイミングであれば、OKなのだと思います。
但し、プレビュー描画を印刷中と呼んで良いか等を考えますと
素直に pDC->GetDeviceCaps(TECHNOLOGY) == DT_RASPRINTERで判定するのが
一番問題ないかなと思います。
本当に欲しい情報はそのDCが印刷中かどうかではなくて
プリンタ用のDCかどうかをほしいわけですから
厳密な意味では違う用途であると考えて良いと思います。
実際に印刷中であるからプリンタ用だろうと考える事はできても
プリンタ用のDCであるから常に印刷中かと言うとそうでは無いという事になりますので。
あと、良く考えたら前に挙げた例はよくないかもしれませんね。
プレビュー描画に関しては内部的には印刷中で扱っているかもしれません。
確認していませんのであしからず。