我把工程从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 没有地址,可能是因为编译器优化。 请教各位大神,这种优化体现在什么方面?请给一个思路,谢谢。。

解决方案 »

  1.   

    WM_LBUTTONDOWN的wParam参数不是表示那个Virtual Key Down吗?比如鼠标左键,右键等等被按下
      

  2.   

    补充一句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.
      

  3.   

    一个第三方GUI库,需要的是一个Menubar,这个Menubar上的按钮是CGuiMenuButton,是在这个button类的WM_LBUTTONDOWN消息中发送消息到Menubar中,至于为什么消息要是100+GetDlgCtrlID()我也不知道。囧。
      

  4.   


    好神奇,我看到的是:
    CWnd::GetDlgCtrlID
    Visual Studio 2012 - Visual C++
    CWnd::GetDlgCtrlID
    傳回控制項的任何子視窗的視窗或控制項 ID 值,不僅可在 對話方塊中的。
    int GetDlgCtrlID( ) const;
    傳回值
    CWnd 子視窗的數字識別項,如果函式成功,則為 0。
      

  5.   


    这个就是那个MenuBar,点击第一个,也就是项目的时候,GetDlgCtrlID返回值是无效值,按照这个函数的说明,此时MenuBar是顶级窗口。而点击后面几个按钮的时候,则GetDlgCtrlID返回值从1一次递增。。
      

  6.   

    GetParent()->SendMessage(WM_LBUTTONDOWN,100+GetDlgCtrlID(),MAKEWPARAM(point.x,point.y));不要用直接用100, 用(WM_USER+100)+GetDlgCtrlID()
      

  7.   

    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;
    }看了一下, 这样就没问题了