关闭

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

标签: vc++.net出版文档存储工作
718人阅读 评论(0) 收藏 举报
分类:

这个程序是王华、朱时银、史兰等编著《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反而客串了一次“秘书”……

 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:5023次
    • 积分:131
    • 等级:
    • 排名:千里之外
    • 原创:8篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    文章存档