在CDrawView类中,增加了对鼠标左键和右键的消息响应函数。
在CDrawView类的头文件中,已经声明了
private:
CPoint m_old;在CDrawView::OnLButtonDown中,记录下了原点的位置。 
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) 
{
m_old = point; //记录原点的位置
CView::OnLButtonDown(nFlags, point);
}
在CDrawView::OnLButtonUp中,进行画线
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) 
{
CWindowDC dc(GetDesktopWindow()); //
dc.MoveTo(m_old);
dc.LineTo(point);
CView::OnLButtonUp(nFlags, point);
}编译没有问题,但是结果非常不正确。
不能在非客户区画线。鼠标移到非客户区的话,应用程序会切换。
在客户区画线,线条会显示在客户区之外。开发环境是xp(sp2)+vc6.0

解决方案 »

  1.   

    void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
    {
    CWindowDC dc(GetDesktopWindow()); //
    dc.MoveTo(m_old);
    dc.LineTo(point);
    CView::OnLButtonUp(nFlags, point);
    } 鼠标操作的point都是屏幕坐标的,而dc操作都是客户区坐标,两者需要转换
      

  2.   

    CWindowDC dc(GetDesktopWindow());
    这句不是获取非客户区的dc吗?
      

  3.   


    void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) 

    ClientToScreen(&point);   //加上这条语句CWindowDC dc(GetDesktopWindow()); // 
    dc.MoveTo(m_old); 
    dc.LineTo(point); 
    CView::OnLButtonUp(nFlags, point); 
      

  4.   

    请问 为什么 不能在非客户区画线。
    ClientToScreen(&point); 这句也加上了。但是还是只能在客户区画线。鼠标不能离开应用程序,如果鼠标移到非客户区的话,应用程序会切换。
      

  5.   

    OnLButtonUp(UINT nFlags, CPoint point) 
    该函数响应的是客户区事件,当然对NC_(非客户)消息无法响应!
      

  6.   

    CWindowDC dc(GetDesktopWindow()); // 
    这个函数的用法是得到一个桌面窗口的dc吧?得到这个dc之后,就应该可以在桌面窗口画线了啊!
      

  7.   

    鼠标消息中得到的坐标点是屏幕坐标,绘图用的是客户区坐标,这个需要转换。
    另外,调用一下:Invalidate();
      

  8.   

    试试这样行不
    定义一个全局变量CPoint pt;
    在视类里的两个消息响应函数:
    OnLButtonDown: pt = point;
           ClientToScreen(&pt);OnLButtonUp: CWindowDC dc(GetDesktopWindow()); // 
            dc.MoveTo(pt); 
            ClientToScreen(&point);
            dc.LineTo(point); 
    在框架类里加两个消息(WM_NCLBUTTONUP,WM_NCLBUTTONDOWM,响应非客户区域左键点击)相应函数:
    OnNcLButtonDown:pt = point;OnNcLButtonUp:
    CWindowDC dc(GetDesktopWindow()); 
    dc.MoveTo(pt);
    dc.LineTo(point);
      

  9.   

    GetWindowDC获取整个窗口的DC,包括非客户区. GetDC获取客户区DC.
      

  10.   

    定义一个全局变量CPoint pt; 
    在视类里的两个消息响应函数: 
    OnLButtonDown: pt = point; 
          ClientToScreen(&pt); OnLButtonUp: CWindowDC dc(GetDesktopWindow()); // 
            dc.MoveTo(pt); 
            ClientToScreen(&point); 
            dc.LineTo(point); 
    在框架类里加两个消息(WM_NCLBUTTONUP,WM_NCLBUTTONDOWM,响应非客户区域左键点击)相应函数: 
    OnNcLButtonDown:pt = point; OnNcLButtonUp: 
    CWindowDC dc(GetDesktopWindow()); 
    dc.MoveTo(pt); 
    dc.LineTo(point);