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.
你看下:
_____________________________
利用调用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);
}
载入
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
striking(硬撑者) :我写的是this
#7
那你在TrackPopupMenu 加上TPM_RETURNCMD,
当选择菜单时, 查看它的返回值, 看看是否是你选择的菜单的id。
int nCmd = moSwitchMenu.GetSubMenu(0)->TrackPopupMenu(TPM_RETURNCMD....
当选择菜单时, 查看它的返回值, 看看是否是你选择的菜单的id。
int nCmd = moSwitchMenu.GetSubMenu(0)->TrackPopupMenu(TPM_RETURNCMD....
#8
返回的是我选择的菜单的ID
#9
那就直接处理
switch menuid
{
case:ID_MENU_1:
break;
。。。。。
}
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.
你看下:
_____________________________
利用调用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);
}
载入
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
striking(硬撑者) :我写的是this
#7
那你在TrackPopupMenu 加上TPM_RETURNCMD,
当选择菜单时, 查看它的返回值, 看看是否是你选择的菜单的id。
int nCmd = moSwitchMenu.GetSubMenu(0)->TrackPopupMenu(TPM_RETURNCMD....
当选择菜单时, 查看它的返回值, 看看是否是你选择的菜单的id。
int nCmd = moSwitchMenu.GetSubMenu(0)->TrackPopupMenu(TPM_RETURNCMD....
#8
返回的是我选择的菜单的ID
#9
那就直接处理
switch menuid
{
case:ID_MENU_1:
break;
。。。。。
}
switch menuid
{
case:ID_MENU_1:
break;
。。。。。
}