WTL上下文菜单

WM_CONTEXTMENU消息会在右键点击窗口客户区的时候发出,通过处理该消息,我们可以在此时弹出上下文菜单。

         我们可以添加一个菜单资源。如下图:
WTL上下文菜单
         我们利用CMainFrame的成员变量CCommandBarCtrl m_CmdBar来显示我们的上下文菜单。
 
LRESULT CMainFrame::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
     CMenu menu;
     menu.LoadMenu(IDR_MENU1);
     CMenuHandle menuPopup = menu.GetSubMenu(0);
     m_CmdBar.TrackPopupMenu(menuPopup,TPM_RIGHTBUTTON | TPM_VERPOSANIMATION | TPM_VERTICAL,
         GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
     return 0;
}
         这样就完成了上下文菜单的显示。
         对于消息的处理,我们需要使用下面的宏:
COMMAND_ID_HANDLER(ID_TEST_P1,OnP1)
     然后在 OnP1函数中添加实现代码。这是比较简单的做法。
 
    下面我演示一种不使用 CCommandBarCtrl类的方法。我觉得这种方法更简单。首先生成WTL对话框工程。然后添加菜单资源,实现WM_COMMAND消息处理方法如下:
LRESULT CMainDlg::OnContextMenu(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
     CMenuHandle menuPopup = m_popupMenu.GetSubMenu(0);
     menuPopup.TrackPopupMenu(TPM_RIGHTBUTTON,GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam),m_hWnd,0);
     return 0;
}
    m_popupMenuCMainDlg的成员变量,类型为CMenuT<true>。并且在WM_INITDIALOG消息处理函数中调用成员函数LoadMenu。
 
         最后我们添加自己的菜单响应函数。
COMMAND_ID_HANDLER(ID_TEST_P1,OnP1)
     静态分割窗口也可以使用这种方法。
     注意,如果使用成员函数而不使用菜单资源添加菜单项,会遇到无法拦截菜单点击消息的情况,具体原因我没有花时间去查明,暂时就使用菜单资源好了。

 

你可能感兴趣的:(菜单)