- PR -

VC2003 + MFCでの印刷・印刷プレビューについて

1
投稿者投稿内容
なべとし
会議室デビュー日: 2006/12/13
投稿数: 15
投稿日時: 2007-05-22 21:41
カテゴリ的にここが一番近そうだったので、
ここに質問させて頂きます。


分割ウィンドウとタブを組み合わせたメイン画面を持つプログラムを製作しています。
タブ画面ごとにいくつかのビューを持たせて、各ビューごとに別の情報をそれぞれ表示させ、
さらに、各ビューについて印刷・印刷プレビューを行わせるようにしたいと考えています。
どのビューを印刷・印刷プレビューするかは、ダイアログで選択させるようにします。

しかし、分割ウィンドウ上で印刷プレビューをどのようにして実装すればよいか分からず、
なんとか実装したものの正しく印刷・印刷プレビューが行えない状態です。
実装は、以下のようにしています。
・分割ウィンドウを作成する際に、各ビューのポインタを保持する
・印刷か印刷プレビューかを判別し、印刷プレビューの場合はメインウィンドウをShowWindow(SW_HIDE)で
 非表示にし、新しいフレームウィンドウを作成してそこに印刷プレビューを表示する
しかし、
・印刷プレビューで2ページ目以降が正しく表示されない
・印刷が正常に実行されない
といった問題が発生しています。おそらく、ページ情報が正しく設定できていないことが原因だと思うのですが、
それをどうすべきかが分かりません。
このような場合、印刷機能の正しい実装方法は何なのでしょうか。お教えください。
現在の実装のプロジェクトファイルをサンプルコードとして添付いたします。
http://briefcase.yahoo.co.jp/bc/toshimaru_2002/vwp2?.tok=bcW1nHZB7CnrB1fd&.dir=/d5ae&.dnm=PrintSample.zip&.src=bc

よろしくお願い致します。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2007-05-23 01:03
こんばんは。

引用:

なべとしさんの書き込み (2007-05-22 21:41) より:
現在の実装のプロジェクトファイルをサンプルコードとして添付いたします。
http://briefcase.yahoo.co.jp/bc/toshimaru_2002/vwp2?.tok=bcW1nHZB7CnrB1fd&.dir=/d5ae&.dnm=PrintSample.zip&.src=bc



サンプルコード拝見しました。
…で、サンプルのためか結構バグだらけですね(*_*;

引用:

・印刷プレビューで2ページ目以降が正しく表示されない
・印刷が正常に実行されない
といった問題が発生しています。



・サンプルでは印刷プレビューは1ページ目から出ていません。
 まあコードを見る限り、まともに実装できていないので当たり前ですが。
・印刷ボタンが利いていません。ボタンが利くように修正しましたが、
 その後の処理も、きちんと実装できていないので異常終了しました。

引用:

このような場合、印刷機能の正しい実装方法は何なのでしょうか。お教えください。



”このような場合”と言われても、そんなに一般的な造りではあまりない気がしますが…
複数のビューがある場合には、印刷/印刷プレビューしようとしているビューへ
ちゃんとコマンドルーティングできていれば、おおよそ上手くいくと思いますが。
今回の造りでは、どうなんでしょうね!?

私事ですが…
以前MFCでVisualStudio風の製品を開発したことがあります。
そのときの画面は、リサイズ可能コントロールバー(ドッキングバー)とタブ付MDIでを構成しました。
ちゃんとドッキングバー内、MDIチャイルド内のビューを印刷/印刷プレビューできましたよ。

僭越ながらアドバイスさせてもらうと…
MFCはすこし凝ったことをしようと、すぐ破綻することが多いので、
いきなり凝ったことをしようとせず、技術的にできる/できないを見極めながら、
少しずつ慎重に開発するのがコツだと思います。
あとうまくいかないときはMFCのソース内部まで踏み込んでデバッグすると、
原因が発見しやすいですよ。
とっちゃん
大ベテラン
会議室デビュー日: 2005/07/19
投稿数: 203
投稿日時: 2007-05-23 12:27
サンプルはざっと見ても、MFCの印刷機構をフォローできていないので、まともに動く方がすごい不思議という状況のものですね。

MFCの印刷機構は非常にいびつな形をしています。そのため、どこでなにをどのように使っているのか?
どのクラスとどのクラスが連動しているのか?をきちんと見極めていないとカスタマイズできません。

どこまでMFCの恩恵にあずかるか?どこから自前で頑張るか?次第ですが、コードから推察した範囲で想定できるものでは、MFCのフォローは期待できないような気がします。

印刷そのものについては、主に CView, CWinApp, CPrintDialog が
プレビューについてはこれ以外に、CPrintPreview, CFrameWnd が影響します。

あくまでも主だったものですので、それ以外にも影響するか所はありますが。

まずは、スケルトンで OnFilePrint から先をMFCの中まで含めて一行ずつステップ実行から始めてみてはいかがでしょうか。

MFCの恩恵にあずからずにというのであれば、無理して合わせることなく、一切使わないようにして設計することをお勧めします。
中途半端に使おうとすると泥沼にはまりますよ。

_________________
// とっちゃん(高萩 俊行)@わんくま同盟
// とっちゃん’Blog
// MS-MVP for Developer Tools - Visual C++
// WindowsInstallerの話題はhttp://www.freeml.com/msiまで
なべとし
会議室デビュー日: 2006/12/13
投稿数: 15
投稿日時: 2007-05-23 23:01
とっちゃんさん、Tdnr_Symさん、ご回答ありがとうございます。
とりあえず、印刷機構が正しく実装されていないということは分かりました。


>複数のビューがある場合には、印刷/印刷プレビューしようとしているビューへ
>ちゃんとコマンドルーティングできていれば、おおよそ上手くいくと思いますが。

動的にフレーム・ビューを生成せずとも、普通に分割ウィンドウ上のビューで印刷コマンドを実行すれば上手くいくのでしょうか?
最初にそう実装した際は上手くいきませんでしたが、もう一度そこからやってみようかと思います。

お二人のご回答からですと、MFCの印刷機構は厄介なしろものであるようですね(MFC自体が厄介ですが)
ATLやWTLにも印刷用のクラスはありますが、こちらのほうはすっきりとした構成なのでしょうか?
わかる範囲でご教授頂けましたら幸いかと存じます。
とっちゃん
大ベテラン
会議室デビュー日: 2005/07/19
投稿数: 203
投稿日時: 2007-05-24 12:30
引用:

なべとしさんの書き込み (2007-05-23 23:01) より:

ATLやWTLにも印刷用のクラスはありますが、こちらのほうはすっきりとした構成なのでしょうか?
わかる範囲でご教授頂けましたら幸いかと存じます。



WTL は使ってないので分かりませんが、ATL に印刷用のクラスなんてなかったと思うのですが?
もしかして、最近できた?

ATL は元々 ActiveX Control(OCX) の開発用として軽量かつコンパクトを目指して開発されてるので、OCX では面倒をみない印刷関係はサポートされていないと思っていたのですが。
もし、あるのならクラス名だけでも教えていただけると有難いです。
_________________
// とっちゃん(高萩 俊行)@わんくま同盟
// とっちゃん’Blog
// MS-MVP for Developer Tools - Visual C++
// WindowsInstallerの話題はhttp://www.freeml.com/msiまで
なべとし
会議室デビュー日: 2006/12/13
投稿数: 15
投稿日時: 2007-05-24 14:03
とっちゃんさん

>WTL は使ってないので分かりませんが、ATL に印刷用のクラスなんてなかったと思うのですが?

すいません。書き方が悪かったです。印刷用クラスはWTLの方にあってATLにはない、であっていると思います。
ATL/WTLと書くべきでした。失礼いたしました。
1

スキルアップ/キャリアアップ(JOB@IT)