WinXP Pro SP1 + VC++.NET 2003 + MFC です。
MDI でアプリを作っています。
扱うファイルがかなり巨大(500MB以上)なので、その読み込み/保存等のファイル操作
の進行状況をプログレスバーで示したいと思っています。
ドキュメント側からビューをうまく更新するにはどうしたらいいんでしょうか?
ドキュメントからビューを更新と聞いて、パっと思いつくのは UpdateAllDocuments で
す。
ビュー側の OnUpdate でプログレスバーを更新しますが、そのたびにビューの表示も全
部更新していたのではパフォーマンスが悪くなってしまいます。
そこで、ドキュメントが現在どんな状況(読み込み中/保存中/待機中など)にあるか
を取得するメソッドを設け、これによってビュー側でどこ(プログレスバーかメイン表
示か)を更新するかを判断しています。
MDI なので、親フレームにプログレスバーを乗せて、更新状況を MDI 子フレームのメン
バ変数にも持たせ、アクティブな子フレームが変わったらプログレスバーもあわせて更
新します。
流れとしては、ファイル読み込みの進行(in CDocument::OnOpenDocument)→
CDocument::UpdateAllDocuments → CView::OnUpdate → CDocument::状況取得メソッド
(読み込み中ならば)→ CMDIChildWnd::状況更新メソッド(MDI 子フレームのメンバ変
数に進行状況を設定)→ CMDIFrameWnd::プログレスバー更新メソッド となっていま
す。
が、なんとも回りくどい気がしてなりません。
まだ MFC を始めて日が浅く、よくわかっておりません。
このような、巨大なファイルの操作状況をプログレスバーで示すというケースは少なか
らずあると思いますが、そのさいの「定石」とでも言うような方法というのはあるので
しょうか?
ちなみにファイルは既存のものなので、自分で勝手に形式を変えたり、小さいサイズに
分割したりはできません。
>ドキュメントからビューを更新と聞いて、パっと思いつくのは UpdateAllDocuments で
UpdateAllViewsですよね。
これの引数lHintまたはpHintが、
今回のような「どういう更新をすればいいのか」と言うヒントを渡すための引数です。
(このヒントは、そのままOnUpdateの引数に渡されます。)
このヒントの内容は開発者が適当に決めればいいので、
状態を数値コードで管理しているなら、それをlHintに指定するなどすれば良いでしょう。
回りくどいですか?
仕組み的には良く出来た仕組みだと思いますけれど。
MDIの場合、子供のフレームがいくつ出来るかわからないわけなので
当然こうなるよなぁという気がします。
状況によっては同じドキュメントに複数のViewがぶら下がる事もありますしね。
dairygoodsさんも言われていますが、
UpdateAllViewsの引数をうまく使って状況管理をしてやれば、
ウインドウの数に左右されない仕組みになると思います。
この辺の管理の仕組みは作成者の裁量一つですから色々考えてみては
どうでしょうか。
レスありがとうございます
>UpdateAllViewsですよね。
そうでした。マチガエマシタ。
>これの引数lHintまたはpHintが、
>今回のような「どういう更新をすればいいのか」と言うヒントを渡すための引数で
>す。
>(このヒントは、そのままOnUpdateの引数に渡されます。)
それは知っています。
>状態を数値コードで管理しているなら、それをlHintに指定するなどすれば良いでしょ
>う。
こっちは盲点でした。
今まではどのくらい読み込みが進行したかのパーセンテージを lHint に渡していたので
すが、このほうが CDocument::状況取得メソッドも必要なくなってよりスマートです
ね。
>仕組み的には良く出来た仕組みだと思いますけれど。
ありがとうございます。おかげさまで自信がつきました。
>この辺の管理の仕組みは作成者の裁量一つですから色々考えてみては
>どうでしょうか。
はい、もうすこし煮詰めてみることにします。
ありがとうございました。