首先,DC的含义是“设备关联”,用你那个“黑板”的比喻的话,DC其实就是个“黑板框”,并不是黑板本身。Windows的DC大体可以分为两类,一类是跟硬件相关联的设备DC,如屏幕、打印机等等。这些设备相当于真实的“黑板”。由于设备的物理特性的限制,这类“黑板”有特定的属性,例如分辨率、颜色位数等等。而设备DC,就是把这些真实“黑板”框起来的“黑板框”,你所绘制的图像,并不是画在DC上,而是画在设备上,DC不过是一个渠道而已。
另一类DC是内存DC,它没有跟任何设备向关联,仅仅是为了画图方便,而用它来在内存里模拟真实的设备。由于它没有对应任何真实的设备,因此它没有什么固定的属性。为了保证能模拟某个特定设备,内存DC在生成的时候必须指定它模拟哪个设备,因此它必须用CreateCompatibleDC来生成,其参数就是待模拟的设备DC。由于内存DC没有任何固定属性,因此将一个内存DC作为参数送入CreateCompatibleDC来生成另一个内存DC是不行的。
生成了内存DC之后,我们实际上仅仅拥有了一个黑板框。与设备DC不同,作为真实设备的“黑板”总是存在的,但内存DC的黑板则不然,它必须靠我们专门地在内存里制作一个出来才行。能够作为内存DC的黑板的东西就是Bitmap(你所谓的CBitmap仅仅是MFC对HBITMAP的封装,因此下面只谈HBITMAP)。由于没有了设备的物理限制,这个黑板你愿意做多大都行。为了能够更好地模拟真实的设备,这块黑板的生成,最好使用CreateCompatibleBitmap,并将需要模拟的设备DC传入其中。同样,不应该把一个内存DC作为参数送入CreateCompatibleBitmap,否则你会得到某些意料之外的结果。
生成了黑板之后,还需要把黑板“安装”进黑板框,才能进行画图。“安装”的方法就是使用SelectObject,把你生成的黑板放进你的内存DC。SelectObject返回的结果是从这个DC里被换下来的黑板。第一次安装黑板的时候,被换下来的是一块“NULL 黑板”。之后,你可以按照你的意愿随时给黑板框更换黑板。顺便说一句,由于设备DC所关联的是真实的设备黑板,因此对一个设备DC进行安装黑板(把一个Bitmap送入SelectObject)的操作是无效的。
装好黑板之后,就可以在黑板上画图了。如果装进黑板框的是“NULL 黑板”,那么你的一切绘图操作也都会成功,但没有任何效果(想象一下拿着粉笔在空气里画图。。。)。当你画了一些图形之后,你可以把另一块黑板换上去,再去画另一些图形。当然,黑板被换下来之后,其内容不会发生任何变化。如果你愿意的话,你可以生成N块黑板,不断地换进同一个黑板框,画上各种不同的图形,然后再换下来。
最后,如果你已经画完了,你可以通过DeleteDC销毁那个内存DC(黑板框)。尽管销毁黑板框的操作并不会损坏当前安装在其中的黑板,但仍然建议在销毁DC之前,用最初换下来的那块“NULL 黑板”把你自己的黑板换下来。至于你自己的黑板,你可以在你不需要它的时候,用DeleteObject来销毁。不过要注意,不要试图在这块黑板还装在某个黑板框里的时候去销毁它。
剩下的问题就很简单了。什么叫双缓冲呢?
1、做个内存里的黑板框。
2、做个黑板装进去。
3、在黑板上面画图。
4、把画好的图贴到真实的设备黑板上。
5、把新做的黑板换下来销毁。
6、把黑板框销毁。
这个流程可以很容易地改成:
1、预先画好固定的图形:
1.1、做个内存里的黑板框。
1.2、做个黑板装进去。
1.3、在黑板上面画图。
1.4、把新做的黑板换下来,但不要销毁(如果你自己做的黑板你都没有弄个变量存起来,那我就无话可说了)。
1.5、把黑板框销毁。
2、当需要往屏幕上画的时候(例如响应WM_PAINT消息):
2.1、做个内存里的黑板框。
2.2、把你上次存起来的黑板装进去。
2.3、把黑板上的内存贴到真实的设备黑板上。
2.4、把黑板换下来。
2.5、把黑板框销毁。
3、作为一个良好习惯,当你的程序退出时,记得把你存起来的黑板销毁。
如果你愿意的话,上述流程还可以进一步变化,例如你把好几种不同固定图形预先画在几块黑板上,按需要选用,或者你同时制作两个黑板框,把一块新做的黑板装进黑板框1,然后把预先做好的黑板1至黑板N轮流装进黑板框2,并往黑板框1中的新黑板上贴,最后再把最终做好的新黑板中的内容贴到真实的设备黑板上,诸如此类。
另一类DC是内存DC,它没有跟任何设备向关联,仅仅是为了画图方便,而用它来在内存里模拟真实的设备。由于它没有对应任何真实的设备,因此它没有什么固定的属性。为了保证能模拟某个特定设备,内存DC在生成的时候必须指定它模拟哪个设备,因此它必须用CreateCompatibleDC来生成,其参数就是待模拟的设备DC。由于内存DC没有任何固定属性,因此将一个内存DC作为参数送入CreateCompatibleDC来生成另一个内存DC是不行的。
生成了内存DC之后,我们实际上仅仅拥有了一个黑板框。与设备DC不同,作为真实设备的“黑板”总是存在的,但内存DC的黑板则不然,它必须靠我们专门地在内存里制作一个出来才行。能够作为内存DC的黑板的东西就是Bitmap(你所谓的CBitmap仅仅是MFC对HBITMAP的封装,因此下面只谈HBITMAP)。由于没有了设备的物理限制,这个黑板你愿意做多大都行。为了能够更好地模拟真实的设备,这块黑板的生成,最好使用CreateCompatibleBitmap,并将需要模拟的设备DC传入其中。同样,不应该把一个内存DC作为参数送入CreateCompatibleBitmap,否则你会得到某些意料之外的结果。
生成了黑板之后,还需要把黑板“安装”进黑板框,才能进行画图。“安装”的方法就是使用SelectObject,把你生成的黑板放进你的内存DC。SelectObject返回的结果是从这个DC里被换下来的黑板。第一次安装黑板的时候,被换下来的是一块“NULL 黑板”。之后,你可以按照你的意愿随时给黑板框更换黑板。顺便说一句,由于设备DC所关联的是真实的设备黑板,因此对一个设备DC进行安装黑板(把一个Bitmap送入SelectObject)的操作是无效的。
装好黑板之后,就可以在黑板上画图了。如果装进黑板框的是“NULL 黑板”,那么你的一切绘图操作也都会成功,但没有任何效果(想象一下拿着粉笔在空气里画图。。。)。当你画了一些图形之后,你可以把另一块黑板换上去,再去画另一些图形。当然,黑板被换下来之后,其内容不会发生任何变化。如果你愿意的话,你可以生成N块黑板,不断地换进同一个黑板框,画上各种不同的图形,然后再换下来。
最后,如果你已经画完了,你可以通过DeleteDC销毁那个内存DC(黑板框)。尽管销毁黑板框的操作并不会损坏当前安装在其中的黑板,但仍然建议在销毁DC之前,用最初换下来的那块“NULL 黑板”把你自己的黑板换下来。至于你自己的黑板,你可以在你不需要它的时候,用DeleteObject来销毁。不过要注意,不要试图在这块黑板还装在某个黑板框里的时候去销毁它。
剩下的问题就很简单了。什么叫双缓冲呢?
1、做个内存里的黑板框。
2、做个黑板装进去。
3、在黑板上面画图。
4、把画好的图贴到真实的设备黑板上。
5、把新做的黑板换下来销毁。
6、把黑板框销毁。
这个流程可以很容易地改成:
1、预先画好固定的图形:
1.1、做个内存里的黑板框。
1.2、做个黑板装进去。
1.3、在黑板上面画图。
1.4、把新做的黑板换下来,但不要销毁(如果你自己做的黑板你都没有弄个变量存起来,那我就无话可说了)。
1.5、把黑板框销毁。
2、当需要往屏幕上画的时候(例如响应WM_PAINT消息):
2.1、做个内存里的黑板框。
2.2、把你上次存起来的黑板装进去。
2.3、把黑板上的内存贴到真实的设备黑板上。
2.4、把黑板换下来。
2.5、把黑板框销毁。
3、作为一个良好习惯,当你的程序退出时,记得把你存起来的黑板销毁。
如果你愿意的话,上述流程还可以进一步变化,例如你把好几种不同固定图形预先画在几块黑板上,按需要选用,或者你同时制作两个黑板框,把一块新做的黑板装进黑板框1,然后把预先做好的黑板1至黑板N轮流装进黑板框2,并往黑板框1中的新黑板上贴,最后再把最终做好的新黑板中的内容贴到真实的设备黑板上,诸如此类。