深入淺出話VC++(3)——VC++實現繪圖操作
阿新 • • 發佈:2018-12-31
VC++實現繪圖操作,說白了也就是對API熟練操作了,下面介紹幾種繪圖
1. 繪製線條
具體實現程式碼如下:
// 滑鼠左鍵按下時的處理函式 void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此新增訊息處理程式程式碼和/或呼叫預設值 originP=point; CEditView::OnLButtonDown(nFlags, point); } // 滑鼠左鍵彈起時的處理函式,Point為彈起時滑鼠的點座標 void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: 在此新增訊息處理程式程式碼和/或呼叫預設值 //#pragma region 1.利用SDK全域性函式實現畫線功能 //// 首先獲得視窗的裝置描述表 //HDC hdc; //hdc=::GetDC(m_hWnd); //// 移動到線條的起點 //MoveToEx(hdc,originP.x,originP.y,NULL); //// 畫線 //LineTo(hdc,point.x,point.y); //// 釋放裝置描述表 //::ReleaseDC(m_hWnd,hdc); //#pragma endregion //#pragma region 2. 利用MFC的CDC類實現畫線功能 //CDC* mfcDC=GetDC(); //mfcDC->MoveTo(originP); //mfcDC->LineTo(point); //ReleaseDC(mfcDC); //#pragma endregion //#pragma region 3. 利用MFC的CClientDC類實現畫線功能 //CClientDC dc(this); //dc.MoveTo(originP); //dc.LineTo(point); //#pragma endregion //#pragma region 4. 利用MFC的CWindowDC類實現畫線功能 //CWindowDC wdc(this); //wdc.MoveTo(originP); //wdc.LineTo(point); //#pragma endregion #pragma region 5. 在桌面視窗中繪製彩色線 // 指定畫筆GDI物件 CPen pen(PS_SOLID,1,RGB(255,0,0)); // 獲得桌面裝置描述符 CWindowDC wdc(GetDesktopWindow()); // 使用SelectObject函式來實現把GDI物件選入裝置描述表中 // SelectObject函式返回指向先前被選物件的指標 CPen* pOldPen =wdc.SelectObject(&pen); wdc.MoveTo(originP); wdc.LineTo(point); // 把先前的GDI物件選入裝置描述表,以便恢復到先前的狀態 wdc.SelectObject(pOldPen); #pragma endregion CEditView::OnLButtonUp(nFlags, point); }
2. 使用畫刷繪製一塊區域
實現程式碼:
// CDrawRegionView 訊息處理程式 // 滑鼠左鍵按下訊息處理函式 void CDrawRegionView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此新增訊息處理程式程式碼和/或呼叫預設值 originPoint=point; CTreeView::OnLButtonDown(nFlags, point); } // 滑鼠左鍵彈起訊息處理函式 void CDrawRegionView::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: 在此新增訊息處理程式程式碼和/或呼叫預設值 #pragma region 1. 簡單畫刷 //// 建立一個紅色畫刷 //CBrush brush(RGB(255,0,0)); //// 建立並獲得裝置描述表 //CClientDC dc(this); //// 利用紅色畫刷填充滑鼠拖拽過程中形成的矩形區域 //dc.FillRect(CRect(originPoint,point),&brush); #pragma endregion #pragma region 2. 點陣圖畫刷 // 建立點陣圖物件 CBitmap bitmap; // 載入點陣圖資源 bitmap.LoadBitmapW(IDB_BITMAP1); // 建立點陣圖畫刷 CBrush bitmapBrush(&bitmap); // 建立並獲得裝置描述表 CClientDC dc2(this); // 利用點陣圖畫刷填充滑鼠拖拽過程中形成的矩形區域 dc2.FillRect(CRect(originPoint,point),&bitmapBrush); #pragma endregion #pragma region 3. 透明畫刷 // 建立並獲得裝置描述表 CClientDC dc3(this); // 建立一個空畫刷 CBrush *pBrush =CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); // 將空畫刷選入裝置描述表中 CBrush *oldBrush =dc3.SelectObject(pBrush); // 繪製一個矩形 dc3.Rectangle(CRect(originPoint,point)); // 恢復先前的畫刷 dc3.SelectObject(oldBrush); #pragma endregion CTreeView::OnLButtonUp(nFlags, point); }
3. 繪製連續的線條
實現程式碼:
完整的實現原始碼下載:C++實現繪圖void CDrawContinuousLineView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此新增訊息處理程式程式碼和/或呼叫預設值 originPt =point; isBeginDraw=true; CEditView::OnLButtonDown(nFlags, point); } void CDrawContinuousLineView::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: 在此新增訊息處理程式程式碼和/或呼叫預設值 isBeginDraw=false; CEditView::OnLButtonUp(nFlags, point); } // 滑鼠移動訊息的處理函式 void CDrawContinuousLineView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: 在此新增訊息處理程式程式碼和/或呼叫預設值 CClientDC dc(this); // 建立一個紅色,寬度為1的實現畫筆 CPen pen(PS_SOLID,1,RGB(255,0,0)); // 把建立的畫筆選入裝置描述表中 CPen* oldPen =dc.SelectObject(&pen); if(isBeginDraw==true) { dc.MoveTo(originPt); dc.LineTo(point); // 修改線段的起點 originPt=point; } // 恢復裝置描述表 dc.SelectObject(oldPen); CEditView::OnMouseMove(nFlags, point); }