VC++.Net绘图实例(利用位图缓存)

原创 2007年09月24日 15:42:00

这个程序是王华、朱时银、史兰等编著《VC++.NET 开发指南与实例详析》, 机械工业出版社中的一个例子,不过觉得关键部分没有说得足够清楚,自己学的时候有点不顺。

实现这样一个东西:

使用鼠标在视图中画直线:当左键按下时该点作为起点,随鼠标移动动态画线,当松开左键时完成一条线。 

主要思路是这样的:

类定义{
          构造内存DC——pMemDC
          构造位图——pBitmap;
         
         

OnCreate{
         创建显示DC兼容的内存DC,用pMemDC指向;
         创建与显示DC的“位图”兼容的位图,用pBitmap指向;

OnDraw{
         //每次重绘时都会调用这个函数
         把内存DC的位图拷贝到显示DC,说白了就是把内存时图弄到文档上去;

On左键点下{
          记录起始位置;
          记录上一个位置(当前就是起始位置);
          正在作图标志置TRUE;

On鼠标移动(当前位置){
          if (正在作图){
                     //由于鼠标移动时线是动态生成的,所谓“动态”是那一条线的终点始终跟着鼠标走
                    //不能自动实现的,相当于是这样的过程:擦去上一次动态生成的线,这样就只留下了这次的线,
                    //如果不擦去,效果就是动一下出来一条线,最后画出来一个平面——起点与鼠标位置连线所扫过的面积
                   //下面两句完成的就是擦去的工作
                      
                       建立一个矩形,左上是起始位置,右下是上一个位置;
                      把这个矩形对的MemDC的部分拷贝到显示DC上去;
                  
                     //为什么这两句可以实现这个效果呢?接着看就会知道。这里可以先想一想现在的MemDC里放的是什么东西

                    
                     在显示DC上画线:从起始位置到当前位置; //这句就是画一条起点到当前点的线,但注意:
                                                                                                    //此处是直接在显示DC上画线,并未影响MemDC
                      
                    
         }

On左键放开(当前位置){
          if (正在画线){
                      在MemDC上画线:从起始位置到当前位置; //这句就是画一条起点到当前点的线,但注意:
                                                                                                    //此处是在MemDC上画线,还未影响显示DC
                      重绘屏幕(调用OnDraw,将MemDC拷贝到显示DC
         }

从上面的函数中可以看出,MemDC只在鼠标放下时才画一次线,鼠标不放下时MemDC并未改变,而动态追踪鼠标的其实是显示DC。也就是说,MemDC上存储的永远是画好的线,这样,在On鼠标移动函数中,将MemDC中对应的矩形拷贝到显示时实际就是将上一条线刚刚画好的位图的对应区域显示,这一区域中当然不会有这一次“悬而未决”的,用位图的覆盖实现了擦去临时线的效果。而在左键放开后MemDC上增加本次画的线。
我觉得这个例子看起来有点绕的原因就是我们的惯性思维MemDC肯定是用来“暂存的”,是“临时的”,而本例中MemDC才是拍扳的,最终的,真正的显示DC反而客串了一次“秘书”……

 

vc++掩码位图制作透明图片

  • 2013年06月02日 09:16
  • 975KB
  • 下载

深入浅出话VC++(3)——VC++实现绘图操作

VC++实现绘图操作,说白了也就是对API熟练操作了,下面介绍几种绘图 1. 绘制线条 具体实现代码如下: // 鼠标左键按下时的处理函数 void CDrawView::OnLBu...
  • lizhi3186575
  • lizhi3186575
  • 2014-01-06 12:45:29
  • 1515

VC 绘图,使用双缓冲技术实现 2012-02-06 16:47:07 分类: C/C++

*******所有的GDI绘图函数使用的都是逻辑坐标(逻辑范围)******************* *******************系统默认情况下 物理范围和逻辑范围 是1:1...
  • CAICHAO1234
  • CAICHAO1234
  • 2013-03-12 22:11:00
  • 1464

VC++ .Net 实例学习

VC++.NET中添加由C#编译的DLL引用的方法 http://blog.csdn.net/much0726/article/details/4986627 关于VC.NET的资料网络上...
  • bcbobo21cn
  • bcbobo21cn
  • 2017-06-18 16:55:07
  • 1018

【Python】Python的数据分析(四)——数据及绘图

1. 创建数组         numpy有五种方式可以创建数组: ① 由其他Python数据结构转换(如lists, tuples) >>>x=np.array([0,1,2,3]) ② 用...
  • shandianke
  • shandianke
  • 2015-01-03 22:33:54
  • 6243

利用VC++ GDI 实现的画图以及图像显示程序

  • 2014年12月11日 17:53
  • 7.59MB
  • 下载

OpenGL编程指南第八章:绘制像素、位图、字体和图像

这里的位图(bitmap)单bit每像素的阵列。这一章主要讲解如何把位图、图像绘制到帧缓冲区,以及如何从缓冲区读取像素数据。 1、bitmap 位图是0和1组成的矩形阵列,一般作为绘图时的遮罩。如...
  • longhuihu
  • longhuihu
  • 2012-08-29 16:56:48
  • 6081

位图缓存

何时启用缓存cacheAsBitmap     DisplayObject 类的 opaqueBackground 属性和 scrollRect 属性与使用 cacheAsBitmap 属性的位图...
  • u013487865
  • u013487865
  • 2014-02-17 17:17:48
  • 632

解决位图磁盘缓存失败

之前有客户在使用RemoteAPP的时候,遇到如下问题:   打开图标登录时,提示位图磁盘缓存失败:您的磁盘已满,或者缓存目录找不到或已损坏。有些位图可能无法显示。建议您现断开,再重新连接,以禁止...
  • higara
  • higara
  • 2014-04-03 13:50:21
  • 3615

Android开发之图片加载缓存框架Picasso的领教

Picasso是Square公司开源的一个Android图形缓存库,官方网址:http://square.github.io/picasso/...
  • li0978
  • li0978
  • 2016-08-18 14:19:31
  • 2124
收藏助手
不良信息举报
您举报文章:VC++.Net绘图实例(利用位图缓存)
举报原因:
原因补充:

(最多只允许输入30个字)