我把工程从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 没有地址,可能是因为编译器优化。 请教各位大神,这种优化体现在什么方面?请给一个思路,谢谢。。
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 没有地址,可能是因为编译器优化。 请教各位大神,这种优化体现在什么方面?请给一个思路,谢谢。。
解决方案 »
- MFC---单例模式内存泄露问题
- 一个结构体使用的问题。该怎么解决?
- 文件读取问题
- 关于SDK和Windows消息传递的问题
- 求思路:用MFC开发Office插件
- 如何做才能从dll中导出类
- 成功的使用了CoInitialize(),却在调用CoUninitialize的时候出错
- 请问在哪里可以下载最新的windows SDK呢?
- 复制文件的API怎么用,我用COPYFILE怎么不会来,
- 我的pci wdm驱动为什么速度上不去,非常简单的驱动程序。。。
- 请问如何读出guid partition table备份的资料?以及winio如何访问超2g以外内存?
- 【求助】关于24位图读取灰度值问题 讨论
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。
这个就是那个MenuBar,点击第一个,也就是项目的时候,GetDlgCtrlID返回值是无效值,按照这个函数的说明,此时MenuBar是顶级窗口。而点击后面几个按钮的时候,则GetDlgCtrlID返回值从1一次递增。。
{ 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;
}看了一下, 这样就没问题了