MFC學習筆記(2)

SDK中用GDI畫過圖玩  這次用MFC感覺差不多 MFC中也可以用API來畫  但是畢竟有些麻煩  

既然學MFC就來學學它畫圖的方式吧

首先說說 MFC的消息響應機制  在MFC中發送給窗口的消息是被MFC框架通過窗口句柄映射表和

消息映射表來用窗口類的函數進行響應的,這叫消息映射機制。

 

說說實際操作  比如用鼠標畫直線吧  我們得獲取鼠標左鍵摁下的消息  鼠標左鍵鬆開的消息  

 那麼我們要在view類中添加一個消息響應函數  之所以在view類中添加 是因爲view類是在框

架類之上的  直接在框架類上添加消息響應函數是無法響應消息的  

 

於是我們先在view類中添加2個響應函數 OnLButtonDown OnLButtonUp 在OnLButtonDown

中我們要獲取摁下鼠標的點的位置  所以在view類中再添加一個CPoint變量m_pt來獲得鼠標座標

然後在OnLButtonUp中得到鼠標鬆開時的座標值point   然後用MoveToEx和LineTo配合 便可以畫出

這條直線了

 

具體的幾種方式如下:

(1)SDK方法
 HDC hdc=::GetDC(m_hWnd);
 ::MoveToEx(hdc,m_point.x,m_point.y,NULL);
 ::LineTo(hdc,point.x,point.y);
 ::ReleaseDC(m_hWnd,hdc);

 

(2)CDC的方法

 CDC *pdc=GetDC();
 pdc->MoveTo(m_point);
 pdc->LineTo(point);
 ReleaseDC(pdc);

 

(3)CClientDC的方法         //隱式的回收了資源無需Release

 CClientDC dc(this);          //創建CClientDC對象dc
 dc.MoveTo(m_point);
 dc.LineTo(point);

 

(4)CWindowDC的方法          //可以對整個屏幕區域畫圖

 CWindowDC dc(GetDesktopWindow()); 
 dc.MoveTo(m_point);
 dc.LineTo(point);
 dc.SelectObject(pOldPen);

 

下面我們用例子直接說明創建畫筆或畫刷的用法

(1)//建畫筆

CPen pen(PS_DASH,1,RGB(21,34,244));
 CWindowDC dc(GetDesktopWindow());
 CPen *pOldPen=dc.SelectObject(&pen);
 dc.MoveTo(m_point);
 dc.LineTo(point);
 dc.SelectObject(pOldPen);

(2)//建畫刷
 CBrush brush(RGB(12,34,234));   
 CClientDC dc(this);
 dc.FillRect(CRect(m_point,point),&brush);

(3)//位圖畫刷
 CBitmap bitmap;
 bitmap.LoadBitmapW(IDB_BITMAP1);
 CBrush brush(&bitmap);
 CClientDC dc(this);
 dc.FillRect(CRect(m_point,point),&brush);

(4)//畫透明矩形
 CClientDC dc(this);
 CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));  //FromHandle是靜態成員函數 所以無

                                            //需創建對象直接調用 它的作用是把畫刷

                                            //句柄轉換爲指向對象的指針
 CBrush *pOldBrush=dc.SelectObject(pBrush);
 dc.Rectangle(CRect(m_point,point));
 dc.SelectObject(pOldBrush);

 

爲何第(2)個和第(3)個例子  沒用用SelectObject方法呢  很簡單 注意FillRect(CRect(m_point,point),&brush);


這個函數中已經選擇了&brush所以無需再由SelectObject來選擇

 

接下來用實例來說明簡單的畫圖程序

void C畫圖View::OnMouseMove(UINT nFlags, CPoint point)
{

 CClientDC dc(this);
 CPen pen(PS_SOLID,3,RGB(233,42,21));
 CPen *pOldPen=dc.SelectObject(&pen);
 if(m_bDraw==TRUE)                 //判斷鼠標是否摁下
 { 
  dc.SetROP2(R2_BLACK);
  dc.MoveTo(m_point);
  dc.LineTo(point);
  m_point=point;                   //注意這裏 
 }
 dc.SelectObject(pOldPen);
 CView::OnMouseMove(nFlags, point);
}

void C畫圖View::OnLButtonDown(UINT nFlags, CPoint point)
{

 m_point=point;
 m_bDraw=TRUE;
 CView::OnLButtonDown(nFlags, point);
}

void C畫圖View::OnLButtonUp(UINT nFlags, CPoint point)
{
 m_bDraw=FALSE;
 CView::OnLButtonUp(nFlags, point);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章