|
上面,X中有三种窗口类型:主窗口,对话框和控件窗口。主窗口作为应用程序的主界面或开始界面。子窗口通常是控件窗口,也可以是自定义窗口类,这里的控件窗口说白了就是一些窗口上面的控件,比如按钮,编辑框等。对话框其实就是主窗口,只不过一般为了完成特殊用途,所以在此加以区分。
函数通过接受PMAINWINCREATE1.类型,并分配空间,该变量用来存放创建的主窗口的信息
说下面的代码之前,先说说托管(Hosting)内部实现了消息机制,即当有键盘输入事件发生时,就往消息队列中发送键盘消息,而一般是主窗口会不停的从消息队列中取出消息来处理,或者自己响应,或者忽略,或者派发给其他的窗口。那么这里就有一个问题,消息队列是每个主窗口都有一个呢,还是所有的主窗口都使用同一个消息队列?在MiniGui在创建时指定使用主窗口B则被称为托管窗口。所以很明显CreateInfo.hHosting行是MiniGUI-Threads行)所在的主窗口的消息队列。16的消息队列,这里其实忽略了pHosting 行赋值消息处理回调函数。第94.行发送本窗口的MSG_SIZECHANGING行是发送MSG_ADDNEWMAINWIN窗口主要负责初始化Clip链表里,这个链表记录的是所有窗口的叠加顺序,在显示和隐藏窗口的时候,叠加顺序很重要,它会决定屏幕上哪些窗口会受影响而需要重绘。第9窗口销毁该主窗口。
1: SendMessage ((HWND)pWin, MSG_SIZECHANGING,
2: (WPARAM)&pCreateInfo->lx, (LPARAM)&pWin->left);
3: SendMessage ((HWND)pWin, MSG_CHANGESIZE,
4: (WPARAM)&pWin->left, 0);
5:
6: SendMessage (HWND_DESKTOP, MSG_ADDNEWMAINWIN,
7: (WPARAM) pWin, (LPARAM) pWin->pZOrderNode);
8:
9: if (SendMessage ((HWND)pWin, MSG_CREATE, 0, (LPARAM)pCreateInfo)) {
10: SendMessage(HWND_DESKTOP,
11: MSG_REMOVEMAINWIN, (WPARAM)pWin, 0);
12: goto err;
13: }
|
创建对话框上的控件。模态对话框就是显示之后,用户不能再切换到其他主窗口进行工作的对话框,而只能在关闭之后,才能使用其他的主窗口,通过DialogBoxIndirectParam是待创建对话框的托管主窗口,这里其实是把它disable消息。第18-21行中已经将托管主窗口的dwStyle例如当窗口被设置为WS_DISABLE行,当窗口关闭时,进行的收尾工作。第31行判断了当前对话框是否是激活窗口,如果是的话,当它关闭时,它的托管主窗口应该被激活(34-35L)最后说一下子窗口(中通过调用CreateWindow函数的宏)行获取控件的主窗口。第4设置完控件的属性之后,向HWND_DESKTOP接受到之后,会调用dskOnNewCtrlInstance。第16-18 |
|
|