解决方案 »

  1.   

    使用鼠标钩子来捕获
    HHOOK g_Mouse = NULL;
    bool bNCLButtonDown = false;            // 按下的标志位
    LRESULT CALLBACK MouseProc(int code,WPARAM wParam,LPARAM lParam)
    {
    if (bNCLButtonDown && wParam==WM_LBUTTONUP)
    {
    // 处理鼠标在非客户区弹起
    return 1;
    }
    return CallNextHookEx(g_Mouse,code,wParam,lParam);
    }//安装钩子
    g_Mouse = SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());void CtestDlg::OnNcLButtonDown(UINT nHitTest, CPoint point)
    {
            // 置标志位
    bNCLButtonDown = true;
    CDialog::OnNcLButtonDown(nHitTest, point);
    }
      

  2.   

    不用钩子的实现:void CAboutDlg::OnSysCommand(UINT nID, LPARAM lParam) 
    {
    // TODO: Add your message handler code here and/or call default

    CDialog::OnSysCommand(nID, lParam);
    TRACE(_T("%04x\n"), nID);
    if( (nID & 0xFFF0) == SC_SIZE )
    {
    PostMessage(WM_NCLBUTTONUP, HTBOTTOMRIGHT, lParam);
    }
    }void CAboutDlg::OnNcLButtonUp(UINT nHitTest, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    MessageBox(_T("lbup"));

    CDialog::OnNcLButtonUp(nHitTest, point);
    }低版本VC中对话框中添加OnSysCommand方法:
    在CLASSWIZARD中的CLASS INFO页中修改:MESSAGE FILTER的信息,即将DIALOG改为WINDOW即可,然后在MESSAGE MAPS页中就有WM_SYSCOMMAND消息,添加完毕后,在将WINDOW改为DIALOG,恢复到原来状况。当对话框双击不能最大化时,双击标题栏也会触发OnNcLButtonUp
    解决:
    nID限制为为0xf000-0xf0008即可,代表通过键盘调整对话框大小、鼠标调整对话框大小的八种方式