Buildroot 移植MiniGUI: 编写简单示例(基于君正X2000)
概述
上一篇文章: Buildroot 移植MiniGUI, 在编译打包完文件系统后, 编写一个Demo进一步验证MiniGUI的功能.
目标平台:
键 | 值 |
---|---|
CPU | X2000 |
架构 | mips |
内存 | 128MB |
存储 | 256MB |
LCD | 600*1024 |
MiniGUI 的三种运行模式
在编写第一个 MiniGUI 程序之前,需要了解如下事实:我们可将 MiniGUI 配置编译成三种具有不同体系架构的版本,我们称为运行模式:
- MiniGUI-Threads。运行在 MiniGUI-Threads 上的程序可以在不同的线程中建立多个窗口,但所有的窗口在一个进程或者地址空间中运行。这种运行模式非常适合于大多数传统意义上的嵌入式操作系统,比如 uC/OS-II、eCos、VxWorks、pSOS 等等。当然,在 Linux 和 uClinux 上,MiniGUI 也能以 MiniGUI-Threads 的模式运行。
- MiniGUI-Processes。和 MiniGUI-Threads 相反,MiniGUI-Processes 上的每个程序是独立的进程,每个进程也可以建立多个窗口。MiniGUI-Processes 适合于具有完整 UNIX 特性的嵌入式操作系统,比如嵌入式 Linux。
- MiniGUI-Standalone。这种运行模式下,MiniGUI 可以以独立进程的方式运行,既不需要多线程也不需要多进程的支持,这种运行模式适合功能单一的应用场合。比如在一些使用 uClinux 的嵌入式产品中,因为各种原因而缺少线程库支持,这时,就可以使用 MiniGUI-Standalone 来开发应用软件。
本文采用MiniGUI-Threads运行模式.
参考代码
minigui_hello.c
#include <stdio.h>//for X2000
#include <unistd.h>
#include <libhardware2/fb.h>#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>int fb_fd;
static struct fb_device_info fb;static int HelloWinProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{HDC hdc;switch (message) {case MSG_PAINT:hdc = BeginPaint (hWnd);TextOut (hdc, 60, 60, "Hello world!");EndPaint (hWnd, hdc);//X2000平台, 用与刷新屏幕fb_pan_display(fb_fd, &fb, 0);return 0;case MSG_CLOSE:DestroyMainWindow (hWnd);PostQuitMessage (hWnd);fb_disable(fb_fd);close(fb_fd);return 0;}return DefaultMainWinProc (hWnd, message, wParam, lParam);
}int MiniGUIMain (int argc, const char* argv[])
{int ret;//X2000平台, 打开屏幕, 否则图像不会刷新到屏幕上fb_fd = fb_open("/dev/fb0", &fb);if (fb_fd == -1) {printf( "fb open device failed\n");ret = -ENODEV;exit(-6);}MSG Msg;HWND hMainWnd;MAINWINCREATE CreateInfo;#ifdef _MGRM_PROCESSESJoinLayer (NAME_DEF_LAYER , "helloworld" , 0 , 0);#endifCreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;CreateInfo.dwExStyle = WS_EX_NONE;CreateInfo.spCaption = "HelloWorld";CreateInfo.hMenu = 0;CreateInfo.hCursor = GetSystemCursor (0);CreateInfo.hIcon = 0;CreateInfo.MainWindowProc = HelloWinProc;CreateInfo.lx = 0;CreateInfo.ty = 0;CreateInfo.rx = 240;CreateInfo.by = 180;CreateInfo.iBkColor = COLOR_lightwhite;CreateInfo.dwAddData = 0;CreateInfo.hHosting = HWND_DESKTOP;hMainWnd = CreateMainWindow (&CreateInfo);if (hMainWnd == HWND_INVALID)return -1;ShowWindow (hMainWnd, SW_SHOWNORMAL);while (GetMessage (&Msg, hMainWnd)) {TranslateMessage (&Msg);DispatchMessage (&Msg);}MainWindowThreadCleanup (hMainWnd);return 0;
}#ifndef _MGRM_PROCESSES
#include <minigui/dti.c>
#endif
CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(minigui_hello)# 君正X2000的SDK路径, 用于配置
# 1. 交叉编译器
# 2. 头文件, 君正的FrameBuffer 操作和MiniGUI的头文件
# 3. 依赖的动态库 FrameBuffer和MiniGUI的核心库
# PS: 也可以单独提取出对应的头文件和库放到指定目录编译
set(SRC_DIR /sdk/X2000)
# set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${SRC_DIR}/build/output)# 设置MIPS交叉编译工具链
set(CMAKE_C_COMPILER ${SRC_DIR}/tools/toolchains/mips-gcc720-glibc229/bin/mips-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER ${SRC_DIR}/tools/toolchains/mips-gcc720-glibc229/bin/mips-linux-gnu-g++)# 添加可执行文件
add_executable(minigui_hello minigui_hello.c)# 头文件
include_directories(${SRC_DIR}/buildroot/buildroot/output/staging/usr/include)
# 依赖库
target_link_directories(minigui_hello PRIVATE ${SRC_DIR}/buildroot/buildroot/output/target/usr/lib)
target_link_libraries(minigui_hello PRIVATE hardware2 pthread minigui_ths)
运行
重要:
需要内置对应的资源文件和MinuGUI.cfg配置文件
-
尝试运行前面编译的程序:
# ./minigui_hello MISC: Can not locate your MiniGUI.cfg file or bad files! KERNEL>InitGUI: Initialization of misc things failure!
这是由于在前面集成MiniGUI的过程中, 并没有把对应的资源包集成进文件系统中: MiniGUI Resource (V4.0.0), 缺少了MiniGUI.cfg文件
在 Linux 系统中,默认配置下构建并安装 MiniGUI 后,MiniGUI 源代码目录中的文件etc/MiniGUI.cfg
将会被安装到/usr/local/etc/
目录下。不过,你也可以在自己的主目录(home directory)中部署自己版本的MiniGUI.cfg
配置文件,这个版本的配置文件将具有更高的优先级。事实上,当 MiniGUI 启动时,它会按照以下顺序尝试查找正确的
MiniGUI.cfg
文件:- 在当前工作目录中查找
MiniGUI.cfg
文件。如果没有找到, - 在当前用户的主目录中查找
.MiniGUI.cfg
文件(这是一个隐藏文件)。如果没有找到, - 在
/usr/local/etc/
目录中查找MiniGUI.cfg
。如果没有找到, - 最后在
/etc/
目录中查找MiniGUI.cfg
。
- 在当前工作目录中查找
-
增加MiniGUI.cfg 参考MiniGUIUserManualRuntimeConfiguration.md
## 1[system]
gal_engine=fbcon
defaultmode=600x1024-16bpp
ial_engine=dummy[fbcon]
device=/dev/fb0
defaultmode=600x1024-16bpp
dpi=96## 2
# ./minigui_hello
# init_or_term_specifical_fonts: can't find font_number in section rawbitmapfonts
# mg_InitGDI: Can not initialize fonts defined in section rawbitmapfonts![systemfont]
font_number=1
font0=rbf-fixed-rrncnn-8-16-ISO8859-1default=0
wchar_def=0
fixed=0
caption=0
menu=0
control=0[rawbitmapfonts]
font_number=1
name0=rbf-fixed-rrncnn-8-16-ISO8859-1
fontfile0=/usr/data/font/8x16-iso8859-1.bin[varbitmapfonts]
font_number=0[upf]
font_number=0
#name0=upf-unifont-rrncnn-16-16-ISO8859-1,ISO8859-15,GB2312,BIG5,GBK,UTF-8,UTF-16LE,UTF-16BE
#fontfile0=/usr/data/unifont_160_50.upf[qpf]
font_number=0[truetypefonts]
font_number=0[resinfo]
respath=/usr/data/## 3
# ./minigui_hello
# KERNEL>InitGUI: Count not init mouse cursor!
# KERNEL>InitGUI: Init failure, please check your MiniGUI configuration or resource.[cursorinfo]
# Edit following line to specify cursor files path
# cursorpath=/usr/data/cursor/
cursornumber=23
cursor0=d_arrow.cur
cursor1=d_beam.cur
cursor2=d_pencil.cur
cursor3=d_cross.cur
cursor4=d_move.cur
cursor5=d_sizenwse.cur
cursor6=d_sizenesw.cur
cursor7=d_sizewe.cur
cursor8=d_sizens.cur
cursor9=d_uparrow.cur
cursor10=d_none.cur
cursor11=d_help.cur
cursor12=d_busy.cur
cursor13=d_wait.cur
cursor14=g_rarrow.cur
cursor15=g_col.cur
cursor16=g_row.cur
cursor17=g_drag.cur
cursor18=g_nodrop.cur
cursor19=h_point.cur
cursor20=h_select.cur
cursor21=ho_split.cur
cursor22=ve_split.cur# -------------------## 4
# InitRendererSystemIcon: SYSRES: can't get icon number for LFRDR classic.
# GUI>LFRDR: failed to initialize default renderer's private info.[classic]
# Note that max number defined in source code is 5.
iconnumber=5
icon0=form.ico
icon1=failed.ico
icon2=help.ico
icon3=warning.ico
icon4=excalmatory.ico# default icons for new OpenFileDialogBox
dir=folder.ico
file=textfile.ico# default icons for TreeView control
treefold=fold.ico
treeunfold=unfold.ico# bitmap used by BUTTON control
radiobutton=classic_radio_button.bmp
checkbutton=classic_check_button.bmp# background picture, use your favirate photo
bgpicture=none
bgpicpos=center
# bgpicpos=upleft
# bgpicpos=downleft
# bgpicpos=upright
# bgpicpos=downright
# bgpicpos=upcenter
# bgpicpos=downcenter
# bgpicpos=vcenterleft
# bgpicpos=vcenterright
# bgpicpos=none#window element metrics
caption=20
menu=25
border=2
scrollbar=16#window element colors
fgc_active_caption=0xFFFFFFFF
bgca_active_caption=0xFF6A240A
bgcb_active_caption=0xFF6A240Afgc_menu=0xFF000000
bgc_menu=0xFFCED3D6fgc_msgbox=0xFF000000fgc_tip=0xFF000000
bgc_tip=0xFFE7FFFFfgc_active_border=0xFFCED3D6
fgc_inactive_border=0xFFCED3D6fgc_inactive_caption=0xFFC8D0D4
bgca_inactive_caption=0xFF808080
bgcb_inactive_caption=0xFF808080fgc_window=0xFF000000
bgc_window=0xFFFFFFFFfgc_3dbox=0xFF000000
mainc_3dbox=0xFFCED3D6fgc_selected_item=0xFFFFFFFF
bgc_selected_item=0xFF6B2408
bgc_selected_lostfocus=0xFFBDA69Cfgc_disabled_item=0xFF848284
bgc_disabled_item=0xFFCED3D6fgc_hilight_item=0xFFFFFFFF
bgc_hilight_item=0xFF6B2408fgc_significant_item=0xFFFFFFFF
bgc_significant_item=0xFF6B2408bgc_desktop=0xFFC08000## 5
# InitRendererSystemIcon: SYSRES: can't get icon number for LFRDR flat.
# mg_InitLFManager: failed to initialize renderer[1]'s private info.
# InitRendererSystemIcon: SYSRES: can't get icon number for LFRDR skin.
# mg_InitLFManager: failed to initialize renderer[2]'s private info.#{{ifdef _MGLF_RDR_FLAT
[flat]
# Note that max number defined in source code is 5.
iconnumber=5
icon0=form-flat.ico
icon1=failed-flat.ico
icon2=help-flat.ico
icon3=warning-flat.ico
icon4=excalmatory-flat.ico# default icons for new OpenFileDialogBox
dir=folder-flat.ico
file=textfile-flat.ico# default icons for TreeView control
treefold=fold-flat.ico
treeunfold=unfold-flat.ico# bitmap used by BUTTON control
radiobutton=flat_radio_button.bmp
checkbutton=flat_check_button.bmp# background picture, use your favirate photo
bgpicture=none
bgpicpos=center#window element metrics
caption=20
menu=25
border=1
scrollbar=16#window element colors
fgc_active_caption=0xFFFFFFFFF
bgca_active_caption=0xFF000000
bgcb_active_caption=0xFF000000fgc_inactive_caption=0xFF000000
bgca_inactive_caption=0xFFFFFFFF
bgcb_inactive_caption=0xFFFFFFFFfgc_menu=0xFF000000
bgc_menu=0xFFD8D8D8fgc_msgbox=0xFF000000fgc_tip=0xFF000000
bgc_tip=0xFFE7FFFFfgc_active_border=0xFF000000
fgc_inactive_border=0xFF848284fgc_window=0xFF000000
bgc_window=0xFFFFFFFFfgc_3dbox=0xFF000000
mainc_3dbox=0xFFFFFFFFfgc_selected_item=0xFFFFFFFF
bgc_selected_item=0xFF000000
bgc_selected_lostfocus=0xFFBDA69Cfgc_disabled_item=0xFF848284
bgc_disabled_item=0xFF000000fgc_hilight_item=0xFFFFFFFF
bgc_hilight_item=0xFF664E4Afgc_significant_item=0xFFFFFFFF
bgc_significant_item=0xFF000000bgc_desktop=0xFFC08000flat_tab_normal_color=0xFFC6D2CF
#}}#{{ifdef _MGLF_RDR_SKIN
[skin]
# Note that max number defined in source code is 5.
iconnumber=5
icon0=form.ico
icon1=failed.ico
icon2=help.ico
icon3=warning.ico
icon4=excalmatory.ico# default icons for new OpenFileDialogBox
dir=folder.ico
file=textfile.ico# default icons for TreeView control
treefold=fold.ico
treeunfold=unfold.ico# background picture, use your favirate photo
bgpicture=none
bgpicpos=center#window element metrics
caption=25
menu=25
border=1
scrollbar=17fgc_active_caption=0xFFFFFFFF
bgca_active_caption=0xFFE35400
bgcb_active_caption=0xFF686868fgc_menu=0xFF000000
bgc_menu=0xFFD4D6FFfgc_msgbox=0xFF000000fgc_tip=0xFF000000
bgc_tip=0xFFFFFFFFfgc_active_border=0xFFC8D0D4
fgc_inactive_border=0xFFC8D0D4fgc_inactive_caption=0xFFF8E4D8
bgca_inactive_caption=0xFFDF967A
bgcb_inactive_caption=0xFF686868fgc_window=0xFF000000
bgc_window=0xFFFFFFFFfgc_3dbox=0xFF000000
mainc_3dbox=0xFFD8E9ECfgc_selected_item=0xFFFFFFFF
bgc_selected_item=0xFFC56A31
bgc_selected_lostfocus=0xFFD8E9ECfgc_disabled_item=0xFF99A8AC
bgc_disabled_item=0xFFFFFFFFfgc_hilight_item=0xFFFFFFFF
bgc_hilight_item=0xFFC56A31fgc_significant_item=0xFFFFFFFF
bgc_significant_item=0xFFC56A31bgc_desktop=0xFF984E00skin_bkgnd=skin_bkgnd.bmp
skin_caption=skin_caption.gif
skin_caption_btn=skin_cpn_btn.gif#for scrollbar
skin_scrollbar_hshaft=skin_sb_hshaft.bmp
skin_scrollbar_vshaft=skin_sb_vshaft.bmp
skin_scrollbar_hthumb=skin_sb_hthumb.bmp
skin_scrollbar_vthumb=skin_sb_vthumb.bmp
skin_scrollbar_arrows=skin_sb_arrows.bmp#for border
skin_tborder=skin_tborder.bmp
skin_bborder=skin_bborder.bmp
skin_lborder=skin_lborder.bmp
skin_rborder=skin_rborder.bmpskin_arrows=skin_arrows.gif
skin_arrows_shell=skin_arrows_shell.bmpskin_pushbtn=skin_pushbtn.gif
skin_radiobtn=skin_radiobtn.gif
skin_checkbtn=skin_checkbtn.bmp#for treeview
skin_tree=skin_tree.bmpskin_header=skin_header.bmp
skin_tab=skin_tab.gif#for trackbar
skin_tbslider_h=skin_tbslider_h.gif
skin_tbslider_v=skin_tbslider_v.gif
skin_trackbar_horz=skin_tb_horz.gif
skin_trackbar_vert=skin_tb_vert.gif#for progressbar
skin_progressbar_htrack=skin_pb_htrack.gif
skin_progressbar_vtrack=skin_pb_vtrack.gif
skin_progressbar_hchunk=skin_pb_htruck.bmp
skin_progressbar_vchunk=skin_pb_vtruck.bmp
#}}[fashion]
# Note that max number defined in source code is 5.
iconnumber=5
icon0=form.ico
icon1=failed.ico
icon2=help.ico
icon3=warning.ico
icon4=excalmatory.ico# default icons for new OpenFileDialogBox
dir=folder.ico
file=textfile.ico# default icons for TreeView control
treefold=fold.ico
treeunfold=unfold.ico# bitmap used by BUTTON control
radiobutton=fashion_radio_btn.bmp
checkbutton=fashion_check_btn.bmp# background picture, use your favirate photo
bgpicture=none
bgpicpos=center#window element metrics
caption=25
menu=25
border=1
scrollbar=17fgc_active_caption=0xFFFFFFFF
bgca_active_caption=0xFFE35400
bgcb_active_caption=0xFFFF953Dfgc_menu=0xFF000000
bgc_menu=0xFFFFE4BFfgc_msgbox=0xFF000000fgc_tip=0xFF000000
bgc_tip=0xFFFFFFFFfgc_active_border=0xFFC8D0D4
fgc_inactive_border=0xFFC8D0D4fgc_inactive_caption=0xFFF8E4D8
bgca_inactive_caption=0xFFDF967A
bgcb_inactive_caption=0xFFEBB99Dfgc_window=0xFF000000
bgc_window=0xFFEBB99Dfgc_3dbox=0xFF000000
mainc_3dbox=0xFFD8E9ECfgc_selected_item=0xFFFFFFFF
bgc_selected_item=0xFFC56A31
bgc_selected_lostfocus=0xFFD8E9ECfgc_disabled_item=0xFF99A8AC
bgc_disabled_item=0xFFFFFFFFfgc_hilight_item=0xFFFFFFFF
bgc_hilight_item=0xFFC56A31fgc_significant_item=0xFFFFFFFF
bgc_significant_item=0xFFC56A31bgc_desktop=0xFF984E00
./minigui_hello
Aborted
出现的情况:
- 配置[systemfont]
font_number=0 需要大于0- 配置了[cursorinfo] 没有配置[resinfo]
- 增加对应的资源文件, 如文件图标, 鼠标图标, 字体等等, 参考资源文件
# ls -l /usr/data -rw-rw-rw- 1 root root 8569 Mar 1 13:24 MiniGUI.cfg drwxrwxr-x 2 root root 3000 Mar 1 2020 bmp drwxrwxr-x 2 root root 3472 Mar 1 2020 cursor drwxrwxrwx 2 root root 1040 Mar 1 2020 font drwxrwxr-x 2 root root 1624 Mar 1 2020 icon -rwxrwxrwx 1 root root 13820 May 15 2025 minigui_hello
- 再次运行
效果如图:
参考
- 开始 MiniGUI 编程