[注明: 文章是写给自己看的,想要表达的东西牵涉太多,文字很乱。]

思想一:你输入电脑什么东西,电脑就给你展示什么东西。

在我没入门编程之前,我一直在想:要用MFC在电脑屏幕上实现简单的鼠标拖动画画,然后保存所画图形,就像windows自带的画板程序一样。为啥一定要如下新建一个类来保存笔宽,线条数目这些变量呢?

 1 class CStroke: public CObject
 2 {
 3    public:
 4       CStroke(UINT  nPenWidth);
 5    protected:
 6       CStroke();
 7       DECLARE_SERIAL(CStroke)
 8    public:
 9       UINT  m_nPenWidth;    //画笔的宽度
10    public:
11       CArray<CPoint,CPoint>  m_pointArray;//每条线条包含的所有像素
12    public:
13       BOOL  DrawStroke(CDC*  pDC);         //在屏幕上作画
14    public:
15       virtual  void Serialize(CArchive&  ar);  //保存数据到硬盘
16 }
View Code

我们知道C++对象在构造的时候会分配内存并赋值。内存里面的东西时常变化,如果不显示在屏幕上,我们根本不知道计算机干了些什么!而在内存所有的地址单元中存在一个叫内存缓冲区的东西,其实就是操作系统额外开辟的一块内存,本质上和其它内存单元没有区别,只不过这块内存里的数据是用来传送给显卡,进一步来刷新电脑屏幕的。那为啥要在内存中建一个内存缓冲区呢?而不是让CPU直接把其他内存单元中的数据发往显卡呢? 主要是提高内存和显存的沟通效率。好比让一辆大货车只装10箱子苹果从上海运往深圳去卖,赚到的利润都不够付油钱!基于这个道理,通常情况下,内存缓冲区需要一次性装满才往显存那里发送最新数据。如果内存缓冲区数据一直没变,屏幕内容也就不会变化。因此我们必须设定m_nPenWidth,  m_pointArray这些变量,在CStroke对象构造的时候,给内存单元赋值,左键单击并移动鼠标,会不断引起I/O中断,通知CPU,然后CPU就会不断的给m_pointArray额外分配内存空间,并给内存中一个个CStroke对象的成员变量赋值,也即增加坐标点数据,然后传给缓冲区,再传给显卡,显卡转化为一个个像素的坐标,然后屏幕上就出现了一个个像素点被描黑了,线条出现了。

简单讲,界面编程其实就是设置设置屏幕上一个个像素点的颜色。只不过聪明的前辈把它抽象化,对象化,操作起来更加简便,把内存这个东西隐藏起来了。