MFC 直线

 

  这里要捕获到鼠标的两个消息:WM_LBUTTONDOWN, WM_LBUTTONUP。响应WM_LBUTTONDOWN消息记录直线的起始点,响应WM_LBUTTONUP消息记录直线的终点并绘制直线。

 

 

Code:
  1. void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)    
  2. {   
  3.  //MessageBox("Left Button Clicks DrawView");   
  4.  m_ptOrigin = point ; //这里先定义了一个内部变量保存直线的起始点   
  5.  CView::OnLButtonDown(nFlags, point);   
  6. }   

下面看看响应WM_LBUTTONUP消息记录直线的终点并绘制直线。

Code:
  1. //方法一   
  2. void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)    
  3. {   
  4.  HDC hdc;   
  5.  hdc = ::GetDC(m_hWnd); //调用全局函数   
  6.  MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,0);   
  7.  LineTo(hdc,point.x,point.y);   
  8.  ::ReleaseDC(m_hWnd,hdc);   
  9.  CView::OnLButtonUp(nFlags, point);   
  10. }   
  11.   
  12. //方法二   
  13. void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)    
  14. {   
  15.  CDC *pDC = GetDC();   
  16.  pDC->MoveTo(m_ptOrigin);   
  17.  pDC->LineTo(point);   
  18.  ReleaseDC(pDC);   
  19. }   
  20.   
  21. //方法三   
  22. void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)    
  23. {   
  24.  CClientDC dc(this) ; //CClientDC对象构造的时候就调用了GetDC,析构的时候调用ReleaseDC ,只能访问客户区CClientDC dc(GetParent());   
  25.  dc.MoveTo(m_ptOrigin);   
  26.  dc.LineTo(point);   
  27. }   
  28.   
  29. //方法四   
  30. void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)    
  31. {   
  32.  CWindowDC dc(this) ; //CWindowDC可以访问客户区和非客户区   
  33.  dc.MoveTo(m_ptOrigin);   
  34.  dc.LineTo(point);   
  35. }   
  36. void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)    
  37. {   
  38.  CWindowDC dc(GetDesktopWindow()) ; //现在可以访问桌面   
  39.  dc.MoveTo(m_ptOrigin);   
  40.  dc.LineTo(point);   
  41. }   

 

 

连续的直线

Code:
  1.   
  2. //画连续的线条   
  3. void CDrawView::OnMouseMove(UINT nFlags, CPoint point)    
  4. {   
  5.  if ( m_bDraw )   
  6.  {   
  7.   CClientDC dc(this) ;   
  8.   dc.MoveTo(m_ptOrigin); //移动到原来的点   
  9.   dc.LineTo(point); //绘制直线    
  10.   m_ptOrigin = point ; //将现在的点赋值给原来的坐标,以便下次调用   
  11.  }   
  12.  CView::OnMouseMove(nFlags, point);   
  13. }   
  14.   
  15.   
  16. //改变画笔的颜色   
  17. void CDrawView::OnMouseMove(UINT nFlags, CPoint point)    
  18. {   
  19.  if ( m_bDraw )   
  20.  {   
  21.   CC   
  22. lientDC dc(this) ;   
  23.   CPen pen( PS_SOLID , 1 , RGB(255,128,128) );   
  24.   CPen *pOldPen = dc.SelectObject(&pen);   
  25.   dc.MoveTo(m_ptOrigin);   
  26.   dc.LineTo(point);   
  27.   m_ptOrigin = point ;   
  28.   dc.SelectObject(pOldPen);   
  29.  }   
  30.  CView::OnMouseMove(nFlags, point);   
  31. }   
  32.   
  33.   
  34. //画扇型   
  35. void CDrawView::OnMouseMove(UINT nFlags, CPoint point)    
  36. {   
  37.  if ( m_bDraw )   
  38.  {   
  39.   CClientDC dc(this) ;   
  40.   CPen pen( PS_SOLID , 1 , RGB(255,128,128) );   
  41.   CPen *pOldPen = dc.SelectObject(&pen);   
  42.   dc.MoveTo(m_ptOrigin);   
  43.   dc.LineTo(m_ptOld);   
  44.   dc.MoveTo(m_ptOrigin);   
  45.   dc.LineTo(point);   
  46.   m_ptOld = point ;   
  47.   dc.SelectObject(pOldPen);   
  48.  }   
  49.  CView::OnMouseMove(nFlags, point);   
  50. }   
  51.   
  52.   
  53. //画带边线的扇型   
  54. void CDrawView::OnMouseMove(UINT nFlags, CPoint point)    
  55. {   
  56.  if ( m_bDraw )   
  57.  {   
  58.   CClientDC dc(this) ;   
  59.   CPen pen( PS_SOLID , 1 , RGB(255,128,128) );   
  60.   CPen *pOldPen = dc.SelectObject(&pen);   
  61.   dc.MoveTo(m_ptOrigin);   
  62.   dc.LineTo(m_ptOld);   
  63.   dc.MoveTo(m_ptOrigin);   
  64.   dc.LineTo(point);   
  65.   dc.MoveTo(m_ptOld);   
  66.   dc.LineTo(point);   
  67.   m_ptOld = point ;   
  68.   dc.SelectObject(pOldPen);   
  69.  }   
  70.  CView::OnMouseMove(nFlags, point);   
  71. }   
  72.   
  73.   
  74.   
  75. //看看绘图的模式设置方法   
  76. void CDrawView::OnMouseMove(UINT nFlags, CPoint point)    
  77. {    
  78.  if ( m_bDraw )   
  79.  {   
  80.   CClientDC dc(this) ;   
  81.   dc.SetROP2(R2_BLACK); //绘图的模式设置,始终绘制黑色图形   
  82.   CPen pen( PS_SOLID , 1 , RGB(255,128,128) );   
  83.   CPen *pOldPen = dc.SelectObject(&pen);   
  84.   dc.MoveTo(m_ptOrigin);   
  85.   dc.LineTo(m_ptOld);   
  86.   dc.MoveTo(m_ptOrigin);   
  87.   dc.LineTo(point);   
  88.   dc.MoveTo(m_ptOld);   
  89.   dc.LineTo(point);   
  90.   m_ptOld = point ;   
  91.   dc.SelectObject(pOldPen);   
  92.  }   
  93.  CView::OnMouseMove(nFlags, point);   
  94. }    

 

 

画移动的直线

Code:
  1. void CTestView::OnLButtonDown(UINT nFlags, CPoint point)    
  2. {   
  3.     // TODO: Add your message handler code here and/or call default   
  4.     end = point;   
  5.     pre = point;   
  6.     start = point;   
  7.     CView::OnLButtonDown(nFlags, point);   
  8. }   
  9.   
  10. void CTestView::OnMouseMove(UINT nFlags, CPoint point)    
  11. {   
  12.     // TODO: Add your message handler code here and/or call default   
  13.     CTestDoc*   pDoc   =   GetDocument();      
  14.     ASSERT_VALID(pDoc);      
  15.        
  16.     CDC   *pDC   =GetDC();      
  17.     int   OldROP   =   SetROP2(*pDC,   R2_NOTXORPEN);      
  18.     CBrush   brushWHITE(RGB(0,   0,   255));      
  19.     CBrush*   pOldBrush   =   pDC->SelectObject(&brushWHITE);      
  20.     CPen   penBlack;      
  21.     penBlack.CreatePen(PS_SOLID,   1,   RGB(255,   0,   0));      
  22.     CPen*   pOldPen   =   pDC->SelectObject(&penBlack);      
  23.      
  24.     if(nFlags)      
  25.     {      
  26.         pre =end;     
  27.         pDC->MoveTo(start.x,start.y);      
  28.         pDC->LineTo(pre.x,pre.y);      
  29.            
  30.   
  31.         end = point;   
  32.         pDC->MoveTo(start.x,start.y);      
  33.         pDC->LineTo(end.x,end.y);      
  34.     }      
  35.     pDC->SelectObject(pOldBrush);      
  36.     pDC->SelectObject(pOldPen);      
  37.     SetROP2(*pDC,OldROP);      
  38.   
  39.     CView::OnMouseMove(nFlags, point);   
  40. }   
  41.   
  42. void CTestView::OnLButtonUp(UINT nFlags, CPoint point)    
  43. {   
  44.     // TODO: Add your message handler code here and/or call default   
  45.     CTestDoc*   pDoc   =   GetDocument();      
  46.     ASSERT_VALID(pDoc);      
  47.       
  48.     CDC   *pDC   =GetDC();      
  49.     end = point;   
  50.     pDC->MoveTo(start.x,start.y);      
  51.        
  52.     CBrush   brushWHITE(RGB(0,   0,   255));      
  53.     CBrush*   pOldBrush   =   pDC->SelectObject(&brushWHITE);      
  54.     CPen   penBlack;      
  55.     penBlack.CreatePen(PS_SOLID,   1,   RGB(0,   0,   255));      
  56.     CPen*   pOldPen   =   pDC->SelectObject(&penBlack);      
  57.        
  58.     pDC->LineTo(end.x,end.y);      
  59.        
  60.     pDC->SelectObject(pOldBrush);      
  61.     pDC->SelectObject(pOldPen);      
  62.        
  63.     CView::OnLButtonUp(nFlags, point);   
  64. }  

 PS:有些代码需要根据实际情况,修改。不能直接应用。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值