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

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_PROCESSES
        JoinLayer (NAME_DEF_LAYER , "helloworld" , 0 , 0);
        #endif
        
        CreateInfo.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

mk 复制代码
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配置文件

  1. 尝试运行前面编译的程序:

    bash 复制代码
    # ./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 文件:

    1. 在当前工作目录中查找 MiniGUI.cfg 文件。如果没有找到,
    2. 在当前用户的主目录中查找 .MiniGUI.cfg 文件(这是一个隐藏文件)。如果没有找到,
    3. /usr/local/etc/ 目录中查找 MiniGUI.cfg。如果没有找到,
    4. 最后在 /etc/ 目录中查找 MiniGUI.cfg
  2. 增加MiniGUI.cfg 参考MiniGUIUserManualRuntimeConfiguration.md

cfg 复制代码
## 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-1


default=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=0xFF6A240A

fgc_menu=0xFF000000
bgc_menu=0xFFCED3D6


fgc_msgbox=0xFF000000

fgc_tip=0xFF000000
bgc_tip=0xFFE7FFFF

fgc_active_border=0xFFCED3D6
fgc_inactive_border=0xFFCED3D6

fgc_inactive_caption=0xFFC8D0D4
bgca_inactive_caption=0xFF808080
bgcb_inactive_caption=0xFF808080

fgc_window=0xFF000000
bgc_window=0xFFFFFFFF

fgc_3dbox=0xFF000000
mainc_3dbox=0xFFCED3D6

fgc_selected_item=0xFFFFFFFF
bgc_selected_item=0xFF6B2408
bgc_selected_lostfocus=0xFFBDA69C

fgc_disabled_item=0xFF848284
bgc_disabled_item=0xFFCED3D6

fgc_hilight_item=0xFFFFFFFF
bgc_hilight_item=0xFF6B2408

fgc_significant_item=0xFFFFFFFF
bgc_significant_item=0xFF6B2408

bgc_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=0xFF000000

fgc_inactive_caption=0xFF000000
bgca_inactive_caption=0xFFFFFFFF
bgcb_inactive_caption=0xFFFFFFFF

fgc_menu=0xFF000000
bgc_menu=0xFFD8D8D8

fgc_msgbox=0xFF000000

fgc_tip=0xFF000000
bgc_tip=0xFFE7FFFF

fgc_active_border=0xFF000000
fgc_inactive_border=0xFF848284

fgc_window=0xFF000000
bgc_window=0xFFFFFFFF

fgc_3dbox=0xFF000000
mainc_3dbox=0xFFFFFFFF

fgc_selected_item=0xFFFFFFFF
bgc_selected_item=0xFF000000
bgc_selected_lostfocus=0xFFBDA69C

fgc_disabled_item=0xFF848284
bgc_disabled_item=0xFF000000

fgc_hilight_item=0xFFFFFFFF
bgc_hilight_item=0xFF664E4A

fgc_significant_item=0xFFFFFFFF
bgc_significant_item=0xFF000000

bgc_desktop=0xFFC08000

flat_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=17

fgc_active_caption=0xFFFFFFFF
bgca_active_caption=0xFFE35400
bgcb_active_caption=0xFF686868

fgc_menu=0xFF000000
bgc_menu=0xFFD4D6FF

fgc_msgbox=0xFF000000

fgc_tip=0xFF000000
bgc_tip=0xFFFFFFFF

fgc_active_border=0xFFC8D0D4
fgc_inactive_border=0xFFC8D0D4

fgc_inactive_caption=0xFFF8E4D8
bgca_inactive_caption=0xFFDF967A
bgcb_inactive_caption=0xFF686868

fgc_window=0xFF000000
bgc_window=0xFFFFFFFF

fgc_3dbox=0xFF000000
mainc_3dbox=0xFFD8E9EC

fgc_selected_item=0xFFFFFFFF
bgc_selected_item=0xFFC56A31
bgc_selected_lostfocus=0xFFD8E9EC

fgc_disabled_item=0xFF99A8AC
bgc_disabled_item=0xFFFFFFFF

fgc_hilight_item=0xFFFFFFFF
bgc_hilight_item=0xFFC56A31

fgc_significant_item=0xFFFFFFFF
bgc_significant_item=0xFFC56A31

bgc_desktop=0xFF984E00

skin_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.bmp

skin_arrows=skin_arrows.gif
skin_arrows_shell=skin_arrows_shell.bmp

skin_pushbtn=skin_pushbtn.gif
skin_radiobtn=skin_radiobtn.gif
skin_checkbtn=skin_checkbtn.bmp

#for treeview
skin_tree=skin_tree.bmp

skin_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=17

fgc_active_caption=0xFFFFFFFF
bgca_active_caption=0xFFE35400
bgcb_active_caption=0xFFFF953D

fgc_menu=0xFF000000
bgc_menu=0xFFFFE4BF

fgc_msgbox=0xFF000000

fgc_tip=0xFF000000
bgc_tip=0xFFFFFFFF

fgc_active_border=0xFFC8D0D4
fgc_inactive_border=0xFFC8D0D4

fgc_inactive_caption=0xFFF8E4D8
bgca_inactive_caption=0xFFDF967A
bgcb_inactive_caption=0xFFEBB99D

fgc_window=0xFF000000
bgc_window=0xFFEBB99D

fgc_3dbox=0xFF000000
mainc_3dbox=0xFFD8E9EC

fgc_selected_item=0xFFFFFFFF
bgc_selected_item=0xFFC56A31
bgc_selected_lostfocus=0xFFD8E9EC

fgc_disabled_item=0xFF99A8AC
bgc_disabled_item=0xFFFFFFFF

fgc_hilight_item=0xFFFFFFFF
bgc_hilight_item=0xFFC56A31

fgc_significant_item=0xFFFFFFFF
bgc_significant_item=0xFFC56A31

bgc_desktop=0xFF984E00

./minigui_hello
Aborted出现的情况:

  1. 配置[systemfont]
    font_number=0 需要大于0
  2. 配置了[cursorinfo] 没有配置[resinfo]
  1. 增加对应的资源文件, 如文件图标, 鼠标图标, 字体等等, 参考资源文件

    bash 复制代码
    # 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
  2. 再次运行

效果如图:

参考

  1. 开始 MiniGUI 编程
相关推荐
ansondroider2 天前
Buildroot 移植MiniGUI
移植·buildroot·minigui
ansondroider3 个月前
Buildroot 添加自定义模块-内置文件到文件系统
linux·buildroot
core5125 个月前
Flink SQL Cookbook on Zeppelin 部署使用
flink·notebook·zeppelin·示例·手册
家有工程师6 个月前
OpenCPN-插件之Dashboard Tactics
buildroot·opencpn·wxwidgets-3.2.2
Amd7948 个月前
Nuxt.js 应用中的 app:redirected 钩子详解
认证·日志·nuxt.js·ssr·重定向·钩子·示例
Amd7948 个月前
Nuxt Kit 的使用指南:从加载到构建
typescript·配置·nuxt·加载·构建·示例·kit
Amd7949 个月前
清除 Nuxt 状态缓存:clearNuxtState
缓存·组件·nuxt·管理·状态·示例·清除
不被定义的程序猿1 年前
【RV1126】Ubuntu22.04下sdk编译问题汇集
边缘计算·buildroot·瑞芯微·ubuntu2204
政安晨1 年前
政安晨【TypeScript高级用法】(二):泛型与命名空间
前端·javascript·typescript·cocos·泛型·命名空间·示例