因为想在CStatic中响应右键点击,然后弹出菜单,所有自定义了一个CStatic。
响应右键点击的代码
void CPlayStatic::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CMenu Menu;
Menu.LoadMenuA(IDR_MENU_RBCLICK);
CMenu* pPop=Menu.GetSubMenu(0);
ClientToScreen(&point);
pPop->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);
CStatic::OnRButtonDown(nFlags, point);
}
然后再对话框中想响应对于菜单子项的单击,但是一直不能响应,不知道为什么
消息映射
ON_COMMAND(IDM_START,OnMenuStart)
void CVideoDlg::OnMenuStart()
{
MessageBox("1");
}
响应右键点击的代码
void CPlayStatic::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CMenu Menu;
Menu.LoadMenuA(IDR_MENU_RBCLICK);
CMenu* pPop=Menu.GetSubMenu(0);
ClientToScreen(&point);
pPop->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);
CStatic::OnRButtonDown(nFlags, point);
}
然后再对话框中想响应对于菜单子项的单击,但是一直不能响应,不知道为什么
消息映射
ON_COMMAND(IDM_START,OnMenuStart)
void CVideoDlg::OnMenuStart()
{
MessageBox("1");
}
pPop->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,NULL);
{
// TODO: 在此添加命令更新用户界面处理程序代码
CMenu Menu;
Menu.LoadMenuA(IDR_MENU_RBCLICK);
CMenu* pPop=Menu.GetSubMenu(0);
pCmdUI->m_pMenu=pPop;
pCmdUI->m_nIndexMax=pPop->GetMenuItemCount();
pCmdUI->m_pMenu->EnableMenuItem(IDM_START,MF_BYCOMMAND|MF_GRAYED);
}
这个怎么不能改变菜单的样式呢?
void CPlayStatic::OnRButtonDown(UINT nFlags, CPoint point)
CPlayStatic是我自定义的一个静态框
最后一个参数
pWnd 标识拥有弹出菜单的窗口。该窗口接收来自菜单的所有WM_COMMAND消息
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
int temp = GetDlgCtrlID();//取得右键单击的Static ID
if (temp == IDC_STATIC1)//仅当静态控件为IDC_STATIC1时弹出菜单
{
CMenu Menu;
Menu.LoadMenu(IDR_MENU1);
CMenu* pPop=Menu.GetSubMenu(0);
ClientToScreen(&point);
pPop->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);
CStatic::OnRButtonDown(nFlags, point);
}
}
void AllowMenu(CWnd* pHandler, UINT menu_id)
{
m_bAllow = true;
m_idMenu = menu_id;
m_pMsgHandler = pHandler;
}
m_pMsgHandler->PostMessage(WM_FROM_ME, GetDlgCtrlID(), 0);
父窗口响应这个消息就行了
ON_MESSAGE(WM_FROM_ME, OnMe)
CMenu Menu;
Menu.LoadMenu(IDR_MENU_RBCLICK);
CMenu* pPop=Menu.GetSubMenu(0);
pPop->EnableMenuItem(...);
ClientToScreen(&point);
pPop->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,m_pMsgHandler);
即可