dポイントプレゼントキャンペーン実施中!

 VC++ 6.0 を使っています。
MFCを使った、メール関係のソフトを作っています。

 サンプル MFCIE
では、普段使っているIEのお気に入りの内容が
サンプルを動かしたときに表示されます。

 今は、MDIの形でソフトをつくっています。
たとえば、サンプル MDIDOCVW
のようになっています。
チャイルドウインドの中で、
CHtmlView を表示させ
それが選ばれたときに、
メニューを書き換えて
お気に入りの内容を加えて表示させたいのですが
上手くゆきません。

 アドバイスをお願いいたします。

A 回答 (4件)

参考までに。


http://support.microsoft.com/default.aspx?scid=k …

#機械翻訳なのでかなり怪しい日本語ですが。原文を読むことをお勧めします。

参考URL:http://support.microsoft.com/default.aspx?scid=k …

この回答への補足

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

補足日時:2004/07/01 23:00
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/07/01 18:11

> 書き換えのタイミングが悪いのか



どのタイミングで行ってるんですか?

参考までに。
http://homepage2.nifty.com/DSS/VCPP/MFC/Menu/MDI …

参考URL:http://homepage2.nifty.com/DSS/VCPP/MFC/Menu/MDI …

この回答への補足

次のような構造です。

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番目ともに
お気に入りのものに変わってしまいます。

補足日時:2004/06/30 20:00
    • good
    • 0

>pMenu = GetMenu()->GetSubMenu(3);


>と同じことをチャイルドウインドウの方から
>やりたいのですが、

GetMDIFrame()で親フレームウィンドウ取得するんじゃだめ?
    • good
    • 0
この回答へのお礼

ありがとうございます。

pMenu = GetMDIFrame()ー>GetMenu()->GetSubMenu(3);

としたら、
pMenu
は値が確定しました。

 書き換えのタイミングが悪いのか
子ウインドウ用のメニューのFavaritesの
項目は変化していません。

 もしかしたら、
親ウインドウの本来のメニューが書き換えられているかもしれません。

 以上、現状の報告です。

ご指導くださり、ありがとうございます。

お礼日時:2004/06/30 08:06

>チャイルドウインドの中で、


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

補足日時:2004/06/29 20:10
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!