请教,CMenu 老是出错!

soapyj 2008-08-24 04:00:14
初学,请问以下代码为何老是报错?

void CDemoOfControlAllDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
switch (lParam)
{
case WM_RBUTTONUP:
{
POINT point;
// Get mouse position
GetCursorPos(&point);
SetForegroundWindow();
CMenu m_menu;
if (m_menu.LoadMenu(IDM_CAIDAN)==0)
{
MessageBox("错误!");
break;
}
m_menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);

break;
}
case WM_LBUTTONDBLCLK:
{

}
break;

}
}

出错后会停到ASSERT(m_hMenu != NULL);
...全文
142 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
soapyj 2008-08-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 tunnel115 的回复:]
把CMenu m_menu; 放到了全局变量就可以。或者放在你的主窗口的类的定义里
[/Quote]


我定义为全局变量后还是不行,调试时发现错误在这一句:
m_menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON,point.x,point.y,this);

this指针为空...


请问怎么回事呢?
soapyj 2008-08-25
  • 打赏
  • 举报
回复
问题终于解决了。原因是我用MFC设计菜单时出错,GetSubMenu(0)无法取得子菜单值,自然创建失败。
感谢热心网友。
tunnel115 2008-08-24
  • 打赏
  • 举报
回复
这是一个局部变量的错误,你把你的菜单放置成了一个函数体内的局部变量,那么这个函数体执行完毕了,那么你的这个菜单也就销毁了。
---这样说也许清楚点
tunnel115 2008-08-24
  • 打赏
  • 举报
回复
把CMenu m_menu; 放到了全局变量就可以。或者放在你的主窗口的类的定义里
tunnel115 2008-08-24
  • 打赏
  • 举报
回复
CMenu m_menu;
这句有问题,你把菜单放在了 OnMyMessage(WPARAM wParam, LPARAM lParam) 这个函数中了,那么这个函数执行完了。你的菜单对象也就销毁了
Fireway2008 2008-08-24
  • 打赏
  • 举报
回复
很明显,你的CMenu 对象 没创建成功 ,你是不是用 CButton中附带的CMenu进行编程的?
void CDemoOfControlAllDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
switch (lParam)
{
case WM_RBUTTONUP:
{
POINT point;
// Get mouse position
GetCursorPos(&point);
SetForegroundWindow();
CMenu m_menu;
if (m_menu.LoadMenu(IDM_CAIDAN)==0)
{
MessageBox("错误!");
break;
}
m_menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN ¦TPM_RIGHTBUTTON,point.x,point.y,this);

break;
}
case WM_LBUTTONDBLCLK:
{

}
break;

}
}

另外,你设置断点看看,上述代码在哪行跳出错误断言?
soapyj 2008-08-24
  • 打赏
  • 举报
回复
ASSERT(m_hMenu != NULL); 这句是在这里:

BOOL CMenu::TrackPopupMenu(UINT nFlags, int x, int y,
CWnd* pWnd, LPCRECT lpRect)
{
ASSERT(m_hMenu != NULL);

_AFX_THREAD_STATE* pThreadState = AfxGetThreadState();
HWND hWndOld = pThreadState->m_hTrackingWindow;
HMENU hMenuOld = pThreadState->m_hTrackingMenu;
pThreadState->m_hTrackingWindow = pWnd->GetSafeHwnd();
pThreadState->m_hTrackingMenu = m_hMenu;
BOOL bOK = ::TrackPopupMenu(m_hMenu, nFlags, x, y, 0,
pThreadState->m_hTrackingWindow, lpRect);
pThreadState->m_hTrackingWindow = hWndOld;
pThreadState->m_hTrackingMenu = hMenuOld;

return bOK;
}
qqwx_1986 2008-08-24
  • 打赏
  • 举报
回复
ASSERT(m_hMenu != NULL);
有这一句吗

16,465

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧