桌面管理类及窗口、控件类

来源:互联网 发布:iphone怎么切换数据 编辑:程序博客网 时间:2024/06/05 17:03

桌面管理类负责窗口的显示,传递窗口消息,管理皮肤资源等作用。
大致架构如下:

class CDesktop
{
    AddWindow(CGameWin *win);    // win是新增窗口的指针, 插入链表头
    Render(IDirectDrawSurface TargetSurface);    //TargetSurface为渲染目标
    LoadSkin(LPCTSTR szSkin);    //szSkin为皮肤存放的目录,自动打开为: ./skin/(szSkin)/*.*
    ……
}

AddWindow函数将win的指针存放到类中的一个链表里面.
链表维持的是窗口的指针地址,链表的排列顺序代表窗口的Z轴循序。
越是靠前,代表窗口越处于顶层。在Render方法中,向目标Surface渲染所有窗口。渲染顺序从链表尾开始。命令消息传递顺序从链头开始。

鼠标消息传递至窗口,窗口本身再按相同原理搜索窗口上的控件,如果不在当前窗口则继续下一个窗口的搜索。如果找到控件,则返回控件指针,存于Desktop类的私有变量,代表当前焦点所在控件。

CWin及CControl均从CObject派生,CObject有一方法GetType返回当前类的类型字符串。
CWin,CButton,CMenu等重载该函数,分别返回“Window”“Button”“Menu”等字符串。

按键消息可以根据当前焦点控件的类型,强制转换,然后进行响应操作。
例如CEdit控件为文本框,可以用ExecKey(假设)命令响应按键命令。
假如目标为CButton控件,Enter键可以直接调用Click()过程。

还要注意Enabled等属性,具体参考VB相对控件属性。
还有要防止狂按Enter导致连续点击这样的错误发生。

年初一 凌晨 4:20am,到此为止。睡觉……