用位图创建的不规则窗体,映射了OnLButtonDown(UINT nFlags, CPoint point) 函数,但是移动时仍然有一个虚拟的矩形外框,请问怎么解决,有代码就更好了!!!

解决方案 »

  1.   

    BOOL CMainDialog::OnEraseBkgnd(CDC* pDC) 
    {
    // TODO: Add your message handler code here and/or call default
    CRect rect;
    this->GetWindowRect(rect);
    BITMAP tagBmp;
    m_iBitmap.GetBitmap(&tagBmp); pDC->StretchBlt( 0, 0, tagBmp.bmWidth, tagBmp.bmHeight, &m_dcPaint, 0, 0, tagBmp.bmWidth, tagBmp.bmHeight, SRCCOPY ); return TRUE;
    //return CWnd::OnEraseBkgnd(pDC);
    }
      

  2.   

    你是通过哪种方式实现窗体移动的?
    如下:void CTestDlg::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    SendMessage(WM_NCLBUTTONDOWN,HTCAPTION,0);
    CDialog::OnLButtonDown(nFlags, point);
    }
      

  3.   

    我的代码:void CDlgBmp::OnNcLButtonDown(UINT nHitTest, CPoint point) 
    {
        ::SystemParametersInfo(SPI_SETDRAGFULLWINDOWS,TRUE,NULL,0);
        CDlgBase::OnNcLButtonDown(nHitTest, point);
    }//void CDlgBmp::OnLButtonDown(UINT nFlags, CPoint point) 
    //{
    //    ::SystemParametersInfo(SPI_SETDRAGFULLWINDOWS,TRUE,NULL,0);
    //    CDlgBase::OnLButtonDown(nFlags, point);
    //}
    CDlgBmp就是透明的窗体,这里响应的时候WM_NCLBUTTONDOWN消息,响应WM_LBUTTONDOWN也是一样的,根据你的情况选择。
      

  4.   

    天啊 上面我的那个函数是改变系统设置的 整个系统都会改变了 
    用::SystemParametersInfo(SPI_SETDRAGFULLWINDOWS,FALSE,NULL,0); 我现在的系统是没有改不回来的 不知道为什么?
    可能需要重新启后生效。楼主考虑考虑 慎用
      

  5.   

    你在WM_LBUTTONDOWN消息中调用SetCapture,并记录鼠标光标的位置;再响应WM_MOUSEMOVE消息,根据鼠标移动前后的位置,计算出窗口应移动到哪里,然后用MoveWindow移动窗口;在WM_LBUTTONUP消息中ReleaseCapture。