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

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