学习minigui之窗口创建篇

学习minigui之窗口创建篇

ID:10022996

大小:56.00 KB

页数:7页

时间:2018-05-21

学习minigui之窗口创建篇_第1页
学习minigui之窗口创建篇_第2页
学习minigui之窗口创建篇_第3页
学习minigui之窗口创建篇_第4页
学习minigui之窗口创建篇_第5页
资源描述:

《学习minigui之窗口创建篇》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、最近在学习MiniGui,将一些分析的结果贴出来供大家参考,同时欢迎大家的指正。图形编程中,窗口是一个重要的概念,窗口其实是一个矩形框,应用程序可以使用其从而达到输出结果和接受用户输入的效果。窗口系统(WindowSystem)界于操作系统层次之上,它是一个软件系统,负责把显示屏幕分隔为不同的部分来帮助用户管理和控制不同的显示环境,它提供基于窗口的工作模式。在Linux上面,X就是一个典型的窗口系统吧。在MiniGui中有三种窗口类型:主窗口,对话框和控件窗口。主窗口作为应用程序的主界面或开始界面。子窗口通常是控件窗

2、口,也可以是自定义窗口类,这里的控件窗口说白了就是一些窗口上面的控件,比如按钮,编辑框等。对话框其实就是主窗口,只不过一般为了完成特殊用途,所以在此加以区分。下面我们一起来看看这三种窗口类型的创建吧。首先看CreateMainWindow函数,它创建一个主窗口:由于代码比较长,这里就不全部贴出了,主要是说说关键的部分。CreateMainWindow函数通过接受PMAINWINCREATE类型的参数而创建一个窗口,并返回其句柄。关于PMAINWINCREATE结构的具体成员变量,大家可以去查看源码。下面主要对函数内部

3、做个简单介绍。1.声明一个PMAINWIN类型,并分配空间,该变量用来存放创建的主窗口的信息2.说下面的代码之前,先说说托管(Hosting)窗口和被托管(Hosted)窗口吧。我们知道MiniGui内部实现了消息机制,即当有键盘输入事件发生时,就往消息队列中发送键盘消息,而一般是主窗口会不停的从消息队列中取出消息来处理,或者自己响应,或者忽略,或者派发给其他的窗口。那么这里就有一个问题,消息队列是每个主窗口都有一个呢,还是所有的主窗口都使用同一个消息队列?在MiniGui中有个特殊的主窗口HWND_DESKTOP,

4、它是所有窗口的父窗口,直观的说就是整个桌面的窗口。当一个主窗口在创建的时候,可以指定新建一个消息队列,也可以使用别的主窗口的消息队列,如果是后者,假设主窗口A在创建时指定使用主窗口B的消息队列,那么A就被称为被托管窗口,而B则被称为托管窗口。所以很明显CreateInfo.hHosting就是用来指明托管窗口的。来看下面的代码,这里对MiniGUI的两种运行模式进行了区分,1-26行是MiniGUI-Threads模式,在这种模式下,如果托管窗口为HWND_DESKTOP,则判断当前线程是否已经有了消息队列,如果没有

5、则掉InitThreadInfo来新建一个消息队列,否则使用已经有的消息队列;如果托管窗口不为HWND_DESKTOP,则返回hHosting所在的主窗口的消息队列。这就保证了同一个线程的所有窗口使用同一个消息队列。27-31行是非MiniGUI-Threads模式下,新的主窗口使用HWND_DESKTOP的消息队列,托管主窗口如果为空则使用HWND_DESKTOP,否则设置为pHosting所在的主窗口。1:#ifndef_LITE_VERSION2:if(pCreateInfo->hHosting==HWND_D

6、ESKTOP

7、

8、3:pCreateInfo->hHosting==0){4:if((thi=GetThreadInfo(pthread_self()))==NULL){5:if(!(thi=InitThreadInfo())){6:free(pWin);7:returnHWND_INVALID;8:}9:thi->pMainWin=pWin;10:}11:else{12:pWin->pHosting=thi->pMainWin;13:}14:pWin->pMessages=thi->pMsgQueue;15:pWin

9、->thinfo=thi;16:}17:else{18:pWin->pMessages=GetMsgQueue(pCreateInfo->hHosting);19:if(pWin->pMessages==NULL){20:free(pWin);21:returnHWND_INVALID;22:}23:if(pWin->pHosting==NULL)24:pWin->pHosting=25:GetMainWindowPtrOfControl(pCreateInfo->hHosting);26:#else27:pWin-

10、>pHosting=28:GetMainWindowPtrOfControl(pCreateInfo->hHosting);29:if(pWin->pHosting==NULL)30:pWin->pHosting=__mg_dsk_win;31:pWin->pMessages=__mg_dsk_msgs;32:#endif1.下面的几行是对pW

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。