学习MiniGui之窗口创建篇.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
学习MiniGui之窗口创建篇

最近在学习MiniGui,将一些分析的结果贴出来供大家参考,同时欢迎大家的指正。 图形编程中,窗口是一个重要的概念,窗口其实是一个矩形框,应用程序可以使用其从而达到输出结果和接受用户输入的效果。窗口系统(Window System)界于操作系统层次之上,它是一个软件系统,负责把显示屏幕分隔为不同的部分来帮助用户管理和控制不同的显示环境,它提供基于窗口的工作模式。在Linux上面,X就是一个典型的窗口系统吧。 在MiniGui中有三种窗口类型:主窗口,对话框和控件窗口。主窗口作为应用程序的主界面或开始界面。子窗口通常是控件窗口,也可以是自定义窗口类,这里的控件窗口说白了就是一些窗口上面的控件,比如按钮,编辑框等。对话框其实就是主窗口,只不过一般为了完成特殊用途,所以在此加以区分。 下面我们一起来看看这三种窗口类型的创建吧。首先看CreateMainWindow函数,它创建一个主窗口:由于代码比较长,这里就不全部贴出了,主要是说说关键的部分。 CreateMainWindow函数通过接受PMAINWINCREATE类型的参数而创建一个窗口,并返回其句柄。关于PMAINWINCREATE结构的具体成员变量,大家可以去查看源码。下面主要对函数内部做个简单介绍。 声明一个PMAINWIN类型,并分配空间,该变量用来存放创建的主窗口的信息 说下面的代码之前,先说说托管(Hosting)窗口和被托管(Hosted)窗口吧。我们知道MiniGui内部实现了消息机制,即当有键盘输入事件发生时,就往消息队列中发送键盘消息,而一般是主窗口会不停的从消息队列中取出消息来处理,或者自己响应,或者忽略,或者派发给其他的窗口。那么这里就有一个问题,消息队列是每个主窗口都有一个呢,还是所有的主窗口都使用同一个消息队列?在MiniGui中有个特殊的主窗口HWND_DESKTOP,它是所有窗口的父窗口,直观的说就是整个桌面的窗口。当一个主窗口在创建的时候,可以指定新建一个消息队列,也可以使用别的主窗口的消息队列,如果是后者,假设主窗口A在创建时指定使用主窗口B的消息队列,那么A就被称为被托管窗口,而B则被称为托管窗口。所以很明显CreateInfo.hHosting就是用来指明托管窗口的。来看下面的代码,这里对MiniGUI的两种运行模式进行了区分,1-26行是MiniGUI-Threads模式,在这种模式下,如果托管窗口为HWND_DESKTOP,则判断当前线程是否已经有了消息队列,如果没有则掉InitThreadInfo来新建一个消息队列,否则使用已经有的消息队列;如果托管窗口不为HWND_DESKTOP,则返回hHosting所在的主窗口的消息队列。这就保证了同一个线程的所有窗口使用同一个消息队列。27-31行是非MiniGUI-Threads模式下,新的主窗口使用HWND_DESKTOP的消息队列,托管主窗口如果为空则使用HWND_DESKTOP,否则设置为pHosting所在的主窗口。 1: #ifndef _LITE_VERSION 2: if (pCreateInfo-hHosting == HWND_DESKTOP || 3: pCreateInfo-hHosting == 0) { 4: if ( (thi = GetThreadInfo (pthread_self())) == NULL) { 5: if ( !(thi = InitThreadInfo()) ) { 6: free(pWin); 7: return HWND_INVALID; 8: } 9: thi-pMainWin = pWin; 10: } 11: else { 12: pWin-pHosting = thi-pMainWin; 13: } 14: pWin-pMessages = thi-pMsgQueue; 15: pWin-thinfo = thi; 16: } 17: else { 18: pWin-pMessages = GetMsgQueue (pCreateInfo-hHosting); 19: if (pWin-pMessages == NULL) { 20: free (pWin); 21: return HWND_INVALID; 22: } 23: if (pWin-pHosting == NULL) 24

文档评论(0)

wh90404 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档