通过显示窗口过程来分析一下DC
要将内容显示在屏幕上,1、方法bios中断,2、写端口,3、写内存,其他(暂时不知道)
本次采用的写内存方法,
显卡有一个内存,只要将要显示的内容写入内存即可显示在屏幕上,
显示窗口,即将窗口对应的内容写入显卡内存,因此窗口需要指向一个地址,该地址可以是内存也可以是显存。如果直接用显存好处是节省内存,减少复制时间的花费,缺点是容易产生闪烁;如果选用一块内存作缓冲,可以减少工作量,特别是窗口切换和移动时的工作量。显卡的内存是否可以给窗口单独使用,修改的时候不显示,待修改完后让显卡一次性显示,暂时还没找到方法。这好象是openGL 的内容。也是AGP和VGA的区别(猜的)
还有一个疑问,窗口vram的地址是放在用户空间还是系统空间。放在系统内存好处是系统刷新窗口不用切换进程,坏处是系统空间只有2G,窗口多了是否够用,是放堆内,还是另外申请空间,还有建立DC时需切换至内核态;放在用户空间则释放的时候可以省略时间,一个进程本身窗口不会太多。
几个注意的地方
1、 只有顶级窗口DC有内存,其他的子窗口与顶级窗口共享内存块,
2、起点(x0,y0),窗口与DC的不同,顶级窗口起点为屏幕窗口的相对位置,子窗口为顶级窗口的相对位置,如果是孙子窗口,则需考虑父窗口的位置。
3、窗口内存与DC内存指向同一块地址,除部分操作(移动,)其他窗口大部分操作都是通过DC操作,
4、DC是与窗口同时建立还是在调用GetDC、GetWindowDC时建立。从这两个api及eleaseDC字面上理解,窗口建立时DC就是存在的,但个人觉得还是调用上述API建立好一点。这样ReleaseDC就是删除DC,但DeleteDC对应的是CreateDCA 与前面的删除不用的是 内存块是否释放的区别。