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++ .Net 实例学习

VC++.NET中添加由C#编译的DLL引用的方法 http://blog.csdn.net/much0726/article/details/4986627 关于VC.NET的资料网络上...

vc++实现“动态”的位图动画实例

  • 2009年07月28日 13:15
  • 118KB
  • 下载

vb.net 教程 5-12 绘图实例之统计图 4 注意事项

窗体上我们设置了4个按钮,还有一个就是将绘制的统计图保存下来: Private Sub btnSave_Click(sender As Object, e As EventArgs) Hand...

vb.net 教程 5-12 绘图实例之统计图 2 折线图

继续上一期《绘图实例之统计图1》,继续讲解如何绘制折线图: 当按下“折线图”按钮时,调用三个函数,分别是绘制坐标轴、绘制折线、显示到窗口: Private Sub btnLineChart_C...

vb.net 教程 5-12 绘图实例之统计图 1 柱状图

前面几篇介绍了如何使用graphics绘制图像,这几篇准备介绍如何使用graphics提供的方法绘制统计图。 包括:柱状图、折线图、饼图。 假设知道某个公司1-4季度的盈利情况,我们来看看如何完成统计...

VC++.NET编程实例.rar

  • 2008年03月12日 14:43
  • 11.97MB
  • 下载

VC++信息安全编程(9)基于24位bmp位图的信息隐藏

信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是透明的。传统的信息隐藏起源于古老的隐写术。如在古希腊战争中,为了安全地传送军事情报,奴隶主...

VC++工具栏显示真彩色位图资源

问题:  论坛中有很多人提出:基于Windows的程序如资源管理器(Explorer.exe),IE等都能显示出漂亮的工具栏图像和图标。但是,用MFC开发的应用程序一般都只能显示16色的工具栏图像...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC++.Net绘图实例(利用位图缓存)
举报原因:
原因补充:

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