深入浅出话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,,RGB(,,)); // 获得桌面设备描述符
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,,RGB(,,));
// 把创建的画笔选入设备描述表中
CPen* oldPen =dc.SelectObject(&pen);
if(isBeginDraw==true)
{
dc.MoveTo(originPt);
dc.LineTo(point);
// 修改线段的起点
originPt=point;
} // 恢复设备描述表
dc.SelectObject(oldPen);
CEditView::OnMouseMove(nFlags, point);
}
完整的实现源码下载:C++实现绘图
深入浅出话VC++(3)——VC++实现绘图操作的更多相关文章
- WPF学习之深入浅出话模板
图形用户界面应用程序较之控制台界面应用程序最大的好处就是界面友好.数据显示直观.CUI程序中数据只能以文本的形式线性显示,GUI程序则允许数据以文本.列表.图形等多种形式立体显示. 用户体验在GUI程 ...
- MATLAB绘图功能(1) 二维高层绘图操作
文末源代码 部分源代码 %% 基本绘图操作 x=:*pi; y=sin(x); plot(x,y); % 第二个参数为矩阵 y1=sin(x); y2=cos(x); y3=0.002*exp(x); ...
- 封装CoreGraphics的API简化绘图操作
封装CoreGraphics的API简化绘图操作 效果 说明 1. 将CoreGraphics的API接口抽象为对象,让绘图变得简单易懂 2. 简化常用的绘制操作 3. 源码长期更新 源码 https ...
- Android通过onDraw实现在View中绘图操作
Android绘图操作,通过继承View实现,在onDraw函数中实现绘图. 下面是一个简单的例子: public class AndroidTest extends Activity { /** C ...
- matlab学习笔记8 基本绘图命令-基本绘图操作
一起来学matlab-matlab学习笔记8 基本绘图命令_2基本绘图操作 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 ...
- IDG资本全球拼图:近10年揽26家独角兽,最敢出手VC再造"VC+"
IDG资本全球拼图:近10年揽26家独角兽,最敢出手VC再造"VC+" 2017-04-01 15:33 两天前,IDG资本合伙人过以宏提出的“VC+”,又有了新的内涵——全球 ...
- 深入浅出话VC++(2)——MFC的本质
一.引言 上一专题中,纯手动地完成了一个Windows应用程序,然而,在实际开发中,我们大多数都是使用已有的类库来开发Windows应用程序.MFC(Microsoft Foundation Clas ...
- 深入浅出话VC++(1)——Windows程序内部运行机制
一.引言 要想熟练掌握Windows应用程序的开发,首先需要理解Windows平台下程序运行的内部机制,然而在.NET平台下,创建一个Windows桌面程序,只需要简单地选择Windows窗体应用程序 ...
- VC++大数据量绘图时无闪烁刷屏技术实现(我的理解是,在内存上作画,然后手动显示,而不再直接需要经过WM_PAINT来处理了)
http://hantayi.blog.51cto.com/1100843/383578 引言 当我们需要在用户区显示一些图形时,先把图形在客户区画上,虽然已经画好但此时我们还无法看到,还要通过 程序 ...
随机推荐
- Provisional headers are shown,本地测试成功,服务器运行却失败
基于MVC的项目 具体情况是一个页面在访问的时候进不了首页,但详细页面却可以进去 下面说说解决方法和思路,以便找出问题所在 第一:把服务器代码下载到本地运行,代码是否出错,出错了,问题找到了,没出错接 ...
- Java基础以及与C++的一些对比
这两天回忆一些Java基础,感觉自己很多地方都不是很牢固,也花费在不少时间和不少流量在手机上查资料. 还是写下来这些东西以免再忘记. 同时还是要记住多动手,编程最重要的就是动手敲啊,有想法有疑问就要自 ...
- NAT协议
NAT服务器的设定 NAT的全名:Network Address Translation;即网络地址的转换: iptables指令就能够修改IP封包的表头数据,IP的目标地址,源地址都可以修改. ...
- XidianOJ 1076 小W喜欢的数字
题目描述 大家都知道,小W是一名大帅哥,当然比起Light还是有点儿差距的!帅气的小W认为0-9这些数字,只有1,3,5是完美的. 欲问小W为什么,小W总是说"帅哥,是不需要解释的" ...
- malloc()参数为0的情况
问题来自于<程序员面试宝典(第三版)>第12.2节问题9(这里不评价<程序员面试宝典>,就题论题): 下面的代码片段输出是什么?为什么? char *ptr; ))==NULL ...
- oracle SQL查询中间若干条记录
方法一:利用rownum和差集函数minus select * from ( select * from emp order by sal) where rownum<13 minus sele ...
- URL验证
function isURL(str_url) { var strRegex = "^((https|http|ftp|rtsp|mms)?://)" + "?(([0- ...
- Hdu OJ 5115 Dire Wolf (2014ACM/ICPC亚洲区北京站) (动态规划-区间dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5115 题目大意:前面有n头狼并列排成一排, 每一头狼都有两个属性--基础攻击力和buff加成, 每一头 ...
- 技术英文单词贴--G
G generator 发电机,发生器,生产者
- 让spark运行在mesos上 -- 分布式计算系统spark学习(五)
mesos集群部署参见上篇. 运行在mesos上面和 spark standalone模式的区别是: 1)stand alone 需要自己启动spark master 需要自己启动spark slav ...