博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入浅出话VC++(3)——VC++实现绘图操作
阅读量:6000 次
发布时间:2019-06-20

本文共 3616 字,大约阅读时间需要 12 分钟。

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);}

完整的实现源码下载:

转载地址:http://tfzmx.baihongyu.com/

你可能感兴趣的文章
CCF 201503-4 网络延时
查看>>
070101_描述性统计(均值,中位数,众数,方差,标准差,与常见的统计图表)...
查看>>
JAVA调用shell脚本利用ansible修改多节点上的redis参数
查看>>
oracle管理控制台不能打开,提示此网站的安全证书有问题?
查看>>
IE6 + png24 透明图片(滤镜)
查看>>
.net获取select控件中的文本内容
查看>>
Windows 8 Metro App开发[5]导航栏(AppBar)的使用
查看>>
shell expect
查看>>
Effective Java -- 使可变性最小化
查看>>
开发环境中Docker的使用
查看>>
Redis 分布式锁
查看>>
IBM、HPUX、Solaris不同之处
查看>>
kuangbin专题十六 KMP&&扩展KMP HDU3336 Count the string
查看>>
Python学习笔记——正则表达式基本概念
查看>>
verilog 里面,always和always@(*)有区别吗?
查看>>
86标准sql与92标准SQL用法区别
查看>>
SIO_KEEPALIVE_VALS 用户异常掉线检测
查看>>
Inno Setup入门(二)——修改安装过程中的图片
查看>>
第七周总结报告
查看>>
服务器性能瓶颈分析方法(转载)
查看>>