MINIGUI开发中遇到的问题和对应学习方法
篇一: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; nrmlabel_ops中增加nrmlabel_draw_bg,用于画图和画字;
去掉nrmlabel_draw_attached的调用;
篇二:学习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常见问题 .......................................................................................................................................................... 2
1、在运行mginit时,出现错误 ................................................................................................................................. 2
2、combox怎么老是得不到消息 ............................................................................................................................. 2
3、CreateWindow()创建一个控件 ............................................................................................................................ 3
4、如何编写一个configure.in .................................................................................................................................. 3
5、怎样对minigui进行裁剪 .................................................................................................................................... 3
6、为什么运行mginit后,我的机子好象死掉 ...................................................................................................... 3
7、也问MiniGUI.cfg(和触摸屏有关) ................................................................................................................. 4
8、如何让我们自己的应用程序在启动mginit后自动执行 .................................................................................. 4
9、配置minigui时还有哪里需要disable或enable呢? ...................................................................................... 4
10、怎样设置设置单行编辑框中光标的位置 ........................................................................................................ 5
11、在静态文本控件中我如何设置文字颜色 ......................................................................................................... 6
12、我也在写软键盘,设计特征是这样的 ............................................................................................................ 6
13、为什么GetMenuItemInfo()这个函数总是没法用呀? ............................................................................. 38
14、如何在 MiniGUI-Lite 当中建立多个主窗口(再问多个主窗口会是这样吗) ......................................... 40
15、如何用BitBlt显示位图 ................................................................................................................................... 41
16、如何入手学习 .................................................................................................................................................. 41
17、如何参与 MiniGUI 的开发 ........................................................................................................................... 45
18、应用程序主窗口的句柄如何获取 .................................................................................................................. 46
19、怎么让主窗体是一个对话框 .......................................................................................................................... 46
20、关于消息循环的问题 ...................................................................................................................................... 46
21、关于定时器的一个问题 .................................................................................................................................. 47
22、关于OpenAboutDialog()函数 ......................................................................................................................... 47
23、step1问题 ........................................................................................................................................................ 48
24、minigui消息循环的问题 ................................................................................................................................. 48
25、miniGUI的基本原理 ....................................................................................................................................... 50
26、控件显示在图片的上面的问题 ...................................................................................................................... 50
27、如何从 MiniGUI 切换到其它控制台 ............................................................................................................ 52
28、我从未安装过 MiniGUI。要安装,需要下载哪些软件包? ...................................................................... 52
MiniGui常见问题
1、在运行mginit时,出现错误
问:error in step 2,there is already an instance of mginit
InitGUI failure when using /usr/local/etc/miniGUI.cfg as cfg file.
我ps时,看不到这个进程.
如何解决?谢谢.
答:删除 /var/tmp/m* 文件,再试试
2、combox怎么老是得不到消息
问:见了一个dialog,其中有一个combox,
属性是:ctrl_combobox,ws_visible| cbs_dropdownlist |ws_tabstop,
id是idc_test
在dialopro消息处理里面
case msg_command:
switch (wParam)
{.....
case idc_test:
TextOut(HDC_SCREEN,10,10,"test ok?");
break;
.......
}
始终不能显示我的test ok 字符,可是同样的`button,radio button 却可以得到消息 为什么?
答1: 找到答案了,好像要用LOWORD(wParam) 来识别消息来源的id,不知道是不是所有的空间都要这样,直接用wpraram 好像像combox就不行。我说的对不对呢? 还是请kongming说一说吧
答2:是的,来自控件的通知消息,是以 MSG_COMMAND 消息的形式发送到父窗口的, wParam 是由控件的 ID 和消息码 nc 组成的:
wParam = MAKELONG(id, nc);
要正确处理从控件发送到其主窗口的通知消息,就要先弄清楚是
哪个控件发出来的通知消息,然后搞清楚是什么通知消息:
switch (message) {
case MSG_COMMAND:
{
int id = LOWORD (wParam);
int nc = HIWORD (wParam);
if (id == IDC_CONTROL && nc == NC_CLICK)
...
}
}
3、CreateWindow()创建一个控件
问:我的方法是用movewindow(hwnd,x,y,width,height,TRUE),在控件窗口过程中
MSG_CREATE消息分支中调用,再调用SendAsyncMessage(hwnd,MSG_PAINT,0,0),
使控件重绘,这样做有个BUG,在MDE环境中我切到其他应用程序使比如虚拟桌面,
在切换回原应用程序使控间没有重绘,依旧是一个点,为什么呢?
斑竹,这个问题我想和好久了,你能帮我吗?谢谢
答:应该避免在 MSG_CREATE 当中调用 MoveWindow 函数,
你可以参考 SPINBOX 控件的实现,处理 MSG_SIZE 等消息。
在窗口正常建立之后,才能调用 MoveWindow,而且也没有
必要显式调用 SendAsy.... 函数。
4、如何编写一个configure.in
问:我在使用linux时,由于项目的需要,我们的minigui要生成一个可执行文件,但要有多个。
c文件,我在阅读了autoconf后,仍没头绪。请问我该如何编写一个configure.in,可生成一个 可执行文件,要求该项目中有至少俩个以上的。c文件。
答:还记得“MiniGUI用户”版中的那个 Hello, World! 示例程序吗?
在 Makefile.am 中含有 hello.c 的那行,以次将你的源文件列出来就行了。
中间用空格分开。当然,其它相关的东西也要一并修改一下。
其实,你还可以参考 MDE 的东西,照猫画虎总是可以的。
5、怎样对minigui进行裁剪
问:现在的minigui1.0对我来说,显得太大了一点。我想对minigui下的记事本进行功能扩充。
在满足这个要求的前提下,怎样将minigui裁到最小。我是一个新手,请各位高手多多指教。
答:请看“MiniGUI 用户”的精华区。
6、为什么运行mginit后,我的机子好象死掉
问:为什么运行mginit后,我的机子好象死掉,只是一个绿屏,按其他键也无反映,
也不能切换到其他控制台上。按ctrl+alt+esc会有一个弹出菜单。什么也不能用,也退不出去 答1:你是试试ctrl+esc和单独的ctrl 你的vcongui好像有问题
答2:分辨率太低了吧。你调整一下源代码,就可以了。
不过,新的版本(1.1.0Pre1)和新的演示(mde)
能够自动根据分辨率调整,你可以试试新版本。
7、也问MiniGUI.cfg(和触摸屏有关)
问:MiniGUI.cfg原文件中有这样的定义:
mdev=mouse
mtype=ps2
注释掉不行,怎么改呢?(我使用触摸屏)
答:注意,MiniGUI 通过采用不同的 IAL 引擎来支持不同平台上的输入设备。
如果你用的是触摸屏,则需要给自己的触摸屏编写一个 IAL 引擎,
就像 src/ial/ 目录下的 ads、ipaq、vr4181 等一样,然后在
/etc/MiniGUI.cfg 中指定你 IAL 引擎:
ial_engine=yourengine
mdev 和 mtype 是 native ial engine 用来支持 PC 上的输入设备的。
对嵌入式系统没有意义。
8、如何让我们自己的应用程序在启动mginit后自动执行
问:尽管版主说,数据存储方式应该不会成为问题,但是我不放心把所有涉及读WORD的地方都 倒换过来,借用Helio.c作为我们的输入引擎,mginit终于可以正常运行在目标板上(没有鼠标显示)。但是mginit只是一个服务器,如何让我们自己的应用程序在启动mginit后自动执行(类似批处理),因为无键盘可输入。
第二触摸屏上没有显示鼠标箭头,试着在配置时去掉disable-cursor,则在运行时初始化鼠标错。 答1:我想起来了,数据存储方式应该会影响文件的读写功能。
比如对 BMP、Cursor、ICON,以及 FONT 等的装载功能。
而程序内部的东西,则应该不会受到影响。
启动 mginit 之后,你可以 fork 并 exec 一个客户程序。
初始化鼠标错误,可能和鼠标资源有关。
答2:看来需要在所有涉及到文件读写的地方添加条件编译,
以便支持具有不同字节顺序的系统。
等 1.1.0Pre2 版本吧。呵呵。
9、配置minigui时还有哪里需要disable或enable呢?
问:现在minigui提供的demo都已用ppc_8xx-gcc编译通过,但运行不起来,报告如下错误: Can't open /dev/tty: Device not configured
GAL: Init GAL engine failure.
Error in step 3: Can not initialize graphics engine!
Initialize minigui failure when using /etc/MiniGUI.cfg as cfg file
我的目标板是一个嵌入式平台,没有键盘,没有鼠标,只有一个触摸屏。
在配置minigui时还有哪里需要disable或enable呢?
答:一般而言,要做如下几项工作:
1. 如果是 1.0.07 以前的版本,请编辑 src/gal/native.h 文件,
将 HAVETEXTMODE 设置为 0。同时使用 --enable-purefbgfx 选项配置。
2. 如果是 1.0.07 以后的版本,--enable-purefbgfx 就够了。
3. 禁止 native ial engine:--disable-nativeial。
4. 编写自己的 ial engine,并打开。比如,如果你的系统是 iPAQ,则可以 直接使用 1.0.07 版本中的 ial engine,即使用 --enable-ipaqial。
5. 编辑 /etc/MiniGUI.cfg,指定 ial_engine 为自己的引擎名称。
6. 关闭或者打开其他选项。
比如,针对 iPAQ 的配置命令可以是:
./configure --prefix=/home/projects/minigui-ipaq-bin/
--disable-debug
--disable-static
--enable-purefbgfx
--enable-nativegal
--enable-ipaqial
--disable-nativeial
--disable-pcxsupport
--disable-lbmsupport
--disable-tgasupport
--disable-jpgsupport
--disable-pngsupport
--disable-vbfsupport
--disable-movewindowbymouse
--disable-cursor
--disable-imegb2312
--disable-imegb2312pinyin
--disable-savebitmap
--disable-savescreen
--disable-aboutdlg
--disable-ext-fullgif
--enable-tinyscreen
、怎样设置设置单行编辑框中光标的位置
问:能否设置单行编辑框中光标的位置,怎样设置?
答:Edit 控件的功能和接口还不完善呢。
许多东西都还没有实现,比如恢复、选中等等。
按照设计,插入符位置的修改是通过发送 EM_SCROLLCARET
消息实现的。实现其他一些功能可能比较困难,但实现
但实现一个 EM_SCROLLCARET 消息的处理应该不是很难。
你能不能实现这个功能?
可以参考 src/control/edit.c 中 MSG_KEYDOWN 和 MSG_LBUTTONDOWN 消息的处理。
【MINIGUI开发中遇到的问题和对应学习方法】相关文章:
关于职场礼仪中遇到的问题07-30
网站改版中遇到的SEO问题总结11-13
面试中遇到问题及巧妙回答12-12
创业遇到困难和问题怎么办?12-02
面试会遇到的问题11-15
面试遇到的待遇问题08-03
考研遇到的问题答案12-17
成都小升初面试中的一定会遇到的问题01-10
面试中的问题和回答12-05