OpenDocumentFile(title, FALSE)の後にViewを表示するには?

解決


流葉  2009-09-11 03:56:27  No: 70896

VC2008 MFCでMDIベースのアプリケーションを作成しています。

// ここでViewを表示したくない
doc = m_docTemplate->OpenDocumentFile(text, FALSE);
doc->Read(...);

// doc->Read()の後のここでViewを表示したい

としてdocで大量のファイルを読んだ後にViewを表示させたいのですが
表示方法がわかりません。

どなたかご教授頂きたいのですが...

宜しくお願い致します。


仲澤@失業者  2009-09-11 18:58:33  No: 70897

言っている意味をいまいち理解してないかもしれませんが、
OpenDocumentFile()はviertualなのだから、継承したクラスで
好きなようにオーバーライドすればよいことですよねぇ。
・・・簡単なはずなんですが、そうゆうことぢゃないんでしょうか(vv;)。


流葉  2009-09-11 19:33:52  No: 70898

ご返信ありがとうございます。

わかりづらい説明ですみません。

doc = m_docTemplate->OpenDocumentFile(text, TRUE); // FALSEでなくTRUE

と記述するとOpenDocumentFile()を呼び出した時点でViewを表示してしまいます。

OpenDocumentFile()でdocumentを取得
      ↓
Readのデータを、取得したdocumentに格納
      ↓
View表示

としたいです。

doc = m_docTemplate->OpenDocumentFile(text, FALSE);

と記述するとViewは表示しませんがその後のViewの表示方法がわかりません。

よくよく考えると
CDocumentのOnOpenFile()かOnNewDocumentでデータ取得すれば
よさそうです。

結果がわかり次第、こちらで報告致します。


流葉  2009-09-11 19:52:02  No: 70899

CDocumentのOnOpenDocument()もOnNewDocument()もNGでした。

OnNewDocument()  メニュー新規作成からしか呼ばれない。
OnOpenDocument()     CDocument::OnOpenDocument()前に
                     データ読込みのプログレスバーを表示できない。

引き続き、親切な方の書込みをお待ちしております。


仲澤@失業者  2009-09-11 20:24:41  No: 70900

う〜んと、CDocTemplate::OpenDocumentFile()を好きなように
書き換えれば、好きな動作にできますよねぇ。と言っているのです。

面倒なので手順を説明すると
1.CSingleDocTemplateを継承したクラス「毒てんぷら」を作る
2.CDocTemplate::OpenDocumentFile()のソースコードをコピって
    「毒てんぷら」にメンバOpenDocumentFile()を追加する。
3.現在使用している(おそらくCSingleDocTemplate)ドキュメント
    テンプレートクラスを「毒てんぷら」に変更する。
4.追加したOpenDocumentFile()の中身を自分の好きな動作に
    書き換える(FrameのCreateをやめるとかでっかいファイルを
    読み込む動作を追加するとか、何でもOK)。

そもそもMFCはその名の通り基本的な枠組みを決めているだけであって、
気に入らなければ変更して使うのが本筋です。
あり物の組み合わせだけで何とかしようとするのは、
自分には奇異に感じられます。


ryo  2009-09-11 21:41:26  No: 70901

OpenDocumentFileの第2引数のBOOL値は
CDocTemplate::InitialUpdateFrame(...)に引き渡してるので
これの中みて、何してるか真似するって手もありますね

ただ、
「何がしたくて」、CDocTemplateまで掘り下げて弄ってるのかわからん。


仲澤@失業者  2009-09-11 22:33:10  No: 70902

>OpenDocumentFileの第2引数のBOOL値は

実際のところ、これにFALSEを渡してもスレ主さんの要望どおりの動きには
ならないことは確認済みです。マニュアルには「BOOL bMakeVisible ドキ
ュメントを保持するウィンドウを表示するかどうかを決定する値。」
とありますが、MFCのコードを見ると無条件にフレームウインドウを
作成しています。フレームやビューにWM_CREATEが来る前にデータを読み込
みたいということは、割と頻繁にあるので、自分はOpenDocumentFile()
はほぼ常にオーバーライドの対象としています。


流葉  2009-09-11 22:38:49  No: 70903

仲澤@失業者さん

OpenDocumentFile()のオーバーライドの方法は理解できました。

できるものであればあり物の組み合わせで
何とかできたらなぁと思いました。

あり物を探す労力よりも作った方が早そうなので
今回はOpenDocumentFile()を呼ばずに
CreateNewDocument()とかCreateNewFrame()を自力で呼ぶ関数作って
対応しようと思います。

ありがとうございました。


ryo  2009-09-11 22:40:46  No: 70904

TRUEをわたせば、目的のタイミングとは違えど「表示する」ことはできる

つまり、TRUEを渡すことで、どっかで表示させているはず

TRUEが、どこに引き渡されているかをおっかけていけば「表示する」というソースにたどり着く

それを「真似」して、Readのあとにいれればいいのでは?

ということです


流葉  2009-09-12 01:01:54  No: 70905

bMakeVisibleを追っかけると
CDocTemplate::OpenDocumentFile
  CDocTemplate::InitialUpdateFrame
    CFrameWnd::InitialUpdateFrame
となりこの中の
ActivateFrame(nCmdShow);
if (pView != NULL)
    pView->OnActivateView(TRUE, pView, pView);

あたりが表示に関わりそうだと思いました。
OpenDocumentFile()の外からはCFrameWndが取れないため下記のように対応しました。

// ドキュメント取得
doc = pApp->m_docTemplate->CreateNewDocument();
doc->OnOpenDocument(title);
doc->SetTitle(title);
doc->SetPathName(title);

// ドキュメントにデータを格納
doc->Read();

// 表示
CFrameWnd* pFrame = m_docTemplate->CreateNewFrame(doc, NULL);
m_docTemplate->InitialUpdateFrame(pFrame, doc);


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加