【求助】GetDlgCtrlID函数返回值无效的问题

仓皇月 2013-10-25 09:05:34
我把工程从VS2003移植到VS2012,有个Menu的选项点击它不正常显示,我跟踪和对比两个版本代码发现,问题出现在WM_LBUTTONDOWN的消息响应函数参数上:

VS2003上:
GetParent()->SendMessage(WM_LBUTTONDOWN,100+GetDlgCtrlID(),MAKEWPARAM(point.x,point.y));

这里的GetDlgCtrlID()返回值为0,按照MSDN上说法是函数成功了。
然后在
void CMenuBar::OnLButtonDown(UINT nFlags, CPoint point) 
{
SetCursor (LoadCursor(NULL, IDC_SIZEALL));

这里nFlags为100,不会出现问题,按钮消息正常;

VS2012中:
GetParent()->SendMessage(WM_LBUTTONDOWN,100+GetDlgCtrlID(),MAKEWPARAM(point.x,point.y));

GetDlgCtrlID()返回值是一个无效值6257232,也就是说函数执行失败。我把函数丢到监视窗口中,提示: 函数 CWnd::GetDlgCtrlID 没有地址,可能是因为编译器优化。

请教各位大神,这种优化体现在什么方面?请给一个思路,谢谢。。
...全文
440 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
kok1397 2013-11-15
  • 打赏
  • 举报
回复
CMenuButton::CMenuButton(HMENU hMenu, int nIndex,CWnd* pWnd) { m_bt.Create(_T(""), WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_OWNERDRAW, CRect(0,0,0,0), pWnd, (WM_USER+100+nIndex)); } void CGuiMenuButton::OnLButtonDown(UINT nFlags, CPoint point) { ShowWindow(SW_HIDE); ClientToScreen(&point); const int nCtrlID = GetDlgCtrlID(); GetParent()->SendMessage(WM_LBUTTONDOWN,nCtrlID,MAKEWPARAM(point.x,point.y)); } void CMenuBar::OnLButtonDown(UINT nFlags, CPoint point) { int nIndex=nFlags >= (WM_USER+100)? nFlags-(WM_USER+100): -1; } 看了一下, 这样就没问题了
kok1397 2013-11-15
  • 打赏
  • 举报
回复
GetParent()->SendMessage(WM_LBUTTONDOWN,100+GetDlgCtrlID(),MAKEWPARAM(point.x,point.y)); 不要用直接用100, 用(WM_USER+100)+GetDlgCtrlID()
仓皇月 2013-10-25
  • 打赏
  • 举报
回复
引用 6 楼 xianglitian 的回复:
2012VC的部分我觉得变化挺大的 这个问题你做迁移只能专门处理一下
嗯,谢谢版主大人。我试试看把这货搞成不是顶级窗口。
仓皇月 2013-10-25
  • 打赏
  • 举报
回复

这个就是那个MenuBar,点击第一个,也就是项目的时候,GetDlgCtrlID返回值是无效值,按照这个函数的说明,此时MenuBar是顶级窗口。而点击后面几个按钮的时候,则GetDlgCtrlID返回值从1一次递增。。
向立天 2013-10-25
  • 打赏
  • 举报
回复
2012VC的部分我觉得变化挺大的 这个问题你做迁移只能专门处理一下
仓皇月 2013-10-25
  • 打赏
  • 举报
回复
引用 3 楼 VisualEleven 的回复:
补充一句GetDlgCtrlID返回0,表示失败,不是成功,你再仔细看看MSDN。 If the function succeeds, the return value is the identifier of the control. If the function fails, the return value is zero. An invalid value for the hwndCtl parameter, for example, will cause the function to fail. To get extended error information, call GetLastError.
好神奇,我看到的是: CWnd::GetDlgCtrlID Visual Studio 2012 - Visual C++ CWnd::GetDlgCtrlID 傳回控制項的任何子視窗的視窗或控制項 ID 值,不僅可在 對話方塊中的。 int GetDlgCtrlID( ) const; 傳回值 CWnd 子視窗的數字識別項,如果函式成功,則為 0。
仓皇月 2013-10-25
  • 打赏
  • 举报
回复
一个第三方GUI库,需要的是一个Menubar,这个Menubar上的按钮是CGuiMenuButton,是在这个button类的WM_LBUTTONDOWN消息中发送消息到Menubar中,至于为什么消息要是100+GetDlgCtrlID()我也不知道。囧。
Eleven 2013-10-25
  • 打赏
  • 举报
回复
补充一句GetDlgCtrlID返回0,表示失败,不是成功,你再仔细看看MSDN。 If the function succeeds, the return value is the identifier of the control. If the function fails, the return value is zero. An invalid value for the hwndCtl parameter, for example, will cause the function to fail. To get extended error information, call GetLastError.
Eleven 2013-10-25
  • 打赏
  • 举报
回复
你上面的代码是放在哪里被调用的?
Eleven 2013-10-25
  • 打赏
  • 举报
回复
WM_LBUTTONDOWN的wParam参数不是表示那个Virtual Key Down吗?比如鼠标左键,右键等等被按下

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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