当前位置: 首页 > ds >正文

Buildroot 移植MiniGUI: 编写简单示例(基于君正X2000)

在这里插入图片描述

概述

上一篇文章: Buildroot 移植MiniGUI, 在编译打包完文件系统后, 编写一个Demo进一步验证MiniGUI的功能.

目标平台:

CPUX2000
架构mips
内存128MB
存储256MB
LCD600*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配置文件

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

    # ./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

## 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出现的情况:

  1. 配置[systemfont]
    font_number=0 需要大于0
  2. 配置了[cursorinfo] 没有配置[resinfo]
  1. 增加对应的资源文件, 如文件图标, 鼠标图标, 字体等等, 参考资源文件
    # 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 编程
http://www.xdnf.cn/news/7086.html

相关文章:

  • STM32 | FreeRTOS 消息队列
  • Vue:数据双向绑定
  • 强化学习笔记(一)基本概念
  • 存储系统01——存储系统框架
  • C++ 蓝桥 STEMA 真题模拟测试卷一(选择题)
  • Diffusion模型入门指南:从零开始理解AI图像生成
  • 数字化转型- 数字化转型路线和推进
  • 刘家祎双剧收官见证蜕变,诠释多面人生
  • 记录:echarts实现tooltip的某个数据常显和恢复
  • 哈希表(2):
  • 校园导游大模型介绍
  • 微积分基本规则及示例解析
  • 【爬虫】DrissionPage-5
  • 第九届御网杯大赛赛题资源加解题思路
  • 手撕I2C和SPI协议实现
  • 豆粕ETF投资逻辑整理归纳-20250511
  • Centos7.9同步外网yum源至内网
  • 山东大学计算机图形学期末复习9——CG12上
  • 【部署】读取excel批量导入dify的QA知识库
  • 【Changer解码头详解及融入neck层数据的实验设计】
  • Fidder基本操作
  • Spring Initializr快速创建项目案例
  • Spark,连接MySQL数据库,添加数据,读取数据
  • Foupk3systemX5OS邮箱上线通知
  • Cadence Allegro安装教程及指导
  • Almalinux中出现ens33 ethernet 未托管 -- lo loopback 未托管 --如何处理:
  • JWT令牌验证
  • 45、简述web.config⽂件中的重要节点
  • Leaflet使用SVG创建动态Legend
  • 文件读取漏洞路径与防御总结