2024年4月22日发(作者:初沛凝)
最近在学习minigui,将一些分析的结果贴出来供大家参考,同时欢迎大家的指正。 图形编
程中,窗口是一个重要的概念,窗口其实是一个矩形框,应用程序可以使用其从而达到输出
结果和接受用户输入的效果。窗口系统(window system)界于操作系统层次之上,它是一个软
件系统,负责把显示屏幕分隔为不同的部分来帮助用户管理和控制不同的显示环境,它提供
基于窗口的工作模式。在linux上面,x就是一个典型的窗口系统吧。
在minigui中有三种窗口类型:主窗口,对话框和控件窗口。主窗口作为应用程序的主
界面或开始界面。子窗口通常是控件窗口,也可以是自定义窗口类,这里的控件窗口说白了
就是一些窗口上面的控件,比如按钮,编辑框等。对话框其实就是主窗口,只不过一般为了
完成特殊用途,所以在此加以区分。
下面我们一起来看看这三种窗口类型的创建吧。首先看createmainwindow函数,它创建
一个主窗口:由于代码比较长,这里就不全部贴出了,主要是说说关键的部分。
createmainwindow函数通过接受pmainwincreate类型的参数而创建一个窗口,并返回
其句柄。关于pmainwincreate结构的具体成员变量,大家可以去查看源码。下面主要对函数
内部做个简单介绍。
1. 声明一个pmainwin类型,并分配空间,该变量用来存放创建的主窗口的信息
2. 说下面的代码之前,先说说托管(hosting)窗口和被托管(hosted)窗口吧。我们知道
minigui内部实现了消息机制,即当有键盘输入事件发生时,就往消息队列中发送键盘
消息,而一般是主窗口会不停的从消息队列中取出消息来处理,或者自己响应,或者忽略,
或者派发给其他的窗口。那么这里就有一个问题,消息队列是每个主窗口都有一个呢,还是
所有的主窗口都使用同一个消息队列?在minigui中有个特殊的主窗口hwnd_desktop,它是
所有窗口的父窗口,直观的说就是整个桌面的窗口。当一个主窗口在创建的时候,可以指定
新建一个消息队列,也可以使用别的主窗口的消息队列,如果是后者,假设主窗口a在创建
时指定使用主窗口b的消息队列,那么a就被称为被托管窗口,而b则被称为托管窗口。所
以很明显ng就是用来指明托管窗口的。来看下面的代码,这里对minigui
的两种运行模式进行了区分,1-26行是minigui-threads模式,在这种模式下,如果托管窗
口为hwnd_desktop,则判断当前线程是否已经有了消息队列,如果没有则掉initthreadinfo
来新建一个消息队列,否则使用已经有的消息队列;如果托管窗口不为hwnd_desktop,则返
回hhosting所在的主窗口的消息队列。这就保证了同一个线程的所有窗口使用同一个消息队
列。27-31行是非minigui-threads模式
下,新的主窗口使用hwnd_desktop的消息队列,托管主窗口如果为空则使用
hwnd_desktop,否则设置为phosting所在的主窗口。
3. 下面的几行是对pwin进行初始化的操作,第1行赋值消息处理回调函数。第9行,
初始化pzordernode成员
4. 初始化结束之后,就开始发送消息通知自身来真正的绘制窗口了。1-4行发送本窗口
的msg_sizechanging和msg_changesize消息,会调用本窗口消息回调函数中的相应处
理部分。第6行是发送msg_addnewmainwin消息给hwnd_desktop窗口,hwnd_desktop窗口
主要负责初始化clip区和invalid区,并且把当前窗口添加到sg_mainwinzorder链表里,
这个链表记录的是所有窗口的叠加顺序,在显示和隐藏窗口的时候,叠加顺序很重要,它会
决定屏幕上哪些窗口会受影响而需要重绘。第9行发送msg_create消息给窗口,窗口接受到
此消息一般进行子窗口的初始化和创建,如果创建失败了,则通知hwnd_desktop窗口销毁该
主窗口。
接下来我们看对话框的创建过程,对话框分为模态和非模态对话框。非模态对话框的创
建过程和主窗口的创建过程差不多,其中也调用了createmainwindow函数,之后还调用了
createwindowex创建对话框上的控件。模态对话框就是显示之后,用户不能再切换到其他主
窗口进行工作的对话框,而只能在关闭之后,才能使用其他的主窗口,通过
dialogboxindirectparam创建,一开始的步骤与非模态对话框类似,以下的代码是其不同的
部分:第7行,howner是待创建对话框的托管主窗口,这里其实是把它disable掉了。第11
行是处理msg_initdialog消息。第18-21行,是消息处理的循环机制,这里可以看到这就是
为什么模态对话框一定要等到关闭之后,才可以使用其它的主窗口,这里还需要注意一点,
由于是从对话框的托管主窗口是hwnd_desktop窗口,因此他们共用一个消息队列,此时,对
话框可能接受到发送给托管主窗口的消息,而由于在第7行中已经将托管主窗口的dwstyle
设置为ws_disable了,因此在这些消息处理流程里面可以做相应的处理(例如当窗口被设置
为ws_disable时,忽略该消息)。25-28行,当窗口关闭时,进行的收尾工作。第31行enable
托管主窗口。第23行判断了当前对话框是否是激活窗口,如果是的话,当它关闭时,它的托
管主窗口应该被激活(34-35l)。
篇二:minigui开发中遇到的问题及解决方法
minigui开发中遇到的问题及解决方法
minigui是基于消息机制的开发工具,由于不具备可视化性,这就要求开发人员熟悉其
控件及消息机制。首先要阅读其中的开发文档如:
(了解其配置、编译及安装方法);
(了解控件及其用途);
(具体控件属性、消息等);
另外,给出了控件的示例,可以编译学习,示例程序一般在mg-samples-2.0.4文件夹中。
在开发中遇到了一些问题,折腾了半天最后才发现是minigui的问题。程序员开发时大
多数是边做边学的,遇到问题再查找解决方法,这样印象更深刻。下面把经常遇到,甚至是
低级幼稚的问题总结一下,做个记录。
1、不想修改的编辑框仍可以输入或输入的一个字符却显示两个等;
大多数可编辑的控件都有readonly属性(不同控件前缀可能不同),该属性决定编辑框
为只读属性,用户不能修改编辑框中的内容,但插入符可见,因此,如果不想让编辑框可编
辑,加上此属性就ok了。
2、编辑框上不该有光标闪烁时,却总是会闪烁;
minigui有自己的消息循环机制,常用的如msg_paint,用于屏幕输出。一般有以下情况
时系统会收到msg_paint消息:
① 用户移动窗口或显示窗口时;
② 用invalidaterect更新窗口的无效区域;
③ 调用updatewindow重绘窗口;
④ 覆盖程序窗口的对话框或消息框被消除;
⑤ 下拉或弹出菜单被消除;
出现闪烁光标就要检查程序中是否有以上情况发生;
3、如何修改控件的背景颜色;
minigui各控件的背景颜色是已经在的windowelementcolors段设置好的。
每个控件都会有以register开头的函数,根据该函数中or对应的颜色序号
在中查找进行修改即可。但这种更改是全局性的,如果只是临时更改可用
setwindowbkcolor和setwindowelementcolorex来设置背景色和前景色。
4、listview创建及但不显示问题;
由于listview是minigui的扩展功能,这样在配置时要把ext lib中的listview control
选中,具体:
① 在libminigui-2.0.4-linux下执行make menuconfig,选中ext library options
2024年4月22日发(作者:初沛凝)
最近在学习minigui,将一些分析的结果贴出来供大家参考,同时欢迎大家的指正。 图形编
程中,窗口是一个重要的概念,窗口其实是一个矩形框,应用程序可以使用其从而达到输出
结果和接受用户输入的效果。窗口系统(window system)界于操作系统层次之上,它是一个软
件系统,负责把显示屏幕分隔为不同的部分来帮助用户管理和控制不同的显示环境,它提供
基于窗口的工作模式。在linux上面,x就是一个典型的窗口系统吧。
在minigui中有三种窗口类型:主窗口,对话框和控件窗口。主窗口作为应用程序的主
界面或开始界面。子窗口通常是控件窗口,也可以是自定义窗口类,这里的控件窗口说白了
就是一些窗口上面的控件,比如按钮,编辑框等。对话框其实就是主窗口,只不过一般为了
完成特殊用途,所以在此加以区分。
下面我们一起来看看这三种窗口类型的创建吧。首先看createmainwindow函数,它创建
一个主窗口:由于代码比较长,这里就不全部贴出了,主要是说说关键的部分。
createmainwindow函数通过接受pmainwincreate类型的参数而创建一个窗口,并返回
其句柄。关于pmainwincreate结构的具体成员变量,大家可以去查看源码。下面主要对函数
内部做个简单介绍。
1. 声明一个pmainwin类型,并分配空间,该变量用来存放创建的主窗口的信息
2. 说下面的代码之前,先说说托管(hosting)窗口和被托管(hosted)窗口吧。我们知道
minigui内部实现了消息机制,即当有键盘输入事件发生时,就往消息队列中发送键盘
消息,而一般是主窗口会不停的从消息队列中取出消息来处理,或者自己响应,或者忽略,
或者派发给其他的窗口。那么这里就有一个问题,消息队列是每个主窗口都有一个呢,还是
所有的主窗口都使用同一个消息队列?在minigui中有个特殊的主窗口hwnd_desktop,它是
所有窗口的父窗口,直观的说就是整个桌面的窗口。当一个主窗口在创建的时候,可以指定
新建一个消息队列,也可以使用别的主窗口的消息队列,如果是后者,假设主窗口a在创建
时指定使用主窗口b的消息队列,那么a就被称为被托管窗口,而b则被称为托管窗口。所
以很明显ng就是用来指明托管窗口的。来看下面的代码,这里对minigui
的两种运行模式进行了区分,1-26行是minigui-threads模式,在这种模式下,如果托管窗
口为hwnd_desktop,则判断当前线程是否已经有了消息队列,如果没有则掉initthreadinfo
来新建一个消息队列,否则使用已经有的消息队列;如果托管窗口不为hwnd_desktop,则返
回hhosting所在的主窗口的消息队列。这就保证了同一个线程的所有窗口使用同一个消息队
列。27-31行是非minigui-threads模式
下,新的主窗口使用hwnd_desktop的消息队列,托管主窗口如果为空则使用
hwnd_desktop,否则设置为phosting所在的主窗口。
3. 下面的几行是对pwin进行初始化的操作,第1行赋值消息处理回调函数。第9行,
初始化pzordernode成员
4. 初始化结束之后,就开始发送消息通知自身来真正的绘制窗口了。1-4行发送本窗口
的msg_sizechanging和msg_changesize消息,会调用本窗口消息回调函数中的相应处
理部分。第6行是发送msg_addnewmainwin消息给hwnd_desktop窗口,hwnd_desktop窗口
主要负责初始化clip区和invalid区,并且把当前窗口添加到sg_mainwinzorder链表里,
这个链表记录的是所有窗口的叠加顺序,在显示和隐藏窗口的时候,叠加顺序很重要,它会
决定屏幕上哪些窗口会受影响而需要重绘。第9行发送msg_create消息给窗口,窗口接受到
此消息一般进行子窗口的初始化和创建,如果创建失败了,则通知hwnd_desktop窗口销毁该
主窗口。
接下来我们看对话框的创建过程,对话框分为模态和非模态对话框。非模态对话框的创
建过程和主窗口的创建过程差不多,其中也调用了createmainwindow函数,之后还调用了
createwindowex创建对话框上的控件。模态对话框就是显示之后,用户不能再切换到其他主
窗口进行工作的对话框,而只能在关闭之后,才能使用其他的主窗口,通过
dialogboxindirectparam创建,一开始的步骤与非模态对话框类似,以下的代码是其不同的
部分:第7行,howner是待创建对话框的托管主窗口,这里其实是把它disable掉了。第11
行是处理msg_initdialog消息。第18-21行,是消息处理的循环机制,这里可以看到这就是
为什么模态对话框一定要等到关闭之后,才可以使用其它的主窗口,这里还需要注意一点,
由于是从对话框的托管主窗口是hwnd_desktop窗口,因此他们共用一个消息队列,此时,对
话框可能接受到发送给托管主窗口的消息,而由于在第7行中已经将托管主窗口的dwstyle
设置为ws_disable了,因此在这些消息处理流程里面可以做相应的处理(例如当窗口被设置
为ws_disable时,忽略该消息)。25-28行,当窗口关闭时,进行的收尾工作。第31行enable
托管主窗口。第23行判断了当前对话框是否是激活窗口,如果是的话,当它关闭时,它的托
管主窗口应该被激活(34-35l)。
篇二:minigui开发中遇到的问题及解决方法
minigui开发中遇到的问题及解决方法
minigui是基于消息机制的开发工具,由于不具备可视化性,这就要求开发人员熟悉其
控件及消息机制。首先要阅读其中的开发文档如:
(了解其配置、编译及安装方法);
(了解控件及其用途);
(具体控件属性、消息等);
另外,给出了控件的示例,可以编译学习,示例程序一般在mg-samples-2.0.4文件夹中。
在开发中遇到了一些问题,折腾了半天最后才发现是minigui的问题。程序员开发时大
多数是边做边学的,遇到问题再查找解决方法,这样印象更深刻。下面把经常遇到,甚至是
低级幼稚的问题总结一下,做个记录。
1、不想修改的编辑框仍可以输入或输入的一个字符却显示两个等;
大多数可编辑的控件都有readonly属性(不同控件前缀可能不同),该属性决定编辑框
为只读属性,用户不能修改编辑框中的内容,但插入符可见,因此,如果不想让编辑框可编
辑,加上此属性就ok了。
2、编辑框上不该有光标闪烁时,却总是会闪烁;
minigui有自己的消息循环机制,常用的如msg_paint,用于屏幕输出。一般有以下情况
时系统会收到msg_paint消息:
① 用户移动窗口或显示窗口时;
② 用invalidaterect更新窗口的无效区域;
③ 调用updatewindow重绘窗口;
④ 覆盖程序窗口的对话框或消息框被消除;
⑤ 下拉或弹出菜单被消除;
出现闪烁光标就要检查程序中是否有以上情况发生;
3、如何修改控件的背景颜色;
minigui各控件的背景颜色是已经在的windowelementcolors段设置好的。
每个控件都会有以register开头的函数,根据该函数中or对应的颜色序号
在中查找进行修改即可。但这种更改是全局性的,如果只是临时更改可用
setwindowbkcolor和setwindowelementcolorex来设置背景色和前景色。
4、listview创建及但不显示问题;
由于listview是minigui的扩展功能,这样在配置时要把ext lib中的listview control
选中,具体:
① 在libminigui-2.0.4-linux下执行make menuconfig,选中ext library options