- ベストアンサー
VC++で全てのウィンドウを印刷
MDIで全てのウィンドウを1つのページに印刷したいのですが、どうしたらよいでしょうか? OnDrawでpDC->IsPrinting()をして印刷なのか通常表示なのかを切り分けているのですが、1つのページしか印刷できません。 どなたか知恵を貸してください。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>1つのページに 全てのビューをひとつのページに・・・? 印刷でOKが押されるとアクティブビューに OnPrint() が送られて、そこから OnDraw() を呼んでいるよう なので、それをオーバーライドして、 ------------XxxxView.h--------------- class CHyhthyView : public CView { protected: // シリアライズ機能のみから作成します。 ~中略~ int m_printindex; // 印刷時順番 ~中略~ }; ------------XxxxView.cpp--------------- void CXxxxView::OnPrint(CDC* pDC, CPrintInfo* pInfo) { // TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください // コメントアウト CView::OnPrint(pDC, pInfo); // 全ビューをループ POSITION post = ::AfxGetApp()->GetFirstDocTemplatePosition(); while(post) { CDocTemplate* doctemp = ::AfxGetApp()->GetNextDocTemplate(post); POSITION posd = doctemp->GetFirstDocPosition(); while(posd) { CDocument* doc = doctemp->GetNextDoc(posd); POSITION posv = doc->GetFirstViewPosition(); for(int i = 0; posv; i++) { CXxxxView* view = (CXxxxView*)doc->GetNextView(posv); view->m_printindex = i; view->OnDraw(pDC); } } } } void CHyhthyView::OnDraw(CDC* pDC) { ~中略~ if(pDC->IsPrinting()) { int x, y; //プリント座標位置 switch(m_printindex) { case 0: x = 0; y = 50; break; } // ここで自分の描画 } } として、OnDraw() 内で m_printindex から座標位置を どうにか合わせてやれば一応できそうな気もします。
その他の回答 (1)
- inakaninn
- ベストアンサー率16% (1/6)
通常MDIの場合、ビュー間の連携はドキュメントクラスから行います。 POSITION pos = CDocument::GetFirstViewPosition(); CView* pView = CDocument::GetNextView( pos ); //後は繰り返しで全ビューのポインターがわかります。 それでビューに印刷すれば良いのすよ。 但し、 ビューのOnDrawからドキュメントのこのような関数を作り呼び出せば、自分自身を再描画し、無限ループに入ります。 だから自分以外のビューのOnDrawと言うのが絶対条件です。
お礼
回答ありがとうございました。 おかげさまでうまく行きました。
お礼
おかげさまで助かりました。 丁寧な説明ありがとうございました。