VC中MFC下的繪圖初步解析

來源:互聯網
上載者:User

作者:zieckey(zieckey@yahoo.com.cn)
All Rights Reserved!

首先我們說下通過滑鼠的移動來繪製直線。
這裡要捕獲到滑鼠的兩個訊息:WM_LBUTTONDOWN, WM_LBUTTONUP
響應WM_LBUTTONDOWN訊息記錄直線的起始點,響應WM_LBUTTONUP訊息記錄直線的終點並繪製直線。
好了,我們看看怎麼響應。
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
//MessageBox("Left Button Clicks DrawView");
m_ptOrigin = point ;         //這裡先定義了一個內部變數儲存直線的起始點
CView::OnLButtonDown(nFlags, point);
}

下面看看響應WM_LBUTTONUP訊息記錄直線的終點並繪製直線。

//方法一
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
HDC hdc;
hdc = ::GetDC(m_hWnd); //調用全域函數
MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,0);
LineTo(hdc,point.x,point.y);
::ReleaseDC(m_hWnd,hdc);
CView::OnLButtonUp(nFlags, point);
}
//方法二
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
CDC *pDC = GetDC();
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);
}
//方法三
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
CClientDC dc(this) ;    //CClientDC物件建構的時候就調用了GetDC,析構的時候調用

ReleaseDC ,只能訪問客戶區
CClientDC dc(GetParent());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
}
//方法四
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
CWindowDC dc(this) ;   //CWindowDC可以訪問客戶區和非客戶區
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
}
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
CWindowDC dc(GetDesktopWindow()) ;   //現在可以訪問案頭
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
}

連續線繪圖:
思路:滑鼠移動的訊號被捕捉到,然後隨時響應該訊號,繪製圖線
這裡要設定一個BOOL變數 m_bDraw 來判斷是否滑鼠左鍵按下了。

//畫連續的線條
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
if ( m_bDraw )
{
   CClientDC dc(this) ;
   dc.MoveTo(m_ptOrigin);   //移動到原來的點
   dc.LineTo(point); //繪製直線
   m_ptOrigin = point ; //將現在的點賦值給原來的座標,以便下次調用
}
CView::OnMouseMove(nFlags, point);
}

//改變畫筆的顏色
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
if ( m_bDraw )
{
   CClientDC dc(this) ;
   CPen pen( PS_SOLID , 1 , RGB(255,128,128) );
   CPen *pOldPen = dc.SelectObject(&pen);
   dc.MoveTo(m_ptOrigin);
   dc.LineTo(point);
   m_ptOrigin = point ;
   dc.SelectObject(pOldPen);
}
CView::OnMouseMove(nFlags, point);
}

//畫扇型
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
if ( m_bDraw )
{
   CClientDC dc(this) ;
   CPen pen( PS_SOLID , 1 , RGB(255,128,128) );
   CPen *pOldPen = dc.SelectObject(&pen);
   dc.MoveTo(m_ptOrigin);
   dc.LineTo(m_ptOld);
   dc.MoveTo(m_ptOrigin);
   dc.LineTo(point);
   m_ptOld = point ;
   dc.SelectObject(pOldPen);
}
CView::OnMouseMove(nFlags, point);
}
//畫帶邊線的扇型
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{

if ( m_bDraw )
{
   CClientDC dc(this) ;
   CPen pen( PS_SOLID , 1 , RGB(255,128,128) );
   CPen *pOldPen = dc.SelectObject(&pen);
   dc.MoveTo(m_ptOrigin);
   dc.LineTo(m_ptOld);
   dc.MoveTo(m_ptOrigin);
   dc.LineTo(point);
   dc.MoveTo(m_ptOld);
   dc.LineTo(point);
   m_ptOld = point ;
   dc.SelectObject(pOldPen);
}
CView::OnMouseMove(nFlags, point);
}

//看看繪圖的模式設定方法
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
if ( m_bDraw )
{
   CClientDC dc(this) ;
   dc.SetROP2(R2_BLACK);   //繪圖的模式設定,始終繪製黑色圖形
   CPen pen( PS_SOLID , 1 , RGB(255,128,128) );
   CPen *pOldPen = dc.SelectObject(&pen);
   dc.MoveTo(m_ptOrigin);
   dc.LineTo(m_ptOld);
   dc.MoveTo(m_ptOrigin);
   dc.LineTo(point);
   dc.MoveTo(m_ptOld);
   dc.LineTo(point);
   m_ptOld = point ;
   dc.SelectObject(pOldPen);
}

CView::OnMouseMove(nFlags, point);
}

到此,我們知道了一般地繪圖方法了。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.