MINIGUI開發(fā)中遇到的問題和對應學習方法
篇一:MINIGUI開發(fā)中遇到的問題及解決方法
MINIGUI開發(fā)中遇到的問題及解決方法
MiniGui是基于消息機制的開發(fā)工具,由于不具備可視化性,這就要求開發(fā)人員熟悉其控件及消息機制。首先要閱讀其中的開發(fā)文檔如:
MINIGUI-USER-MANUAL.pdf(了解其配置、編譯及安裝方法); MiniGUITechWhitePaper-2.0-4C.pdf(了解控件及其用途);
MINIGUI-PROG-GUIDE-V2.0-4C.pdf(具體控件屬性、消息等);
另外,給出了控件的示例,可以編譯學習,示例程序一般在mg-samples-2.0.4文件夾中。
在開發(fā)中遇到了一些問題,折騰了半天最后才發(fā)現(xiàn)是MiniGui的問題。程序員開發(fā)時大多數是邊做邊學的,遇到問題再查找解決方法,這樣印象更深刻。下面把經常遇到,甚至是低級幼稚的問題總結一下,做個記錄。
1、不想修改的編輯框仍可以輸入或輸入的一個字符卻顯示兩個等;
大多數可編輯的控件都有READONLY屬性(不同控件前綴可能不同),該屬性決定編輯框為只讀屬性,用戶不能修改編輯框中的內容,但插入符可見,因此,如果不想讓編輯框可編輯,加上此屬性就ok了。
2、編輯框上不該有光標閃爍時,卻總是會閃爍;
MiniGui有自己的消息循環(huán)機制,常用的如MSG_PAINT,用于屏幕輸出。一般有以下情況時系統(tǒng)會收到MSG_PAINT消息:
、 用戶移動窗口或顯示窗口時;
、 用InvalidateRect更新窗口的無效區(qū)域;
、 調用UpdateWindow重繪窗口;
、 覆蓋程序窗口的對話框或消息框被消除;
、 下拉或彈出菜單被消除;
出現(xiàn)閃爍光標就要檢查程序中是否有以上情況發(fā)生;
3、如何修改控件的背景顏色;
MiniGui各控件的背景顏色是已經在MiniGUI.cfg的windowelementcolors段設置好的。每個控件都會有以Register開頭的函數,根據該函數中WndClass.iBkColor對應的顏色序號在MiniGUI.cfg中查找進行修改即可。但這種更改是全局性的,如果只是臨時更改可用SetWindowBkColor和SetWindowElementColorEx來設置背景色和前景色。
4、LISTVIEW創(chuàng)建及但不顯示問題;
由于listview是MiniGui的擴展功能,這樣在配置時要把EXT lib中的LISTVIEW control選中,具體:
① 在libminigui-2.0.4-linux下執(zhí)行make menuconfig,選中Ext library options中的Listview control,編譯,修改makefile文件,把ext lib下的文件編譯進去(一般情況下makefile已經包含了),并保證已經把編譯好的libmgext-2.0.so.4.0.0拷貝到你的文件系統(tǒng)的 lib下;
、 在工程中如S7000的MiniGUIMain中增加
if (!InitMiniGUIExt())
return 2;
、 這樣就可以使用這個控件了。
5、再次查看Listview內容時,第一行數據不顯示;
用listview控件時,先把控件中的內容刪除即發(fā)送LVM_DELALLITEM,然后再添加數據,以免數據顯示混亂;
6、button上不能同時顯示文字和圖片;
在button.c中畫圖和畫字是在btnPaintContent中,而BS_BITMAP和BS_TEXT同在同一個switch,只能畫一種情況。解決方法:把圖和字放在不同的函數中,并且在畫字的函數中不進行switch,否則,仍畫不出字;
7、button上的圖片不能滿button顯示
修改draw_bitmap_button函數中關于畫圖時圖片的位置處理;
8、SKIN實現(xiàn)chkbutton動態(tài)換圖
Skin源碼功能簡單,不能實現(xiàn)動態(tài)更換字的顏色,字體,換圖等,一方面是skin結構問題,一方面是缺少相應功能,為了實現(xiàn)動態(tài)換圖,進行了如下更改,可見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大小的區(qū)域;
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大小的區(qū)域;
、 label.c文件修改
set_label:增加根據flag和bmp_flag的值設置相應的color和bmp_index; nrmlabel_ops中增加nrmlabel_draw_bg,用于畫圖和畫字;
去掉nrmlabel_draw_attached的調用;
篇二:學習MiniGui之窗口創(chuàng)建篇
最近在學習MiniGui,將一些分析的結果貼出來供大家參考,同時歡迎大家的指正。 圖形編程中,窗口是一個重要的概念,窗口其實是一個矩形框,應用程序可以使用其從而達到輸出結果和接受用戶輸入的效果。窗口系統(tǒng)(Window System)界于操作系統(tǒng)層次之上,它是一個軟件系統(tǒng),負責把顯示屏幕分隔為不同的部分來幫助用戶管理和控制不同的顯示環(huán)境,它提供基于窗口的工作模式。在Linux上面,X就是一個典型的窗口系統(tǒng)吧。
在MiniGui中有三種窗口類型:主窗口,對話框和控件窗口。主窗口作為應用程序的主界面或開始界面。子窗口通常是控件窗口,也可以是自定義窗口類,這里的控件窗口說白了就是一些窗口上面的控件,比如按鈕,編輯框等。對話框其實就是主窗口,只不過一般為了完成特殊用途,所以在此加以區(qū)分。
下面我們一起來看看這三種窗口類型的創(chuàng)建吧。首先看CreateMainWindow函數,它創(chuàng)建一個主窗口:由于代碼比較長,這里就不全部貼出了,主要是說說關鍵的部分。
CreateMainWindow函數通過接受PMAINWINCREATE類型的參數而創(chuàng)建一個窗口,并返回其句柄。關于PMAINWINCREATE結構的具體成員變量,大家可以去查看源碼。下面主要對函數內部做個簡單介紹。
1. 聲明一個PMAINWIN類型,并分配空間,該變量用來存放創(chuàng)建的主窗口的信息
2. 說下面的代碼之前,先說說托管(Hosting)窗口和被托管(Hosted)窗口吧。我們知道
MiniGui內部實現(xiàn)了消息機制,即當有鍵盤輸入事件發(fā)生時,就往消息隊列中發(fā)送鍵盤消息,而一般是主窗口會不停的從消息隊列中取出消息來處理,或者自己響應,或者忽略,或者派發(fā)給其他的窗口。那么這里就有一個問題,消息隊列是每個主窗口都有一個呢,還是所有的主窗口都使用同一個消息隊列?在MiniGui中有個特殊的主窗口HWND_DESKTOP,它是所有窗口的父窗口,直觀的說就是整個桌面的窗口。當一個主窗口在創(chuàng)建的時候,可以指定新建一個消息隊列,也可以使用別的主窗口的消息隊列,如果是后者,假設主窗口A在創(chuàng)建時指定使用主窗口B的消息隊列,那么A就被稱為被托管窗口,而B則被稱為托管窗口。所以很明顯CreateInfo.hHosting就是用來指明托管窗口的。來看下面的代碼,這里對MiniGUI的兩種運行模式進行了區(qū)分,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. 初始化結束之后,就開始發(fā)送消息通知自身來真正的繪制窗口了。1-4行發(fā)送本窗口
的MSG_SIZECHANGING和MSG_CHANGESIZE消息,會調用本窗口消息回調函數中的相應處理部分。第6行是發(fā)送MSG_ADDNEWMAINWIN消息給HWND_DESKTOP窗口,HWND_DESKTOP窗口主要負責初始化Clip區(qū)和Invalid區(qū),并且把當前窗口添加到sg_MainWinZOrder鏈表里,這個鏈表記錄的是所有窗口的疊加順序,在顯示和隱藏窗口的時候,疊加順序很重要,它會決定屏幕上哪些窗口會受影響而需要重繪。第9行發(fā)送MSG_CREATE消息給窗口,窗口接受到此消息一般進行子窗口的初始化和創(chuàng)建,如果創(chuàng)建失敗了,則通知HWND_DESKTOP窗口銷毀該主窗口。
接下來我們看對話框的創(chuàng)建過程,對話框分為模態(tài)和非模態(tài)對話框。非模態(tài)對話框的創(chuàng)建過程和主窗口的創(chuàng)建過程差不多,其中也調用了CreateMainWindow函數,之后還調用了CreateWindowEx創(chuàng)建對話框上的控件。模態(tài)對話框就是顯示之后,用戶不能再切換到其他主窗口進行工作的對話框,而只能在關閉之后,才能使用其他的主窗口,通過DialogBoxIndirectParam創(chuàng)建,一開始的步驟與非模態(tài)對話框類似,以下的代碼是其不同的部分:第7行,hOwner是待創(chuàng)建對話框的托管主窗口,這里其實是把它disable掉了。第11行是處理MSG_INITDIALOG消息。第18-21行,是消息處理的循環(huán)機制,這里可以看到這就是為什么模態(tài)對話框一定要等到關閉之后,才可以使用其它的主窗口,這里還需要注意一點,由于是從對話框的托管主窗口是HWND_DESKTOP窗口,因此他們共用一個消息隊列,此時,對話框可能接受到發(fā)送給托管主窗口的消息,而由于在第7行中已經將托管主窗口的dwStyle設置為WS_DISABLE了,因此在這些消息處理流程里面可以做相應的處理(例如當窗口被設置為WS_DISABLE時,忽略該消息)。25-28行,當窗口關閉時,進行的收尾工作。第31行enable托管主窗口。第23行判斷了當前對話框是否是激活窗口,如果是的話,當它關閉時,它的托管主窗口應該被激活(34-35L)。
篇三:MiniGui常見問題
MINIGUI常見問題 .......................................................................................................................................................... 2
1、在運行mginit時,出現(xiàn)錯誤 ................................................................................................................................. 2
2、combox怎么老是得不到消息 ............................................................................................................................. 2
3、CreateWindow()創(chuàng)建一個控件 ............................................................................................................................ 3
4、如何編寫一個configure.in .................................................................................................................................. 3
5、怎樣對minigui進行裁剪 .................................................................................................................................... 3
6、為什么運行mginit后,我的機子好象死掉 ...................................................................................................... 3
7、也問MiniGUI.cfg(和觸摸屏有關) ................................................................................................................. 4
8、如何讓我們自己的應用程序在啟動mginit后自動執(zhí)行 .................................................................................. 4
9、配置minigui時還有哪里需要disable或enable呢? ...................................................................................... 4
10、怎樣設置設置單行編輯框中光標的位置 ........................................................................................................ 5
11、在靜態(tài)文本控件中我如何設置文字顏色 ......................................................................................................... 6
12、我也在寫軟鍵盤,設計特征是這樣的 ............................................................................................................ 6
13、為什么GetMenuItemInfo()這個函數總是沒法用呀? ............................................................................. 38
14、如何在 MiniGUI-Lite 當中建立多個主窗口(再問多個主窗口會是這樣嗎) ......................................... 40
15、如何用BitBlt顯示位圖 ................................................................................................................................... 41
16、如何入手學習 .................................................................................................................................................. 41
17、如何參與 MiniGUI 的開發(fā) ........................................................................................................................... 45
18、應用程序主窗口的句柄如何獲取 .................................................................................................................. 46
19、怎么讓主窗體是一個對話框 .......................................................................................................................... 46
20、關于消息循環(huán)的問題 ...................................................................................................................................... 46
21、關于定時器的一個問題 .................................................................................................................................. 47
22、關于OpenAboutDialog()函數 ......................................................................................................................... 47
23、step1問題 ........................................................................................................................................................ 48
24、minigui消息循環(huán)的問題 ................................................................................................................................. 48
25、miniGUI的基本原理 ....................................................................................................................................... 50
26、控件顯示在圖片的上面的問題 ...................................................................................................................... 50
27、如何從 MiniGUI 切換到其它控制臺 ............................................................................................................ 52
28、我從未安裝過 MiniGUI。要安裝,需要下載哪些軟件包? ...................................................................... 52
MiniGui常見問題
1、在運行mginit時,出現(xiàn)錯誤
問: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 消息的形式發(fā)送到父窗口的, wParam 是由控件的 ID 和消息碼 nc 組成的:
wParam = MAKELONG(id, nc);
要正確處理從控件發(fā)送到其主窗口的通知消息,就要先弄清楚是
哪個控件發(fā)出來的通知消息,然后搞清楚是什么通知消息:
switch (message) {
case MSG_COMMAND:
{
int id = LOWORD (wParam);
int nc = HIWORD (wParam);
if (id == IDC_CONTROL && nc == NC_CLICK)
...
}
}
3、CreateWindow()創(chuàng)建一個控件
問:我的方法是用movewindow(hwnd,x,y,width,height,TRUE),在控件窗口過程中
MSG_CREATE消息分支中調用,再調用SendAsyncMessage(hwnd,MSG_PAINT,0,0),
使控件重繪,這樣做有個BUG,在MDE環(huán)境中我切到其他應用程序使比如虛擬桌面,
在切換回原應用程序使控間沒有重繪,依舊是一個點,為什么呢?
斑竹,這個問題我想和好久了,你能幫我嗎?謝謝
答:應該避免在 MSG_CREATE 當中調用 MoveWindow 函數,
你可以參考 SPINBOX 控件的實現(xiàn),處理 MSG_SIZE 等消息。
在窗口正常建立之后,才能調用 MoveWindow,而且也沒有
必要顯式調用 SendAsy.... 函數。
4、如何編寫一個configure.in
問:我在使用linux時,由于項目的需要,我們的minigui要生成一個可執(zhí)行文件,但要有多個。
c文件,我在閱讀了autoconf后,仍沒頭緒。請問我該如何編寫一個configure.in,可生成一個 可執(zhí)行文件,要求該項目中有至少倆個以上的。c文件。
答:還記得“MiniGUI用戶”版中的那個 Hello, World! 示例程序嗎?
在 Makefile.am 中含有 hello.c 的那行,以次將你的源文件列出來就行了。
中間用空格分開。當然,其它相關的東西也要一并修改一下。
其實,你還可以參考 MDE 的東西,照貓畫虎總是可以的。
5、怎樣對minigui進行裁剪
問:現(xiàn)在的minigui1.0對我來說,顯得太大了一點。我想對minigui下的記事本進行功能擴充。
在滿足這個要求的前提下,怎樣將minigui裁到最小。我是一個新手,請各位高手多多指教。
答:請看“MiniGUI 用戶”的精華區(qū)。
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 上的輸入設備的。
對嵌入式系統(tǒng)沒有意義。
8、如何讓我們自己的應用程序在啟動mginit后自動執(zhí)行
問:盡管版主說,數據存儲方式應該不會成為問題,但是我不放心把所有涉及讀WORD的地方都 倒換過來,借用Helio.c作為我們的輸入引擎,mginit終于可以正常運行在目標板上(沒有鼠標顯示)。但是mginit只是一個服務器,如何讓我們自己的應用程序在啟動mginit后自動執(zhí)行(類似批處理),因為無鍵盤可輸入。
第二觸摸屏上沒有顯示鼠標箭頭,試著在配置時去掉disable-cursor,則在運行時初始化鼠標錯。 答1:我想起來了,數據存儲方式應該會影響文件的讀寫功能。
比如對 BMP、Cursor、ICON,以及 FONT 等的裝載功能。
而程序內部的東西,則應該不會受到影響。
啟動 mginit 之后,你可以 fork 并 exec 一個客戶程序。
初始化鼠標錯誤,可能和鼠標資源有關。
答2:看來需要在所有涉及到文件讀寫的地方添加條件編譯,
以便支持具有不同字節(jié)順序的系統(tǒng)。
等 1.1.0Pre2 版本吧。呵呵。
9、配置minigui時還有哪里需要disable或enable呢?
問:現(xiàn)在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,并打開。比如,如果你的系統(tǒng)是 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 控件的功能和接口還不完善呢。
許多東西都還沒有實現(xiàn),比如恢復、選中等等。
按照設計,插入符位置的修改是通過發(fā)送 EM_SCROLLCARET
消息實現(xiàn)的。實現(xiàn)其他一些功能可能比較困難,但實現(xiàn)
但實現(xiàn)一個 EM_SCROLLCARET 消息的處理應該不是很難。
你能不能實現(xiàn)這個功能?
可以參考 src/control/edit.c 中 MSG_KEYDOWN 和 MSG_LBUTTONDOWN 消息的處理。
【MINIGUI開發(fā)中遇到的問題和對應學習方法】相關文章:
關于職場禮儀中遇到的問題07-30
網站改版中遇到的SEO問題總結11-13
面試中遇到問題及巧妙回答12-12
創(chuàng)業(yè)遇到困難和問題怎么辦?12-02
面試會遇到的問題11-15
面試遇到的待遇問題08-03
考研遇到的問題答案12-17
成都小升初面試中的一定會遇到的問題01-10
面試中的問題和回答12-05