这几天的心情不好,在猜测研究windows界面系统工作机理的时候总是会发现自己知识上这样那样的不足。有时候思路挺清楚的,可敲了半天就是写不出合适的代码来。这时才恍然大悟,我所缺少的不是游戏的理论,而是对语法本身的认知度啊。无奈,基本语法书都落在了学校里。。。

吃过午饭,截了几张图,总算是把模拟篇的实例修补出来了。此文也许只能算是这个程序的导读,所以赶快下下源代码来编译一下吧。http://dl2.csdn.net/down4/20070801/01172507614.rar

效果是不是像个记事本,就是不能移动,哈哈。问号可以打开关于对话框,叉叉可以退出程序。全是用图片实现的,UI系统中最基本的三种显示方式是几何图形、图片、文字,当然是我选择的图片方式最为简单,但用图片的缺点就是变化少,适用于不太需要复杂UI界面的游戏。

在开始前,我认为有必要复习一下windows创建窗口应用程序的过程。首先要定义一个窗口类,然后注册这个窗口类,接着就可以用CreateWindow()创建窗口了。其中最重要的两个值是窗口类的样式和CreateWindow()中的窗口样式参数,它们直接决定了创建的窗口的外观。

这个实例的目的只是简单的模仿windows的界面系统,很多地方都简化掉了。简化的有窗口类、窗口样式的类型、窗口的操作等等。

我想windows应该是基于C和汇编的,而不是像java那样写程序就要创建各式各样的对象,所以我使用结构体链表存储了整个UI系统的关系。

struct JWnd{
 int xPos;
 int yPos;
 int Width;
 int Height;
 JWnd *Parent;
 JWnd *ChildList;
 JWnd *Next;
 unsigned long Style; // 这是简化的样式,把窗口类都省了,1、一个矩形的窗口用图片填充 2、一个图片按钮 3、静态文本
 unsigned long ID;  // 留着传消息用呢!
 char *text;
 LP_BITMAPX picture; // 所有情况的图片都在这里了
// unsigned short TextColor;
 PIXEL TextColor;
// unsigned short BGColor;
 PIXEL BGColor;
 bool Visible;
};
这里我使用了指针代表一个窗口,而windows中使用的是句柄,我没有去研究句柄到底包含了哪些信息,功能肯定更多,既然是简化模拟我用指针代替也说得过去。

对应CreateWindow()函数我写了JCreateWindow()来向UI系统添加窗口,使用方法类似。函数内部代码也比较简单,主要是对链表的操作和窗口属性的设置,返回只是指向新生成的窗口的指针,windows返回的是个句柄,很像吧。

使用JSendMessage()向UI系统传消息,对鼠标事件的响应也是在这里处理的。因为是简化的,所以代码不多,一个是修改全局的鼠标坐标变量的值,一个是用PostMessage发送消息,鼠标点击的响应就是靠它向消息队列里发送消息呢,为了简化这里用的是windows的消息队列。

使用JShow()画图像。
因为窗口中存放的是自己与父窗口的相对坐标,所以在出现窗口的多层嵌套的时候就需要把相对坐标转化绝对坐标,或者牺牲空间多存储一个绝对坐标。我不建议使用后者,除了空间的因素外,创建时的计算量也加大了。至于如何进行坐标的转化,我在JShow中使用的是递归的方法。

仔细的看过我的代码,你不难发现,我没有回收内存。是的,由于时间的原因,我省略了那部分代码。

这个例子是为了给那些对上一篇文章不太明白的朋友一个形象的说明,功能和代码都不十分完善,下一次我将使用C++的方法重写这个程序。如果你有兴趣,可以试着用MFC的方法对上面的函数进行封装。提示:MFC基本没有涉及到图形绘制的问题,MFC在内部就是调用SDK的函数完成诸如创建各种窗口的工作的。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐