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

  • 相关阅读:
    windows下载
    vue-element-admin改造步骤
    js处理url
    好用的工具
    数据库设计工具
    虚拟机使用
    Mac上编译C
    MAC系统配置
    SQL语法
    SSMP一次请求数据处理过程分析
  • 原文地址:https://www.cnblogs.com/zhili/p/CppDraw.html
Copyright © 2020-2023  润新知