1. 程式人生 > >深入淺出話VC++(3)——VC++實現繪圖操作

深入淺出話VC++(3)——VC++實現繪圖操作

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. 繪製連續的線條

實現程式碼:

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);
}
完整的實現原始碼下載:C++實現繪圖