- ベストアンサー
MDIでのメニューの変更
VC++ 6.0 を使っています。 MFCを使った、メール関係のソフトを作っています。 サンプル MFCIE では、普段使っているIEのお気に入りの内容が サンプルを動かしたときに表示されます。 今は、MDIの形でソフトをつくっています。 たとえば、サンプル MDIDOCVW のようになっています。 チャイルドウインドの中で、 CHtmlView を表示させ それが選ばれたときに、 メニューを書き換えて お気に入りの内容を加えて表示させたいのですが 上手くゆきません。 アドバイスをお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
参考までに。 http://support.microsoft.com/default.aspx?scid=kb;JA;145857 #機械翻訳なのでかなり怪しい日本語ですが。原文を読むことをお勧めします。
その他の回答 (3)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
> 書き換えのタイミングが悪いのか どのタイミングで行ってるんですか? 参考までに。 http://homepage2.nifty.com/DSS/VCPP/MFC/Menu/MDIMenu.htm
補足
次のような構造です。 BOOL CMDIApp::InitInstance() { InitSmptinst(); InitFilepath(); 中略 CMultiDocTemplate* pMailBoxTemplate; pMailBoxTemplate = new CMultiDocTemplate( IDR_MAILBOXTYPE, RUNTIME_CLASS(CMailBoxDoc), RUNTIME_CLASS(CMailBoxFrame), // custom MDI child frame RUNTIME_CLASS(CMailBoxView)); AddDocTemplate(pMailBoxTemplate); 以下略 そして、スプリットウインドの形で メールボックス を表示させます。 次の関数の中です。 BOOL CMailBoxFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { // 1行, 2列のスプリッターを作成 if (!m_wndSplitter.CreateStatic(this,1,2)) 中略 // すべて動作した場合、3 つの異なるビューを含む 2 つのスプリッター ウィンドウ // ができます。 // set up Favorites menu TCHAR sz[MAX_PATH]; TCHAR szPath[MAX_PATH]; HKEY hKey; DWORD dwSize; CMenu* pMenu; // first get rid of bogus submenu items. pMenu = GetMDIFrame()->GetMenu()->GetSubMenu(3); while(pMenu->DeleteMenu(0, MF_BYPOSITION)); 中略 BuildFavoritesMenu(szPath, 0, pMenu); // return 0; return TRUE; } この結果、最初の親のメニューが 書き換えられていることが判明しました。 確認は、 pMenu = GetMenu()->GetSubMenu(3); を pMenu = GetMenu()->GetSubMenu(4); にすると、 親ウインドウの起動時にもメニューを変更するが それは、3番目(最初は0番)のものにしてあります。 起動時に親ウインドウのメニューを見る。 3番目の項目の内容だけがお気に入りのものになる。 つぎに、メイルボックスを作り 閉じる。 すると、親ウインドのメニューの3番目と4番目ともに お気に入りのものに変わってしまいます。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>pMenu = GetMenu()->GetSubMenu(3); >と同じことをチャイルドウインドウの方から >やりたいのですが、 GetMDIFrame()で親フレームウィンドウ取得するんじゃだめ?
お礼
ありがとうございます。 pMenu = GetMDIFrame()ー>GetMenu()->GetSubMenu(3); としたら、 pMenu は値が確定しました。 書き換えのタイミングが悪いのか 子ウインドウ用のメニューのFavaritesの 項目は変化していません。 もしかしたら、 親ウインドウの本来のメニューが書き換えられているかもしれません。 以上、現状の報告です。 ご指導くださり、ありがとうございます。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>チャイルドウインドの中で、 >CHtmlView を表示させ >それが選ばれたときに、 >メニューを書き換えて >お気に入りの内容を加えて表示させたいのですが >上手くゆきません。 何が上手くいかないかが不明。 MDIで特定の子ウィンドウがアクティブになったときの メニューを変えたいのであれば、ウィザードでMDIを 指定したときに、子ウィンドウの有無でメニューが 変わるところがそのもの。 お気に入りの内容を表示させたいのであれば、MFCIEのソースそのもの。
補足
いつもありがとうございます。 MFCIE では、 pMenu = GetMenu()->GetSubMenu(3); while(pMenu->DeleteMenu(0, MF_BYPOSITION)); // find out from the registry where the favorites are located. if(RegOpenKey(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders"), &hKey) != ERROR_SUCCESS) { TRACE0("Favorites folder not found\n"); return 0; } dwSize = sizeof(sz); RegQueryValueEx(hKey, _T("Favorites"), NULL, NULL, (LPBYTE)sz, &dwSize); ExpandEnvironmentStrings(sz, szPath, MAX_PATH); RegCloseKey(hKey); BuildFavoritesMenu(szPath, 0, pMenu); return 0; として、メニューを書き換えているのですが、 最初の pMenu = GetMenu()->GetSubMenu(3); と同じことをチャイルドウインドウの方から やりたいのですが、 この書き換えができないのです。 すみませんが、GetMenu() の前に 何を書き加えたら良いのでしょうか? 教えていただきたいと思います。
お礼
ありがとうございます。 さっそく読んでみます。
補足
おかげさまで、できました。 ありがとうございました。