为什么TrackPopupMenu显示的菜单点击无反映

时间:2023-01-15 15:31:22
我在Dialog上添加ToolBar,ToolBar其中一个按钮点击通过TrackPopupMenu显示出一个弹出菜单,但菜单每项点击都没反映,但是通过Dialog属性中General页的Menu设置就可以触发点击消息。为什么?

9 个解决方案

#1


把你添加toolbar的代码贴出来看看

#2


说的不太清楚,没法帮你具体说出原因。
你看下:
_____________________________
利用调用TrackPopupMenu函数,手工添加弹出菜单:
1)用资源管理器添加一个菜单资源
2)在鼠标右键消息响应函数中,加载菜单资源,并获得要显示的子菜单指针,并用该指针调用TrackPopupMenu函数便完成任务(但要注意:鼠标响应函数传进来的坐标是客户区坐标,而TrackPopupMenu函数中使用的是屏幕坐标,在调用TrackPopupMenu前要调用ClientToScreen客户区坐标到屏幕坐标的转换)
事例代码:
CMenu menu;
menu.LoadMenu(IDR_MENU1);
CMenu *pPopup=menu.GetSubMenu(0);
ClientToScreen(&point);
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,this);
说明:
CWnd::ClientToScreen(..);//将一个坐标点或一个矩形区域坐标转换成屏幕坐标。
CMenu::TrackPopupMenu(..);//在指定位置以指定的方式显示弹出菜单。
CWnd::ScreenToClient(..);
//Converts the screen coordinates of a given point or rectangle on the display to client coordinates.

#3


代码如下:
载入
moSwitchMenu.LoadMenu(IDR_SWITCHMENU);
弹出:
void CMainBarDialog::OnSwitchMenu()
{//ID_SWITCH_MENU映射的函数,ID_SWITCH_MENU为ToolBar其中一个按钮ID
// TODO: Add your command handler code here
RECT lrtItemRect;
moToolBar.GetToolBarCtrl().GetRect(ID_SWITCH_MENU, &lrtItemRect);
moSwitchMenu.GetSubMenu(0)->TrackPopupMenu(。。。省略
}

void CMainBarDialog::OnMenuOverview()
{//菜单IDR_SWITCHMENU中一子菜单映射函数,就是此函数无效,调试环境断不下
// TODO: 在此添加命令处理程序代码
CMainForm *lpMainForm = NULL;
lpMainForm = ((CNeiMengYiLiDlg*)AfxGetApp()->m_pMainWnd)->moMainFormList.at(0);
if(NULL != lpMainForm)
lpMainForm->ShowWindow(SW_SHOW);
}

#4


你是否进行了消息映射?

#5


TrackPopupMenu  的父窗口指针你写的是什么? 是不是this?

#6


进行映射了,通过Dialog属性中General页的Menu设置就可以触发点击消息。。。

striking(硬撑者) :我写的是this

#7


那你在TrackPopupMenu 加上TPM_RETURNCMD, 

当选择菜单时, 查看它的返回值, 看看是否是你选择的菜单的id。

int nCmd = moSwitchMenu.GetSubMenu(0)->TrackPopupMenu(TPM_RETURNCMD....

#8


返回的是我选择的菜单的ID

#9


那就直接处理
switch menuid
{
 case:ID_MENU_1:
break;



。。。。。
}

#1


把你添加toolbar的代码贴出来看看

#2


说的不太清楚,没法帮你具体说出原因。
你看下:
_____________________________
利用调用TrackPopupMenu函数,手工添加弹出菜单:
1)用资源管理器添加一个菜单资源
2)在鼠标右键消息响应函数中,加载菜单资源,并获得要显示的子菜单指针,并用该指针调用TrackPopupMenu函数便完成任务(但要注意:鼠标响应函数传进来的坐标是客户区坐标,而TrackPopupMenu函数中使用的是屏幕坐标,在调用TrackPopupMenu前要调用ClientToScreen客户区坐标到屏幕坐标的转换)
事例代码:
CMenu menu;
menu.LoadMenu(IDR_MENU1);
CMenu *pPopup=menu.GetSubMenu(0);
ClientToScreen(&point);
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,this);
说明:
CWnd::ClientToScreen(..);//将一个坐标点或一个矩形区域坐标转换成屏幕坐标。
CMenu::TrackPopupMenu(..);//在指定位置以指定的方式显示弹出菜单。
CWnd::ScreenToClient(..);
//Converts the screen coordinates of a given point or rectangle on the display to client coordinates.

#3


代码如下:
载入
moSwitchMenu.LoadMenu(IDR_SWITCHMENU);
弹出:
void CMainBarDialog::OnSwitchMenu()
{//ID_SWITCH_MENU映射的函数,ID_SWITCH_MENU为ToolBar其中一个按钮ID
// TODO: Add your command handler code here
RECT lrtItemRect;
moToolBar.GetToolBarCtrl().GetRect(ID_SWITCH_MENU, &lrtItemRect);
moSwitchMenu.GetSubMenu(0)->TrackPopupMenu(。。。省略
}

void CMainBarDialog::OnMenuOverview()
{//菜单IDR_SWITCHMENU中一子菜单映射函数,就是此函数无效,调试环境断不下
// TODO: 在此添加命令处理程序代码
CMainForm *lpMainForm = NULL;
lpMainForm = ((CNeiMengYiLiDlg*)AfxGetApp()->m_pMainWnd)->moMainFormList.at(0);
if(NULL != lpMainForm)
lpMainForm->ShowWindow(SW_SHOW);
}

#4


你是否进行了消息映射?

#5


TrackPopupMenu  的父窗口指针你写的是什么? 是不是this?

#6


进行映射了,通过Dialog属性中General页的Menu设置就可以触发点击消息。。。

striking(硬撑者) :我写的是this

#7


那你在TrackPopupMenu 加上TPM_RETURNCMD, 

当选择菜单时, 查看它的返回值, 看看是否是你选择的菜单的id。

int nCmd = moSwitchMenu.GetSubMenu(0)->TrackPopupMenu(TPM_RETURNCMD....

#8


返回的是我选择的菜单的ID

#9


那就直接处理
switch menuid
{
 case:ID_MENU_1:
break;



。。。。。
}