一直没有实现,最后50分啦
希望你帮我解决:提供一个最简单的无边框对话框能用鼠标拖动来调整窗体大小的代码或者指正我看下我的代码有什么问题任一都可
以下是我测试的关键代码:按网上的相关文章,我自己按一个方式来实现,
1、将资源对话框的border设置为none
2、响应 WM_NCHITTEST WM_SETCURSOR WM_NCLBUTTONDOWN 这三个消息。消息处理函数:UINT CXXXDlg::OnNcHitTest(UINT nHitTest, CPoint point)
{
 CRect rect;
 GetWindowRect(&rect);
 if(point.x <= rect.left+3)
    return HTLEFT;
 else if(point.x >= rect.right-3)
    return HTRIGHT;
 else if(point.y <= rect.top+3)
    return HTTOP;
 else if(point.y >= rect.bottom-3)
    return HTBOTTOM;
 else if(point.x <= rect.left+10 && point.y <= rect.top+10)
    return HTTOPLEFT;
 else if(point.x >= rect.right-10 && point.y <= rect.top+10)
    return HTTOPRIGHT;
 else if(point.x <= rect.left+10 && point.y >= rect.bottom-10)
    return HTBOTTOMLEFT;
 else if(point.x >= rect.right-10 && point.y >= rect.bottom-10)
    return HTBOTTOMRIGHT;
 
    return 0;
}
BOOL CXXXDlg::OnSetCursor(HWND hWnd, UINT nHitTest, UINT message)
{
    if(nHitTest == HTCAPTION || nHitTest == HTSYSMENU ||
        nHitTest == HTMENU || nHitTest == HTCLIENT)
   {
        SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)));
    }
   else if(nHitTest == HTTOP || nHitTest == HTBOTTOM)
   {
        SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENS)));
    }
   else if(nHitTest == HTLEFT || nHitTest == HTRIGHT)
   {
        SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZEWE)));
    }
   else if(nHitTest == HTTOPLEFT || nHitTest == HTBOTTOMRIGHT)
   {
        SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENWSE)));
    }
   else if(nHitTest == HTTOPRIGHT || nHitTest == HTBOTTOMLEFT)
   {
        SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENESW)));
    }
   else
   {
        SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)));
     }
}
void CXXXDlg::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
   if(nHitTest == HTTOP)
        SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_TOP, MAKELPARAM(point.x, point.y));
   else if(nHitTest == HTBOTTOM)
        SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOM, MAKELPARAM(point.x, point.y));
   else if(nHitTest == HTLEFT)
        SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_LEFT, MAKELPARAM(point.x, point.y));
   else if(nHitTest == HTRIGHT)
        SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_RIGHT, MAKELPARAM(point.x, point.y));
   else if(nHitTest == HTTOPLEFT)
        SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_TOPLEFT, MAKELPARAM(point.x, point.y));
   else if(nHitTest == HTTOPRIGHT)
        SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_TOPRIGHT, MAKELPARAM(point.x, point.y));
   else if(nHitTest == HTBOTTOMLEFT)
        SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOMLEFT, MAKELPARAM(point.x, point.y));
   else if(nHitTest == HTBOTTOMRIGHT)
        SendMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOMRIGHT, MAKELPARAM(point.x, point.y));
}
 不过我发现鼠标在移动到窗体的边缘时,并不会出现可拖放的鼠标样式,而且也改变不了窗体大小
于是我把该窗体的Client Edge设置 为true,这样,就可以实现理想的效果了。可是这样的问题是窗体会有一个很明显的边,很难看,既然打算用无边框的窗体,那么这个边还是不打算设置谁有办法解决这个问题?????不要边,却能实现窗体大小的调整?

解决方案 »

  1.   

    添加以下代码即可,
    示例工程下载:
    http://cid-3ba16e78a53d2d3d.office.live.com/self.aspx/VC/18%20%E6%97%A0%E8%BE%B9%E6%A1%86%E7%AA%97%E5%8F%A3%E5%AE%9E%E7%8E%B0%E6%8B%96%E6%8B%89%E6%95%88%E6%9E%9C.zip阿弥陀佛!UINT CDemoDlg::OnNcHitTest(CPoint point) 
    {
    CRect rect;
    GetWindowRect(&rect);
    if(point.x <= rect.left+3)
    return HTLEFT;
    else if(point.x >= rect.right-3)
    return HTRIGHT;
    else if(point.y <= rect.top+3)
    return HTTOP;
    else if(point.y >= rect.bottom-3)
    return HTBOTTOM;
    else if(point.x <= rect.left+10 && point.y <= rect.top+10)
    return HTTOPLEFT;
    else if(point.x >= rect.right-10 && point.y <= rect.top+10)
    return HTTOPRIGHT;
    else if(point.x <= rect.left+10 && point.y >= rect.bottom-10)
    return HTBOTTOMLEFT;
    else if(point.x >= rect.right-10 && point.y >= rect.bottom-10)
    return HTBOTTOMRIGHT;

    return CDialog::OnNcHitTest(point);
    }
      

  2.   

    重载OnLButtonDown,OnMouseMove,OnSizingvoid CMyFrameDlg::OnLButtonDown(UINT nFlags, CPoint point)
    {
    // TODO: Add your message handler code here and/or call default
    switch(mMouseStates) 
    {
    case HTLEFT:
    case HTRIGHT:
    ::SetCursor(LoadCursor(NULL, IDC_SIZEWE));
    break;
    case HTTOP:
    case HTBOTTOM:
    ::SetCursor(LoadCursor(NULL, IDC_SIZENS));
    break;
    case HTTOPLEFT:
    case HTBOTTOMRIGHT:
    ::SetCursor(LoadCursor(NULL, IDC_SIZENWSE));
    break;
    case HTTOPRIGHT:
    case HTBOTTOMLEFT:
    ::SetCursor(LoadCursor(NULL, IDC_SIZENESW));
    break;
    default:
    ::SetCursor(LoadCursor(NULL, IDC_ARROW));
    break;
    }

    if (mMouseStates == HTTOP)
    PostMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_TOP, MAKELPARAM(point.x, point.y));
    else if (mMouseStates == HTBOTTOM)
    PostMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOM, MAKELPARAM(point.x, point.y));
    else if (mMouseStates == HTLEFT)
    PostMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_LEFT, MAKELPARAM(point.x, point.y));
    else if (mMouseStates == HTRIGHT)
    PostMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_RIGHT, MAKELPARAM(point.x, point.y));
    else if (mMouseStates == HTTOPLEFT)
    PostMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_TOPLEFT, MAKELPARAM(point.x, point.y));
    else if (mMouseStates == HTBOTTOMRIGHT)
    PostMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOMRIGHT, MAKELPARAM(point.x, point.y));
    else if (mMouseStates == HTTOPRIGHT)
    PostMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_TOPRIGHT, MAKELPARAM(point.x, point.y));
    else if (mMouseStates == HTBOTTOMLEFT)
    PostMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOMLEFT, MAKELPARAM(point.x, point.y));
    else
    {
    CRect rect;
    GetClientRect(&rect);
    rect.bottom = FRAME_TOP_SIZE;
    if(rect.PtInRect(point))
    PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));
    }
         CDialog::OnLButtonDown(nFlags, point);
    }void CMyFrameDlg::OnMouseMove(UINT nFlags, CPoint point)
    {
    // TODO: Add your message handler code here and/or call default
    if(mEnableWindowSize &&  !IsZoomed())
    {
    CRect rect;
    GetClientRect(&rect);
    if (point.x <= rect.left + 5 && point.y <= rect.top + 5)
    mMouseStates = HTTOPLEFT;
    else if (point.x >= rect.right - 5 && point.y >= rect.bottom - 5)
    mMouseStates = HTBOTTOMRIGHT;
    else if (point.x >= rect.right - 5 && point.y <= rect.top + 5)
    mMouseStates = HTTOPRIGHT;
    else if (point.x <= rect.left + 5 && point.y >= rect.bottom - 5)
    mMouseStates = HTBOTTOMLEFT;
    else if (point.x <= rect.left + 5)
    mMouseStates = HTLEFT;
    else if (point.x >= rect.right - 5)
    mMouseStates = HTRIGHT;
    else if (point.y <= rect.top + 5)
    mMouseStates = HTTOP;
    else if (point.y >= rect.bottom - 5)
    mMouseStates = HTBOTTOM;
    else 
    mMouseStates = 0;

    switch (mMouseStates) 
    {
    case HTLEFT:
    case HTRIGHT:
    ::SetCursor(LoadCursor(NULL, IDC_SIZEWE));
    break;
    case HTTOP:
    case HTBOTTOM:
    ::SetCursor(LoadCursor(NULL, IDC_SIZENS));
    break;
    case HTTOPLEFT:
    case HTBOTTOMRIGHT:
    ::SetCursor(LoadCursor(NULL, IDC_SIZENWSE));
    break;
    case HTTOPRIGHT:
    case HTBOTTOMLEFT:
    ::SetCursor(LoadCursor(NULL, IDC_SIZENESW));
    break;
    default:
    ::SetCursor(LoadCursor(NULL, IDC_ARROW));
    break;
    }

    } CDialog::OnMouseMove(nFlags, point);
    }void CMyFrameDlg::OnSizing(UINT fwSide, LPRECT pRect)
    {
    CDialog::OnSizing(fwSide, pRect);
    if(mEnableWindowSize)
    {
    switch(fwSide) 
    {
    case WMSZ_LEFT:
    pRect->left = min(pRect->left, pRect->right - mSizeX);
    break;
    case WMSZ_RIGHT:
    pRect->right = max(pRect->right, pRect->left + mSizeX);
    break;
    case WMSZ_TOP:
    pRect->top = min(pRect->top, pRect->bottom - mSizeY);
    break;
    case WMSZ_BOTTOM:
    pRect->bottom = max(pRect->bottom, pRect->top + mSizeY);
    break;
    case WMSZ_TOPLEFT:
    pRect->left = min(pRect->left, pRect->right - mSizeX);
    pRect->top = min(pRect->top, pRect->bottom - mSizeY);
    break;
    case WMSZ_BOTTOMRIGHT:
    pRect->right = max(pRect->right, pRect->left + mSizeX);
    pRect->bottom = max(pRect->bottom, pRect->top + mSizeY);
    break;
    case WMSZ_TOPRIGHT:
    pRect->right = max(pRect->right, pRect->left + mSizeX);
    pRect->top = min(pRect->top, pRect->bottom - mSizeY);
    break;
    case WMSZ_BOTTOMLEFT:
    pRect->bottom = max(pRect->bottom, pRect->top + mSizeY);
    pRect->left = min(pRect->left, pRect->right - mSizeX);
    break;
    default:
    break;
    }
    }
    // TODO: Add your message handler code here
    }mSizeX,mSizeY是窗口最大宽高
      

  3.   

    提供个简单的想法,当鼠标移到窗口边缘的时候吧类型改为Client Edge,拖完再改回去。
      

  4.   

    是鼠标点击下,准备拉的时候,调用函数:SetCapture,这样,在MOVE中改变大小,可以用SetWindowPos ,改变完成后,调用ReleaseCapture 释放鼠标!
      

  5.   

    问2楼:
    mMouseStates 从何而来?
      

  6.   

    int         mMouseStates;
    OnMouseMove()函数里面不是赋值了么
      

  7.   

    还有,FRAME_TOP_SIZE 你定义的是多少?
      

  8.   

    感谢2楼和大家的恢复,不过现在按2楼的方式,程序有问题,拖的时候很乱,一按下鼠标还没拖呢,就改变大小了,我不知道是不是这个 FRAME_TOP_SIZE 的定义??你怎么定义的?还有,mEnableWindowSize 这个只有读取没有设置,应该是TRUE吧?谢谢,添麻烦了,这么点分,都不好意思问了
      

  9.   

    上面有些变量是我自己程序里面的定义
    FRAME_TOP_SIZE这个定义上面边框的宽度,主要是为了鼠标在顶端一小部分矩形中拖动才有效,而不是不管拖动哪里都可以将界面移动,如果不需要else中PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));这一句就可以了mEnableWindowSize这个变量作用是区分窗口是否可以放大缩小,自己决定值我这个类是我程序所有对话框的基类,有的窗口需要放大缩小,有的不需要
    mSizeX,mSizeY是对话框能缩放的最小值
      

  10.   

    刚你说“mSizeX,mSizeY是窗口最大宽高”,原来其实他是窗体可呗调整的最小大小
    问题在这嗯,十分的感谢 joey_zoy和大家。问题已经解决。
    只是分太少了,挺不好意思的,非常感谢!