2016-06-24 5 views
-1

私はデスクトップのWindowsアプリケーションのサードパーティプラグインを開発中です。これは基本的に、ホストアプリケーションによってのみアクセスされる従来のDLLです。ホストはAPIに基づいてプラグインのメニュー項目を提供しますが、どのファイルが開いているかに基づいてメニュー項目のテキストを動的に変更してAPIを拡張したいと考えています。ホストは、MDIウィンドウを使用し、私はそれがMFCで開発されたと思います。しかし、私はWin APIを使って直接メニュー項目を変更しようとしています。 (これは、私の質問の一部である問題がある可能性があります。)Win32でホストのメニューを変更するサードパーティのプラグイン

コードは、メニュー項目を初めて変更するときに正しく機能します。しかしその後の変更はメニューには表示されません。変わったことは、GetMenuStringが常に私が設定した値を返すようだということです。つまり、APIレベルでは動作するように見えますが、メニュー項目は変更されません(初めての場合を除く)。

ここでは、メニュー項目のテキストを変更するためのコードです。それはとても基本的です。

MENUITEMINFOW menuInfo; 
memset (&menuInfo, 0, sizeof(menuInfo)); 
menuInfo.cbSize = sizeof(menuInfo); 
menuInfo.fMask = MIIM_STRING; 
menuInfo.fType = MFT_STRING; 
menuInfo.dwTypeData = (LPWSTR)newItemText; 
SetMenuItemInfoW (hMenu, idToChange, false, &menuInfo); 

MFCはこれを妨害していますか?または、おそらくホストアプリケーションのメニュー操作の特異性?または、メニューを正しく表示するために何か必要なことがありますか?

+0

ホストは、ホストのAPIをバイパスしているため、メニュー項目をオーナー描画していてカスタムテキストの変更を無視している(または検出していない)のでしょうか?どのようにメニュー項目をホストのメニューに追加するのですか? –

+0

ホストは起動時に各メニュー項目のテキストを要求します。 – rpatters1

+0

最も可能性の高い答えは、ホストがメニュー項目をオーナー描画しているか、他の方法でキャッシュしていることです。私は私が間違っているかもしれないことを望んで質問を掲示した。 – rpatters1

答えて

0

私はこれを、SetMenuItemInfoの代わりにDeleteMenuとInsertMenuを使って動作させました。コードは難しいですが、ここではそれが私のような誰かを助ける場合です。

const UINT idToChange = GetMenuItemID (hMenu, index); 
DeleteMenu (hMenu, index, MF_BYPOSITION); 
InsertMenuW (hMenu, index, MF_BYPOSITION | MF_STRING, idToChange, (LPWSTR)newItemText); 
関連する問題