MINIGUI学习方法 下载本文

最近在学习minigui,将一些分析的结果贴出来供大家参考,同时欢迎大家的指正。 图形编程中,窗口是一个重要的概念,窗口其实是一个矩形框,应用程序可以使用其从而达到输出结果和接受用户输入的效果。窗口系统(window system)界于操作系统层次之上,它是一个软件系统,负责把显示屏幕分隔为不同的部分来帮助用户管理和控制不同的显示环境,它提供

基于窗口的工作模式。在linux上面,x就是一个典型的窗口系统吧。 在minigui中有三种窗口类型:主窗口,对话框和控件窗口。主窗口作为应用程序的主界面或开始界面。子窗口通常是控件窗口,也可以是自定义窗口类,这里的控件窗口说白了就是一些窗口上面的控件,比如按钮,编辑框等。对话框其实就是主窗口,只不过一般为了

完成特殊用途,所以在此加以区分。 下面我们一起来看看这三种窗口类型的创建吧。首先看createmainwindow函数,它创建

一个主窗口:由于代码比较长,这里就不全部贴出了,主要是说说关键的部分。 createmainwindow函数通过接受pmainwincreate类型的参数而创建一个窗口,并返回其句柄。关于pmainwincreate结构的具体成员变量,大家可以去查看源码。下面主要对函数内部做个简单介绍。

1. 声明一个pmainwin类型,并分配空间,该变量用来存放创建的主窗口的信息 2. 说下面的代码之前,先说说托管(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所在的主窗口。 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是基于消息机制的开发工具,由于不具备可视化性,这就要求开发人员熟悉其

控件及消息机制。首先要阅读其中的开发文档如: minigui-user-manual.pdf(了解其配置、编译及安装方法); miniguitechwhitepaper-2.0-4c.pdf(了解控件及其用途); minigui-prog-guide-v2.0-4c.pdf(具体控件属性、消息等); 另外,给出了控件的示例,可以编译学习,示例程序一般在mg-samples-2.0.4文件夹中。 在开发中遇到了一些问题,折腾了半天最后才发现是minigui的问题。程序员开发时大多数是边做边学的,遇到问题再查找解决方法,这样印象更深刻。下面把经常遇到,甚至是

低级幼稚的问题总结一下,做个记录。 1、不想修改的编辑框仍可以输入或输入的一个字符却显示两个等; 大多数可编辑的控件都有readonly属性(不同控件前缀可能不同),该属性决定编辑框为只读属性,用户不能修改编辑框中的内容,但插入符可见,因此,如果不想让编辑框可编

辑,加上此属性就ok了。

2、编辑框上不该有光标闪烁时,却总是会闪烁; minigui有自己的消息循环机制,常用的如msg_paint,用于屏幕输出。一般有以下情况

时系统会收到msg_paint消息: ① 用户移动窗口或显示窗口时; ② 用invalidaterect更新窗口的无效区域; ③ 调用updatewindow重绘窗口; ④ 覆盖程序窗口的对话框或消息框被消除; ⑤ 下拉或弹出菜单被消除; 出现闪烁光标就要检查程序中是否有以上情况发生; 3、如何修改控件的背景颜色; minigui各控件的背景颜色是已经在minigui.cfg的windowelementcolors段设置好的。每个控件都会有以register开头的函数,根据该函数中wndclass.ibkcolor对应的颜色序号在minigui.cfg中查找进行修改即可。但这种更改是全局性的,如果只是临时更改可用

setwindowbkcolor和setwindowelementcolorex来设置背景色和前景色。 4、listview创建及但不显示问题; 由于listview是minigui的扩展功能,这样在配置时要把ext lib中的listview control选中,具体: ① 在libminigui-2.0.4-linux下执行make menuconfig,选中ext library options

中的listview control,编译,修改makefile文件,把ext lib下的文件编译进去(一般情况下makefile已经包含了),并保证已经把编译好的libmgext-2.0.so.4.0.0拷贝到你的文件系统的 lib下;

② 在工程中如s7000的miniguimain中增加 if (!initminiguiext()) return 2;

③ 这样就可以使用这个控件了。 5、再次查看listview内容时,第一行数据不显示; 用listview控件时,先把控件中的内容删除即发送lvm_delallitem,然后再添加数据,以免数据显示混乱;

6、button上不能同时显示文字和图片; 在button.c中画图和画字是在btnpaintcontent中,而bs_bitmap和bs_text同在同一个switch,只能画一种情况。解决方法:把图和字放在不同的函数中,并且在画字的函数中

不进行switch,否则,仍画不出字; 7、button上的图片不能满button显示 修改draw_bitmap_button函数中关于画图时图片的位置处理; 8、skin实现chkbutton动态换图 skin源码功能简单,不能实现动态更换字的颜色,字体,换图等,一方面是skin结构问题,一方面是缺少相应功能,为了实现动态换图,进行了如下更改,可见skin_s7000宏。 ⑴ chkbutton文件修改

增加si_chkbutton_t,根据flag取相应的bmp_index; 增加decl_button,取si_chkbutton_t类型的type_data; chkbutton_draw_bg:改变画图方式,根据item的大小位置进行缩放。 增加

chkbutton_get_bmp获取bmp_index; 增加chkbutton_set_bmp设置需要的bmp; chkbutton_ops中增加chkbutton_get_bmp和chkbutton_set_bmp; ⑵ skin文件修改

增加skin_get_chkbt_bmp获取bmp_index; 增加skin_set_chkbt_bmp设置bmp_index; 由于refresh_item刷新的是item的rc_hittest,根据需要修改成刷新item大小的区域;

9、skin修改nrmlabel背景图和字的颜色 ⑴ skin.h文件修改

增加si_labelbmp_t,两个bmpindex; si_nrmlabel_t增加si_labelbmp_t,flag(color)和bmp_flag。根据flag和bmp_flag

的值设置相应的color和bmp_index; ⑵ skin.c文件修改

增加skin_get_label_color获取bmp_index; 增加skin_set_label_color设置bmp_index和color,根据flag和bmp_flag的值设置

相应的color和bmp_index; 由于refresh_item刷新的是item的rc_hittest,根据需要修改成刷新item大小的区域;

⑶ label.c文件修改 set_label:增加根据flag和bmp_flag的值设置相应的color和bmp_index;