- 浏览: 103390 次
- 性别:
- 来自: 昆明
文章分类
- 全部博客 (151)
- 120D02 (5)
- 直升机 (1)
- 我的技术资料收集 (82)
- 的技术资料收集 (4)
- .NET Solution (2)
- ASP.NET (1)
- Linq to sql (1)
- 数据库技术(MS SQL) (2)
- 架构/设计 (1)
- 敏捷/持续集成 (1)
- C#.NET开发 (1)
- Matlab开发 (1)
- WinForm开发 (1)
- 开源技术 (1)
- jQuery (1)
- 我的博文 (4)
- js (2)
- android (2)
- 9. 读书笔记 (1)
- CSS3 (1)
- HTML5 (1)
- JavaScript (5)
- 移动开发 (2)
- 编程心得 (1)
- Linux操作系统 (1)
- (BI)商业智能 (1)
- IOS (1)
- Windows Phone (2)
- C# API (1)
- JQuery系列 (1)
- TFS (1)
- C# (2)
- ExtJs (1)
- .NET (1)
- Nginx (1)
- WCF学习笔记 (1)
- Computer Graphic (1)
- IT产品 (1)
- 工具分享 (1)
- MySelf (1)
- C#专栏 (1)
- 管理 (1)
- 基于Oracle Logminer数据同步 (1)
- 日常 (1)
- 实用工具 (1)
- 网页设计 (1)
- avalon (1)
- flash (1)
- DDD (1)
- 01 技术Android (1)
- WCF (1)
- selenium (1)
最新评论
-
464410531:
三国杀。。。。。。。。。。。。。。。。。。。。。。。。。。。。 ...
实用的职场宝典:不提拔你,就因为你只想把工作做好
近期,公司的一个项目是采用华迈SDK来做一套C/S架构的监控中心。自己犯了两个低级错误,写出来看看有多少朋友平时跟我一样没注意,哈哈。
第一个错误是这样出现的:在最初的几个版本中比较顺利。于是有点飘飘然,连续提交了好几个版本都没有进行全面测试。直到一个完成得差不多的版本出现后,来了一次全面的测试。这个时候发现,居然主界面显示不正常。找了好久原因没找到,只好回退到之前最初几个正常的版本,然后建立了个分支专门来排除此问题。一个一个版本的合并,一个一个文件的差异对比,最终定位到一个版本中原来把CXXX::OnPaint()中的CPaintDC dc(this);写成了CClientDC dc(this);
下面是错误分析。
《Windows 程序设计》里曾经说过,在WM_PAINT中一定要成对使用BeginPaint跟EndPaint。否则程序会不停产生WM_PAINT消息。而MFC的CPaintDC的构造与析构中封装了BeginPaint及EndPaint。而CClientDC则没有,所以在OnPaint中使用CClientDC当然是不行的。惭愧啊,惭愧。一时疏忽浪费我整整一个下午找这个BUG。
第二个错误更加惭愧了。直接看码:
void CDxHMContainer::OnPaint()
{
CPaintDC dc(this);
for (UINT i = 0; i < m_vecChilds.size();i++)
{
if (m_vecChilds[i]->IsSelect())
{
CRect rt;
CPen aNewPen,*pOldPen;
int nOldRop = dc.SetROP2(R2_NOTXORPEN);
m_vecChilds[i]->GetClientRect(rt);
rt.InflateRect(2,2);
m_vecChilds[i]->ClientToScreen(rt);
this->ScreenToClient(rt);
aNewPen.CreatePen(PS_SOLID,3,m_colorFrame);
pOldPen = (CPen*)dc.SelectObject(aNewPen);
dc.Rectangle(rt);
dc.SelectObject(pOldPen);// 这里报错
dc.SetROP2(nOldRop);
}
}
}
这段代码很诡异,有时候运行个两三个小时不会出错,有时候三五分钟就出错。请先不要着急看下面的错误分析,你能看出这段代码有什么问题吗?
当初这段代码报错,说实话我一时半会还真没找到原因。最后看MSDN的关于CDC::SelectObject的相关文档,才终于找到原因。
CDC::SelectObject重载了很多种方法。上面代码出错的原因是第一次调用使用的的函数原型是 HGDIOBJ CDC::SelectObject(HGDIOBJ),
而第二次使用的函数原型确是 CBitmap* CDC::SelectObject(CBitmap*)。对于上述代码第一次调用的时候,将HGDIOBJ强行转成CBitmap*实在有点惨不忍睹啊。。。。。。如此,便导致了悲催的崩溃。
发表评论
-
Javascript:猜猜弹出的是啥?为啥? - 幸福框架
2013-06-28 13:33 389原帖地址:http://www.cnblogs.com/hap ... -
C#中WindowsForm常见控件的运用 -- - 李晓峰
2013-06-28 13:27 1663原帖地址:http://www.cnblogs.com/liy ... -
海量数据处理利器之Hash——在线邮件地址过滤 - MyDetail
2013-06-27 12:00 599原帖地址:http://www.cnblo ... -
ASP.NET MVC 4 for Visual Studio 2010 下载地址 - 张鸿伟
2013-06-27 11:48 707原帖地址:http://www.cnblogs.com/wei ... -
【ASP.NET Web API教程】6.2 ASP.NET Web API中的JSON和XML序列化 - r01cn
2013-06-26 11:00 870原帖地址:http://www.cnblogs.com/r01 ... -
[珠玑之椟]估算的应用与Little定律 - 五岳
2013-06-26 10:54 582原帖地址:http://www.cnblogs.com/wuy ... -
30行,金额转人民币大写的代码 - 史蒂芬.王
2013-06-26 10:42 969原帖地址:http://www.cnblogs.com/ste ... -
从银行的钱荒看一个公司的团队建设 产品线过多最终导致最赚钱的项目面临破产 - James Li
2013-06-26 10:36 593原帖地址:http://www.cnblogs.com/Jam ... -
Windows 8 动手实验系列教程 实验6:设置和首选项 - zigzagPath
2013-06-25 13:39 487原帖地址:http://www.cnblogs.com/zig ... -
闲聊可穿戴设备 - shawn.xie
2013-06-25 13:33 576原帖地址:http://www.cnblo ... -
如何使用开源库,吐在VS2013发布之前,顺便介绍下VS2013的新特性"Bootstrap" - 量子计算机
2013-06-25 13:27 827原帖地址:http://www.cnblogs.com/DSh ... -
一步一步将自己的代码转换为观察者模式 - 文酱
2013-06-23 11:36 565原帖地址:http://www.cnblo ... -
iOS内存错误EXC_BAD_ACCESS的解决方法(message sent to deallocated instance) - VicStudio
2013-06-23 11:30 496原帖地址:http://www.cnblogs.com/vic ... -
记录asp.net在IE10下事件丢失排错经过 - Adming
2013-06-23 11:24 659原帖地址:http://www.cnblogs.com/wea ... -
记 FineUI 官方论坛所遭受的一次真实网络攻击!做一个像 ice 有道德的黑客! - 三生石上
2013-06-23 11:18 750原帖地址:http://www.cnblogs.com/san ... -
3、使用Oracle Logminer同步Demo
2013-06-19 10:33 532原帖地址:http://www.cnblogs.com/shi ... -
算法实践——数独的基本解法
2013-06-19 10:27 1389原帖地址:http://www.cnblogs.com/gre ... -
简单实现TCP下的大文件高效传输
2013-06-19 10:21 645原帖地址:http://www.cnblogs.com/sma ... -
avalon - 初步接触
2013-06-18 10:06 748原帖地址:http://www.cnblogs.com/aar ... -
Nginx学习笔记(一) Nginx架构
2013-06-18 09:59 490原帖地址:http://www.cnblogs.com/cod ...
相关推荐
MFC_GDI绘图基础
作者:TCS~T 技术支持:2827445707 技术群;861627004 MFC的GDI绘图
MFC程序设计详细实例 第13章 MFC GDI与绘图MFC程序设计详细实例 第13章 MFC GDI与绘图MFC程序设计详细实例 第13章 MFC GDI与绘图MFC程序设计详细实例 第13章 MFC GDI与绘图MFC程序设计详细实例 第13章 MFC GDI与绘图...
关于MFC ,windows绘图相关知识
自己写的GDI绘图 填充模式有点怪,未解决
使用GDI绘图技术在单文档视图中进行画直线、矩形和椭圆,里面还有避免闪烁的优化,当切换进行重绘时还可以显示所画图形,适合初学者学习研究。
MFC通过GDI+使用双缓存绘图,避免闪烁,提高绘图效率。
MFC GDI多线程绘图
关于GDI的基本概念 什么是GDI? Windows绘图的实质就是利用Windows提供的图形设备接口GDI(Graphics Device Interface)将图形绘制在显示器上。 在Windows操作系统中,动态链接库C:/WINDOWS/system32/gdi32.dll(GDI...
MFC GDI与绘图
MFC使用GDI+编程设置
mfc 使用gdi画图、打开图片、保存图片,内有gdi使用的说明文档
MFC使用GDI+的正确配置
这段时间做项目用到GDI+绘制图形,在网上找了很多关于双缓存的资料大多是讲图片方面的,关于绘图的讲的很少。自己做了个希望对大家有帮助
MFC程序,使用GDI绘图,关于GDI绘图的缓冲问题,运用到掩码位图,显示透明位图的过程编码
也一直看不到,因为一直都不动手,今天偶然百度查询资料,终于实现了GDI+绘图的基本流程了,因此总结下基本编写代码的流程,分为单文档,和对话框两种方式来绘图,也写出了注意要点,在此分享,也方便以后自己使用
资源里面是一个工程。简单的使用GDI进行绘图(图片)。使用C++语言,基于mfc的对话框实现。
纯手写,基于MFC写的GDI绘图,供初学者使用参考,这是自己工程的CPP和.h文件
界面设计使用VC++ MFC,棋盘和棋子使用 GDI 绘图,棋盘落子信息使用二维数组保存,判断胜负采用循环遍历计数法。