经过在第一阶段的痛苦磨炼,我们总算是打下了比较坚固的基础,可以快速的开发各种常见的窗口程序,各种控件的应用比较熟练,也能利用消息机制完成各种需要的功能。但一个完整的窗口程序不仅仅是由一堆简单的控件堆砌而成,在很多场合下,控件的事件响应函数需要调用具体的、功能性的代码。打个比方,尽管你可以使用如CPicture这些MFC提供的控件为你的窗口添加一些图片,但老实说,你并不知道这个控件中到底是怎么添加图片的,我发现,大多数情况下我们都是在窗口的属性编辑器里添加自己需要的属性,很少自己手动的添加一些功能性的代码。这个阶段我们的程序的一个明显的特点就是没有属于自己的控件,我们从来不会用面向对象的方式来开发自己的控件。

因为这样,我们可以做的事情很少。例如,窗口程序中,最常见的就是添加各种图片元素,复杂一些的如flash,此外还有一些其他的多媒体元素,如让窗口播放视频,显示OpenGL等的3D实时渲染结果,自定义绘制各种图表等。如果不能做到这些,我觉得就算不上真正懂了界面开发的技术,因为提到的所有这些,都关系到界面开发中最重要的技术之一,那就是GDI。GDI是每一个窗口程序都不可或缺的技术和元素,没有它,你的窗口不免功能单调、有形无神。

我曾在这些问题前徘徊了很久,尽管有这样或那样的教程,但大多杂乱无章,而且网上的资料看多了你就会发现几乎所有的教程追根朔源都引自有限的几个版本,就是这几个版本,也只是机械的调用API,你拿来后经常会出错,往往是因为这些作者也没有弄透彻。

学到了这里,去理解GDI的技术,就是迫在眉睫的需要了,如果不突破GDI的封锁,3D渲染输出、图表绘制、游戏开发这些复杂功能我们永远也理解不了,我们也永远不会知道各种不同格式图片之间的区别,例如bmp图片是用的或运算,而png图片用的是与运算,尽管两种文件存储的都是像素数据,但png就可以不遮挡背景实现部分透明的显示,而bmp不可以。

我的突破源于一次阅读光线跟踪算法的代码,这次经历让我认识到自己欠缺的是什么,那是观念上的缺失而不是技术上的。以前我总是想,一个控件是怎么放入那些image的,又是怎么显示一帧一帧的视频的,此外还有2D和3D的渲染图像……而后来我突然意识到,不管有多少种多媒体元素,归根结底,在窗口中这些就是一个一个的像素而已,甚至连窗口也只是像素。没错,所有呈现的最后结果都是像素!这个观点就是认识GDI的基础,以这个为出发点来看的话,以前疑惑的问题就变得简单了,从此也不必再受限于别人提供的控件了,只要不嫌麻烦,一切都可以自己动手,读取图像数据、建立一个绘图区、设置绘图区像素格式、载入像素数据,一切OK了,几乎一切控件的实现大致就这么个过程,无论它看起来多么复杂。

说起来我对于像素的如此执著,应该源于对3D渲染技术和游戏开发的热情,在这个学习的过程中,很多脱离了具体代码和技术的认识方法的建立,让我们能有自己的视角来处理问题,这可以让很多问题简化。

与第一个阶段相比,我们的认识其实更深了一层,以前看到的窗口,在现在看来只是一堆像素的堆砌,所以只要我们会操作这小小的象素,就可以让我们的窗口去做更多更有趣的事情的事情了,比如游戏……只要你想得到!

界面程序开发的一些总结(三)

然后最痛苦的时候来了,尽管已经了解并掌握了几乎所有必需的知识,对于一个任务,我们能从功能上比较完美的实现,但这个时候,我们已经站上一个高度,追求完...

阅读全文

界面程序开发的一些总结(一)

一直纠结于究竟该用什么标题:总结其实说不上的,毕竟自己经验也不怎么丰富,充其量也就是一小结;换用感悟之类的也不大合适,这会让人以为我故作老成、经验...

阅读全文

2则回应给“界面程序开发的一些总结(二)”

  1. dynasty_ding说道:

    我的突破源于一次阅读光线跟踪算法的代码,这次经历让我认识到自己欠缺的是什么,那是观念上的缺失而不是技术上的。以前我总是想,一个控件是怎么放入那些image的,又是怎么显示一帧一帧的视频的,此外还有2D和3D的渲染图像……而后来我突然意识到,不管有多少种多媒体元素,归根结底,在窗口中这些就是一个一个的像素而已,甚至连窗口也只是像素。没错,所有呈现的最后结果都是像素!这个观点就是认识GDI的基础,以这个为出发点来看的话,以前疑惑的问题就变得简单了,从此也不必再受限于别人提供的控件了,只要不嫌麻烦,一切都可以自己动手,读取图像数据、建立一个绘图区、设置绘图区像素格式、载入像素数据,一切OK了,几乎一切控件的实现大致就这么个过程,无论它看起来多么复杂

    我一直这样写显示的,把文件内容一个字节一个字节的读出,然后一个象素一个象素的显示,自己计算,用各种算法实现,放大,缩小等各种效果,只是我不知道这个就是GDI,,,,面试很吃亏

    [回复]

    ian 回复:

    如果全部自己来操作的话是十分麻烦的,更悲剧的是,如果对windows渲染机制不太了解的话,用一个像素一个像素的显示的效率是非常低的,因为这会产生大量的中断。

    [回复]

发表评论