我的对话框是无边框的:  
    我映射了WM_NCHITTEST消息,在里面检测鼠标是否在对话框边缘,若是,则返回HT_BORDER(自定义的);  
    映射WM_NCLBUTTONDOWN消息,在里面将bool型变量m_down设为真;  
    映射WM_NCMOUSEMOVE,判断(nHitTest  ==  HT_BORDER  &&  m_down),若是,则说明鼠标在对话框边缘且鼠标被按下并拖动了,接着应该怎么办? 
    或者各位有更好办法?

解决方案 »

  1.   

    MoveWindow 我试过,我无法确定它的第一个参数应该怎么设
      

  2.   

    自己处理啊
    要例子,留下mail?
      

  3.   

    还是不要例子吧,参考:
    void CMyDlg::OnMouseMove(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    if(m_nMyHitTest == 20)//当鼠标没有选择拖动类型的时候改变鼠标状态
    {
    CRect rect;
    CRect staticRect;
    this->GetWindowRect(&rect);
    ScreenToClient(&rect);
    HCURSOR hCursor;
    if(point.x > rect.left && point.x < rect.right && 
    point.y > rect.top-FRAME_SPACE && point.y < rect.top+FRAME_SPACE)//上边框区域

    hCursor = AfxGetApp()->LoadStandardCursor(IDC_SIZENS);
    SetCursor(hCursor);
    }
    else if(point.x > rect.left && point.x < rect.right && 
    point.y > rect.bottom-FRAME_SPACE && point.y < rect.bottom+FRAME_SPACE)
    {
    hCursor = AfxGetApp()->LoadStandardCursor(IDC_SIZENS);
    SetCursor(hCursor);
    }
    else if(point.y > rect.top && point.y < rect.bottom && 
    point.x > rect.left-FRAME_SPACE && point.x < rect.left+FRAME_SPACE)
    {
    hCursor = AfxGetApp()->LoadStandardCursor(IDC_SIZEWE);
    SetCursor(hCursor);
    }
    else if( point.y > rect.top && point.y < rect.bottom && 
    point.x > rect.right-FRAME_SPACE && point.x < rect.right+FRAME_SPACE)
    {
    hCursor = AfxGetApp()->LoadStandardCursor(IDC_SIZEWE);
    SetCursor(hCursor);
    }
    GetDlgItem(IDC_STATIC_SIZE)->GetWindowRect(&staticRect);
    ScreenToClient(staticRect);
    if(staticRect.PtInRect(point))
    {
    hCursor = AfxGetApp()->LoadStandardCursor(IDC_SIZENWSE);
    SetCursor(hCursor);
    }
    }
    CDialog::OnMouseMove(nFlags, point);
    }
      

  4.   

    void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    CRect rect;
    CRect staticRect;
    this->GetWindowRect(&rect);
    ScreenToClient(&rect);
    HCURSOR hCursor;
    if(point.x > rect.left && point.x < rect.right && 
    point.y > rect.top-FRAME_SPACE && point.y < rect.top+FRAME_SPACE)//上边框区域

    hCursor = AfxGetApp()->LoadStandardCursor(IDC_SIZENS);
    SetCursor(hCursor);
    SetCapture();
    m_bChangeSize = TRUE;
    m_nMyHitTest = HTTOP;
    }
    else if(point.x > rect.left && point.x < rect.right && 
    point.y > rect.bottom-FRAME_SPACE && point.y < rect.bottom+FRAME_SPACE)
    {
    hCursor = AfxGetApp()->LoadStandardCursor(IDC_SIZENS);
    SetCursor(hCursor);
    SetCapture();
    m_bChangeSize = TRUE;
    m_nMyHitTest = HTBOTTOM;
    }
    else if(point.y > rect.top && point.y < rect.bottom && 
    point.x > rect.left-FRAME_SPACE && point.x < rect.left+FRAME_SPACE)
    {
    hCursor = AfxGetApp()->LoadStandardCursor(IDC_SIZEWE);
    SetCursor(hCursor);
    SetCapture();
    m_bChangeSize = TRUE;
    m_nMyHitTest = HTLEFT;
    }
    else if( point.y > rect.top && point.y < rect.bottom && 
    point.x > rect.right-FRAME_SPACE && point.x < rect.right+FRAME_SPACE)
    {
    hCursor = AfxGetApp()->LoadStandardCursor(IDC_SIZEWE);
    SetCursor(hCursor);
    SetCapture();
    m_bChangeSize = TRUE;
    m_nMyHitTest = HTRIGHT;
    }
    GetDlgItem(IDC_STATIC_SIZE)->GetWindowRect(&staticRect);
    ScreenToClient(staticRect);
    if(staticRect.PtInRect(point))
    {
    hCursor = AfxGetApp()->LoadStandardCursor(IDC_SIZENWSE);
    SetCursor(hCursor);
    SetCapture();
    m_bChangeSize = TRUE;
    m_nMyHitTest = HTBOTTOMRIGHT;
    }
    CDialog::OnLButtonDown(nFlags, point);
    }void CMyDlg::OnLButtonUp(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    BOOL bChangeStatic = TRUE;
    // TODO: Add your message handler code here and/or call default
    if(m_bChangeSize)
    {
    m_bChangeSize = FALSE;
    TRACE("OnLButtonUp\n");
    ::ReleaseCapture();
    CPoint CurPoint;
    CRect  DlgRect;
    GetCursorPos(&CurPoint);
    GetWindowRect(DlgRect);
    CRect rectTemp,rectTemp1;
    GetDlgItem(IDC_STATIC_SIZE)->GetWindowRect(&rectTemp); 
    GetDlgItem(IDC_STATIC_SIZE)->GetWindowRect(&rectTemp1); 
    ScreenToClient(rectTemp1);
    bChangeStatic = rectTemp1.PtInRect(point);
    int RightWidth = DlgRect.right - rectTemp.right;
    int BottomWidth = DlgRect.bottom - rectTemp.bottom;
    int Width = rectTemp.right -rectTemp.left;
    int Hight = rectTemp.bottom - rectTemp.top;

    if(m_nMyHitTest == HTLEFT)
    {
    if(abs(DlgRect.left - CurPoint.x) > FRAME_SPACE)
    DlgRect.left = CurPoint.x;
    }
    else if(m_nMyHitTest == HTRIGHT)
    {
    if(abs(DlgRect.right - CurPoint.x) > FRAME_SPACE)
    DlgRect.right = CurPoint.x;
    }
    else if(m_nMyHitTest == HTTOP)
    {
    if(abs(DlgRect.top - CurPoint.y) > FRAME_SPACE)
    DlgRect.top = CurPoint.y;
    }
    else if(m_nMyHitTest == HTTOPLEFT)
    {
    DlgRect.top = CurPoint.y;
    DlgRect.left = CurPoint.x;
    }
    else if(m_nMyHitTest == HTTOPRIGHT)
    {
    DlgRect.top = CurPoint.y;
    DlgRect.right = CurPoint.x;
    }
    else if(m_nMyHitTest == HTBOTTOM)
    {
    if(abs(DlgRect.bottom - CurPoint.y) > FRAME_SPACE) 
    DlgRect.bottom = CurPoint.y;
    }
    else if(m_nMyHitTest == HTBOTTOMLEFT)
    {
    DlgRect.bottom = CurPoint.y;
    DlgRect.left = CurPoint.x;
    }
    else if(m_nMyHitTest == HTBOTTOMRIGHT)
    {
    if(!bChangeStatic)
    {
    DlgRect.bottom = CurPoint.y;
    DlgRect.right = CurPoint.x;
    }
    }
    MoveWindow(DlgRect);
    SetRedrawArea(DlgRect);
    if(!bChangeStatic)
    {
    rectTemp.right = DlgRect.right - RightWidth;
    rectTemp.left = rectTemp.right - Width;
    rectTemp.bottom = DlgRect.bottom - BottomWidth;
    rectTemp.top = rectTemp.bottom - Hight;
    ScreenToClient(rectTemp);
    GetDlgItem(IDC_STATIC_SIZE)->MoveWindow(rectTemp);
    }
    m_nMyHitTest = 20; //恢复鼠标为未选择拖动状态
    }
    CDialog::OnLButtonUp(nFlags, point);
    }
      

  5.   

    有例子吗?EMail: [email protected]
    麻烦vcleaner(我没做大哥已经很久了.......)发一个给我,谢谢
      

  6.   

    我试了一下,vcleaner的代码可以实现我的要求,谢谢!