印刷用のOnDrawについて

[戻る]
Fortran使い 2005/08/16(火) 02:08:43
お世話になっております。
VC++でMDIアプリで印刷をしようと思うのですが、子ウィンドに書き出したグラフを印刷
プレビューで見ると左端に小さく表示されてしい使用に耐えられるものではありませ
ん。過去スレにもネット上にもそこそこ情報はあるようですがいまいち釈然としませ
ん。

GetDiviceCapsで印刷可能領域の情報を取得できることと結局はOnDrawが呼び出されてい
るということは理解できました。

OnDraw内で画面表示用とプリント用でスケールを振り分ければよさそうですが、OnDraw
が画面表示のために呼ばれたのかプリントのために呼ばれたのかを判別することはでき
るのでしょうか?

また、他に方法がございましたらアドバイスください。
よろしくお願いします。

Fortran使い 2005/08/16(火) 04:23:05
OnPrintをオーバーライドするのが普通なんですかね。

maura 2005/08/16(火) 09:06:42
ヒント:CPaintDC

maura 2005/08/16(火) 09:12:20
あかん。まちごうた
ヒント:CPrinterDC

たいちう 2005/08/16(火) 09:14:43
こんな感じで、どうかな。

void CHogeView::OnDraw(CDC* pDC)
{
    // サイズの設定
    if (pDC->IsPrinting()) {
        
    } else {
        
    }
    
    // 表示
        
}

dairygoods 2005/08/16(火) 09:36:21
CView::OnPreparePrinting() というのもあります。

たいちう 2005/08/16(火) 10:05:10
印刷で使う領域を

void CHogeView::OnPrint(CDC* pDC, CPrintInfo* pInfo) {
    if (pInfo)
        m_rectPrint = pInfo->m_rectDraw;
    ...
}    

このように、Viewのメンバ変数に入れ、

void CHogeView::OnDraw(CDC* pDC) {
    // サイズの設定
    if (pDC->IsPrinting()) {
        // ここで、m_rectPrintを使う        
    } else
        ...

    ...
}

という方法で調整したのですが、より良い方法がありましたら、
私も是非お教えいただきたいです。

# 古いソースを引っ張り出してきたんで、勘違いあったら勘弁。

PATIO 2005/08/16(火) 10:17:46
MFCを使った時の印刷時の処理の流れをきちんと確認された方がいいと思います。
HELP(MSDN)にもきちんと書いてありますよ。
dairygoodsさんが触れられているCView::OnPreparePrinting()も流れの中の一つになります。
MFCを使っているのであれば、MFCの印刷のフレームワークをうまく利用するのが賢いかと
思います。
あと、OnPrintが内部でOnDrawを呼んでいるのはあくまでもデフォルト実装なので
印刷時に処理を分けたい場合には独自の描画処理をOnPrint内に起こすという方法もあり
ます。
また、OnDraw内で呼んでいる描画処理を独立した関数にしてしまい、
OnDrawからもOnPrintからも呼び出すという形にする方法もあります。
この辺はアイディア次第という気もします。

Fortran使い 2005/08/16(火) 11:35:42
[[解決]]
皆さん、有難うございました。
IsPrinting()による判別でうまくいきました。

PATIOさんの意見もごもっともだと思いますが、私はまだMFCの便利さを実感する前に
MFCに振り回されている段階です。一応ドキュメント類には目を通しているのですが
なかなか身につきません。

便利メンバ関数を探しそれを所持しているクラスを探し、インスタンスのポインタ
をどうやって取得していいのか苦労している段階です。(本末転倒ですが)

MFCの理解も深まるようがんばりたいと思います。

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