晚上睡不着练习打字,打打心中所思考的

来源:互联网 发布:nginx redis lua缓存 编辑:程序博客网 时间:2024/06/11 17:03
2015-8-22 02:37
正值大三暑假,可能我已经知道自己能保研了,而舍友打算考研,每天在一间实验室里吹空调,我也就一起蹭空调了,主要是想学习实用的软件编写,参照吕鑫的MFC视频教程.当日感受如下:

快到了天黑才猛然意识到今天又荒废过去了,于是慌忙练习这几天看视频里的东西,主要乱的地方在双缓冲绘图机制和ontimer中的绘图循环,双缓冲绘图防止程序因加入多张图片而产生的闪烁问题,双缓冲就是将原来的几张图先后(代码操作的先后,肉眼识别不出)输出到屏幕的方法变为将这几张图先按顺序输入到内存中的虚拟屏幕上,等到虚拟屏幕接收画面完全后,将整个虚拟屏幕拷贝到真实屏幕中去,原理虽够通俗易懂,但是操作起来还真的挺费时间,调试了好多次,甚至有点怀疑函数用错了,上网上又看了看,没错啊,就这几个函数,先利用loadimage载入进程内或外的文件,可是这个函数返回的是一个通用句柄,要想将句柄中的资源载入到cdc对象中就必须想办法将这个句柄转化为一个cdc派生类对象,既然是图像,那就只能转化为cbitmap对象了,利用cbitmap类内函数attach接入那个句柄,这样就可以将图像资源利用selectobject选入cdc对象中去了,不过这之前cdc对象要先在栈里开一块内存,用来储存图像资源,如果此时就利用bitblt将所有需要的cdc对象一个一个拷贝到真实屏幕中去,那就跟双缓冲一毛关系都没了。
双缓存的方法是,这时再开辟块栈内存,用作虚拟屏幕,将所有的cdc类拷贝到虚拟屏幕中去,一样可以用bitblt,也可以用strechblt,一个意思,不过视频里讲这块虚拟屏幕内存最好在堆里开辟以长时间保留,可我觉得那样变量的封装性会有所降低,如果程序较大,那就要加一大堆全局变量在代码头部,看着都乱,用栈内存影响不大,好写一点,待所有画面层叠完成,将虚拟屏幕整个拷贝到真实屏幕,有一点,虚拟屏幕建造时只开辟内存是不够的还要放入一个cdc派生类对象在里面以保证它不是空的,若是空的虚拟屏幕将没有背景,将什么东西都放不上去,因为没地方粘呀(,因此,需要在开辟内存后马上利用selectobject放入点东西,最好是在内存中临时建一个cbitmap对象,利用cbitmap成员函数createcompiledbitmap创建与真实窗口等大的背景图,如果与窗口不等大,将来拷贝到真实屏幕上将有空缺,达不到原始效果,这样做完差不多就完啦,但是还没完!
一定要记住释放内存释放GDI,否则一个几十kb的小exe都能让你电脑憋死,这里只有CDC对象涉及,因此谨防GDI泄漏,方法是在拷贝到真实屏幕后依次释放cdc对象,cbitmap和cfont等这些CDC派生类的析构函数里有自动释放,可是CDC对象里好像没有,我只能说好像,慢慢调试推测的,我再查查,反正,一定要先释放虚拟屏幕对象和真实屏幕对应本进程的那块区域屏幕对象,用deleteDC,哈哈,这样就应该行了,加上ontimer,成啦
0 0
原创粉丝点击