2016-08-01 10 views
1

MFCのシングルドキュメントインターフェイス(SDI)プロジェクトでカスタムポップアップメニューを描画しようとしています。

hereから、私は、だから私はハンドルOnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)を追加し、この関数内でいくつかのコードを追加しましたが、私は右のビューをクリックしたときに、このコールバックは、フレームワークによって呼び出されていなかったことがわかっThe framework calls this member function for the owner of an owner-draw button control, combo-box control, list-box control, or menu when a visual aspect of the control or menu has changed.

を発見し、このように:
enter image description here
ポップアップメニューを動的に作成するにはどうすればいいですか?
機能build_dynamic_menu()インサイドMFC SDIでカスタムメニューを動的に描画する方法

void Cdynamic_menu_sdiView::OnContextMenu(CWnd* /* pWnd */, CPoint point) 
{ 
    if (IDR_MY_MENU == 0) 
     return; 
    CMenu dynamicMenu, proxyMenu; 
    if (dynamicMenu.GetSafeHmenu()) 
     dynamicMenu.DestroyMenu(); 
    // Create a new popup menu. 
    if (dynamicMenu.CreatePopupMenu() == FALSE) 
     return; 

    if (proxyMenu.LoadMenu(IDR_MY_MENU) == FALSE) 
     return; 

    int nSubMenu = 1; 
    CMenu* pProxyMenu = proxyMenu.GetSubMenu(nSubMenu); 

    build_dynamic_menu(m_map_menu_element_2, pProxyMenu, dynamicMenu, CString("")); 
    //m_menu_on_draw = &dynamicMenu; // link up the dynamic menu to the on draw menu, so that we can print it on the screen 

    CPoint ptCurPos; // current cursor position 
    GetCursorPos(&ptCurPos); 
    dynamicMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON, ptCurPos.x, ptCurPos.y, AfxGetMainWnd(), NULL); 
} 

は、それが深さ最初の検索機能で、私はInsertMenu(i, MF_BYPOSITION | MF_POPUP | MF_OWNERDRAW, uSubMenuID, strLabel);ので、私は動的にポップアップメニューのテキストを変更することができることを実行します。ここでは

は、私は私のポップアップメニューを取得する方法であります。
ここに関数を入れるには時間がかかりすぎるので、私はその考えを述べます。
また、テキストの色と背景色を動的に変更したいので、コードでメニューを描画する方法を見つけようとしています。

どこから始めたらよいですか? owner drawn menusは私にとって良いアプローチですか?

+1

オーナードローメニューですか?そうでない場合、その関数は呼び出されません。 – immibis

+0

ありがとう、@immibis、私はこの最初の 'http:// www.codeproject.com /記事/ 7073 /作成方法 - オーナー描画メニュー - ステップバイステップを見ることを試みるでしょう – sflee

+1

それdoesn 'OnDrawItem'と何か関係がありません。ポップアップメニューの読み込み方法を表示します。 –

答えて

0

メニューproxyMenuをロードし、サブメニューpProxyMenuを選択しました。次に、pProxyMenu->TrackPopupMenuproxyMenu->TrackPopupMenuではなく)のサブメニューを開きます。変数名がそれほど似ていないと助けになります。

以下のコードはすべて必要なものです。またnSubMenu = 0;

CMenu proxyMenu; 
if (proxyMenu.LoadMenu(IDR_MY_MENU) == FALSE) 
    return; 

int nSubMenu = 1; 
CMenu* pProxyMenu = proxyMenu.GetSubMenu(nSubMenu); 

CPoint ptCurPos; 
GetCursorPos(&ptCurPos); 
pProxyMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, ptCurPos.x, ptCurPos.y, 
    AfxGetMainWnd()); 

TPM_LEFTBUTTONがすでにTrackPopupMenu documentationに応じTPM_RIGHTBUTTONを持っている場合、必要とされていないと、それを試してみてください。

TPM_RIGHTBUTTON
ユーザーを両方左 、マウスの右ボタンでメニュー項目を選択することができます。

InsertMenuも参照してください。サブメニューの追加にはMF_POPUPを使用し、オーナー描画メニューの場合はMF_OWNERDRAWを使用してください。

+0

異なる状況に基づいてメニュー内のテキストを編集したいので、 'dynamicMenu.InsertMenu(i、MF_BYPOSITION | MF_POPUP | MF_OWNERDRAW、uSubMenuID、" My動的文字列 ");を持つ' build_dynamic_menu'関数を追加します。 – sflee

+0

そして 'MF_BYPOSITION'を使い、ポップアップメニューを修正してください。あなたの質問が何であるか分かりませんでした。 –

+0

'InsertMenu(i、MF_BYPOSITION | MF_POWERUP、MF_OWNERDRAW、uSubMenuID、" My dynamic string ");が使用しました。 – sflee

関連する問題