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

  • 相关阅读:
    Get-CrmSetting返回Unable to connect to the remote server的解决办法
    Dynamics 365中的常用Associate和Disassociate消息汇总
    Dynamics 365 Customer Engagement V9 活动源功能报错的解决方法
    Dynamics Customer Engagement V9版本配置面向Internet的部署时候下一步按钮不可点击的解决办法
    Dynamics 365检查工作流、SDK插件步骤是否选中运行成功后自动删除系统作业记录
    注意,更改团队所属业务部门用Update消息无效!
    Dynamics 365的审核日志分区删除超时报错怎么办?
    Dynamics 365使用Execute Multiple Request删除系统作业实体记录
    Dynamics 365的系统作业实体记录增长太快怎么回事?
    Dynamics CRM日期字段查询使用时分秒的方法
  • 原文地址:https://www.cnblogs.com/zhili/p/CppDraw.html
Copyright © 2020-2023  润新知