VC2008 MFCでMDIベースのアプリケーションを作成しています。
// ここでViewを表示したくない
doc = m_docTemplate->OpenDocumentFile(text, FALSE);
doc->Read(...);
// doc->Read()の後のここでViewを表示したい
としてdocで大量のファイルを読んだ後にViewを表示させたいのですが
表示方法がわかりません。
どなたかご教授頂きたいのですが...
宜しくお願い致します。
言っている意味をいまいち理解してないかもしれませんが、
OpenDocumentFile()はviertualなのだから、継承したクラスで
好きなようにオーバーライドすればよいことですよねぇ。
・・・簡単なはずなんですが、そうゆうことぢゃないんでしょうか(vv;)。
ご返信ありがとうございます。
わかりづらい説明ですみません。
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でデータ取得すれば
よさそうです。
結果がわかり次第、こちらで報告致します。
CDocumentのOnOpenDocument()もOnNewDocument()もNGでした。
OnNewDocument() メニュー新規作成からしか呼ばれない。
OnOpenDocument() CDocument::OnOpenDocument()前に
データ読込みのプログレスバーを表示できない。
引き続き、親切な方の書込みをお待ちしております。
う〜んと、CDocTemplate::OpenDocumentFile()を好きなように
書き換えれば、好きな動作にできますよねぇ。と言っているのです。
面倒なので手順を説明すると
1.CSingleDocTemplateを継承したクラス「毒てんぷら」を作る
2.CDocTemplate::OpenDocumentFile()のソースコードをコピって
「毒てんぷら」にメンバOpenDocumentFile()を追加する。
3.現在使用している(おそらくCSingleDocTemplate)ドキュメント
テンプレートクラスを「毒てんぷら」に変更する。
4.追加したOpenDocumentFile()の中身を自分の好きな動作に
書き換える(FrameのCreateをやめるとかでっかいファイルを
読み込む動作を追加するとか、何でもOK)。
そもそもMFCはその名の通り基本的な枠組みを決めているだけであって、
気に入らなければ変更して使うのが本筋です。
あり物の組み合わせだけで何とかしようとするのは、
自分には奇異に感じられます。
OpenDocumentFileの第2引数のBOOL値は
CDocTemplate::InitialUpdateFrame(...)に引き渡してるので
これの中みて、何してるか真似するって手もありますね
ただ、
「何がしたくて」、CDocTemplateまで掘り下げて弄ってるのかわからん。
>OpenDocumentFileの第2引数のBOOL値は
実際のところ、これにFALSEを渡してもスレ主さんの要望どおりの動きには
ならないことは確認済みです。マニュアルには「BOOL bMakeVisible ドキ
ュメントを保持するウィンドウを表示するかどうかを決定する値。」
とありますが、MFCのコードを見ると無条件にフレームウインドウを
作成しています。フレームやビューにWM_CREATEが来る前にデータを読み込
みたいということは、割と頻繁にあるので、自分はOpenDocumentFile()
はほぼ常にオーバーライドの対象としています。
仲澤@失業者さん
OpenDocumentFile()のオーバーライドの方法は理解できました。
できるものであればあり物の組み合わせで
何とかできたらなぁと思いました。
あり物を探す労力よりも作った方が早そうなので
今回はOpenDocumentFile()を呼ばずに
CreateNewDocument()とかCreateNewFrame()を自力で呼ぶ関数作って
対応しようと思います。
ありがとうございました。
TRUEをわたせば、目的のタイミングとは違えど「表示する」ことはできる
つまり、TRUEを渡すことで、どっかで表示させているはず
TRUEが、どこに引き渡されているかをおっかけていけば「表示する」というソースにたどり着く
それを「真似」して、Readのあとにいれればいいのでは?
ということです
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);
ツイート | ![]() |