• ベストアンサー

MDIでのメニューの変更

 VC++ 6.0 を使っています。 MFCを使った、メール関係のソフトを作っています。  サンプル MFCIE では、普段使っているIEのお気に入りの内容が サンプルを動かしたときに表示されます。  今は、MDIの形でソフトをつくっています。 たとえば、サンプル MDIDOCVW のようになっています。 チャイルドウインドの中で、 CHtmlView を表示させ それが選ばれたときに、 メニューを書き換えて お気に入りの内容を加えて表示させたいのですが 上手くゆきません。  アドバイスをお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.4

参考までに。 http://support.microsoft.com/default.aspx?scid=kb;JA;145857 #機械翻訳なのでかなり怪しい日本語ですが。原文を読むことをお勧めします。

参考URL:
http://support.microsoft.com/default.aspx?scid=kb;JA;145857
uyama33
質問者

お礼

ありがとうございます。 さっそく読んでみます。

uyama33
質問者

補足

おかげさまで、できました。 ありがとうございました。

その他の回答 (3)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

> 書き換えのタイミングが悪いのか どのタイミングで行ってるんですか? 参考までに。 http://homepage2.nifty.com/DSS/VCPP/MFC/Menu/MDIMenu.htm

参考URL:
http://homepage2.nifty.com/DSS/VCPP/MFC/Menu/MDIMenu.htm
uyama33
質問者

補足

次のような構造です。 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)
回答No.2

>pMenu = GetMenu()->GetSubMenu(3); >と同じことをチャイルドウインドウの方から >やりたいのですが、 GetMDIFrame()で親フレームウィンドウ取得するんじゃだめ?

uyama33
質問者

お礼

ありがとうございます。 pMenu = GetMDIFrame()ー>GetMenu()->GetSubMenu(3); としたら、 pMenu は値が確定しました。  書き換えのタイミングが悪いのか 子ウインドウ用のメニューのFavaritesの 項目は変化していません。  もしかしたら、 親ウインドウの本来のメニューが書き換えられているかもしれません。  以上、現状の報告です。 ご指導くださり、ありがとうございます。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>チャイルドウインドの中で、 >CHtmlView を表示させ >それが選ばれたときに、 >メニューを書き換えて >お気に入りの内容を加えて表示させたいのですが >上手くゆきません。 何が上手くいかないかが不明。 MDIで特定の子ウィンドウがアクティブになったときの メニューを変えたいのであれば、ウィザードでMDIを 指定したときに、子ウィンドウの有無でメニューが 変わるところがそのもの。 お気に入りの内容を表示させたいのであれば、MFCIEのソースそのもの。

uyama33
質問者

補足

いつもありがとうございます。 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() の前に 何を書き加えたら良いのでしょうか? 教えていただきたいと思います。

関連するQ&A

  • メニューのカスタマイズ

    EXCLEやWORDのメニューは、使用頻度の高い順に並び、かつ多いメニューは省略されて表示されます。 VC++で同様のメニューを実装する必要がでてきたのですが、このようなメニューを作成した経験のある方、その時の実装方法を教えていただけないでしょうか? よろしくお願い致します。 OS:Windows XP 開発環境:VS2005 MFC使用 MDIアプリケーション

  • Menu 項目のあとにつづく  ...  の意味は?

    VC++ で MFC アプリケーションを作っています。 一般的なソフトを見ると Menu で項目のあとに「 ... 」のあるものとないものがあります。 たとえば IE で ファイル(F) をクリックすると表示されるメニュー:    新規作成(N)    開く(O)... 新規作成には「 ... 」がついていませんが,開くには「 ... 」がついています。 どうでも良い部分かもしれないのですが,気になって仕方ありません!! マヌケな質問であるかもしれませんが,ご教授いただければ幸いです。

  • MDIで同時起動するドキュメント数の制限方法

    次の開発環境でWindowsアプリを作成するにあたり、 アプリケーションの種類をMDIとします。  WindowsXP Professional  Visual Studio.NET 2002  VC++ MFC そこで、質問なのですがMDIで同時起動する ドキュメント数を制限する方法はありますか。 例えば、ウィンドウ内で開くドキュメント数を 4つまでに制限する。 .NET上での設定なのか、コード上で行うのか。 または、参照するサイトやサンプルプログラム、 書籍、ヒントとなる関数やコードなど、なんでも よろしいのでご存じなことを教えて頂けないで しょうか。

  • MDIでのダイアログ生成

    VC++2005でMDIアプリケーションを作成しています。 ダイアログベースでは、DoModal()にてダイアログを生成していましたが、 MDIでのダイアログ生成の方法が分かりません。。 調べた結果、 (1)CreateWindow()にてクライアントウィンドウを作成 (2)CreateMDIWindow()にて子ウィンドウを作成 の順序で処理を行うことは分かりましたが、 関数の一部の引数に何を設定してやれば良いのかが不明です。。 ※下記はネット上にあったサンプルソースです。  「???」の箇所が不明な引数です。 (1) CreateWindow(   TEXT("MDICLIENT"), //MDICLIENT は固定です   NULL,   WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN,   0, 0, 0, 0,   hWnd,       //メインウィンドウのハンドル←???   (HMENU)1,    //←???   hInst,       //インスタンスハンドル←???   (LPSTR)&ccs    //CLIENTCREATESTRUCT構造体のポインタ←???  ); (2) HWND CreateMDIWindow(  MDI_CHILD ,   //ウィンドウクラス名  TITLE ,     //ウィンドウのタイトルバーテキスト  0 ,       //ウィンドウスタイル。WS_MAXIMIZE(最大化表示)など  CW_USEDEFAULT , //X座標  CW_USEDEFAULT , //Y座標  CW_USEDEFAULT , //幅  CW_USEDEFAULT , //高さ  hClientWindow , //クライアントウィンドウのハンドル ←???  hIns ,      //インスタンスハンドル       ←???  0        //アプリケーション定義の値 ); なお、行いたい処理の流れとしては、 CTestDialogクラスより、CTest2Dialogクラスのダイアログを、 呼び出したいのです。 うまく説明できず申し訳ありませんが、 お詳しい方おられましたら、具体例など交えてご説明頂けると幸いです。 お手数ですが、どうか宜しくお願い致します。

  • MDIでプロジェクトを作成しSDIとして使用する方法

    次の開発環境でWindowsアプリを作成するにあたり、 アプリケーションの種類をSDIとすべきかMDIと すべきか迷っています。  WindowsXP Professional  Visual Studio.NET 2002  VC++ MFC そこで、質問なのですがアプリケーションの種類を MDIとしてプロジェクトを作成した後にSDIと同じ動き となるようにコードを書く(変更する)ことがで きますか。 例えば、プロジェクトを起動させると、常に1つの ドキュメントがメインウィンドウ全体に表示される。 ご存じの方すいませんがよろしくお願いします。

  • IE9でお気に入りをメニューバーに表示したい

    IE8ではメニューバーにお気に入りのフォルダが一部表示されていて結構助かっていたのですが、IE9にしたらお気に入りのボタンが1個あるだけで、フォルダが全然表示されなくなってしまい、不便に思っています。 IE9でお気に入りフォルダをメニューバーなどに表示させるようにすることはできないものでしょうか? どなたかよろしくお願いいたします。

  • メニューバーが無くなりました。

    「マイコンピュータ」「マイドキュメント」等ののウインドを表示させるとメニューバーが表示されなくなりました。 タイトルバーの下の左端に「フォルダ」とのみ表示され何も作業が出来ず困っています。 IE OE には表示されます 「別ウインドで開く」にすると表示されます。 NEC LaVie LN300/9 windowsXP です。 友達には初期化するしかないのではと言われ大変困っています。 どうぞ良い解決方法をお教え下さい。 宜しくお願い致します。

  • お気に入りのメニューを特定して非表示にする方法は?

    私は、IEで「お気に入り」の数が増えてきたので、目的のメニューを探すのが大変になる場合があり、メニューを見やすく方法として、最近使ったものを最優先で表示し、あまり使わない「お気に入り」を非表示になるよう設定しました。 それからしばらくして、あまり開かなくなったメニューが出てきたので、このメニューを非表示にしたいのですが、やり方がわかりません。 メニューを特定して非表示にする事は、可能ですか? それとも不可能でしょうか? 御教え願い問う御座います。

  • IE-8に変えたらメニューバーが英語になった

    ブラウザIE-9ではメールのポップアップ等の表示に不具合が出たので、IE-8に戻した。 しかし、メニューバーやお気に入り等、英語になった、日本語に戻す方法を教えて下さい。 使用OS:VISTA HP SP-2

  • ieでメニューのお気に入りからプルダウンで全てのメニューを表示させるには?

    windows2000proでie6.0を使っています。 いつもメニューからプルダウンで選択操作しています。 お気に入りを選択プルダウン表示すると、10件しか初期表示されません。 一番下の下向き》を、選択して暫くすると全てのお気に入りメニューが表示されるのですが、一発で全部を表示させたいと思っています。 設定方法ご存知のかたよろしくお願い致します。 少し時間が経過したら全てのメニューを表示するとかの設定があるかとは思うのですが・・・・。 尚、アイコンからのお気に入りは使わないので、別な方法でお願いします。

専門家に質問してみよう