深入浅出话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++实现绘图

posted @ 2014-01-06 12:44  Learning hard  阅读(3125)  评论(0编辑  收藏  举报