MiniGUI 自定义控件教程5

MiniGUI编程速查表 前言 自己学习MiniGui也快一年了,粗浅的学习了一下,本文是根据《MINIGUI-PROG-GUIDE-V3.0-C》中的内容整理而来,根据自己的理解做了一些分类,大部分都是一些函数的说明,方便自己以后学习MiniGui时查阅。现在分享出来,供大家一起学习。当然在学习的过程中也遇到过一些坑,像自定义控件,主窗口透明背景,窗口弹出动画啊,控件动画等等,有时间也会分享出来。 1 窗口的创... 阅读详情

接着上次的教程继续。上次以ButtonEx控件的开发为例介绍了如果自己完全重新开始写控件,这次我以一个扩展单行编辑框控件为例介绍如何在原有控件的基础上扩展自定义功能(继承原有控件功能)。

一、功能确定

MiniGUI 原来的单行编辑框控件CTRL_SLEdit除了具有编辑框的基本编辑功能外,就提供了一个限制输入字符长度的功能。没有类似MFC中CEdit限制输入类型,字符还是数字,数字还可以限制范围(不过CEdit是在输入完之后才能判断的)。不过这些功能对于应用程序还是比较有用的。于是我决定在CTRL_SLEDIT的基础上扩展这些功能:

1、2种编辑模式:文本;数字。文本模式可以输入任意字符,数字模式只能输入0~9、+、-和小数点。

2、文本模式提供过滤输入字符的功能,能够指定屏蔽掉特定的字符;提供反向过滤功能,就是能够指定只允许输入特定的字符。

3、数字模式提供指定是否限定输入整数;并在此基础上提供指定输入范围功能。

二、概要设计

这里因为继承了CTRL_SLEDIT,所有只需专注控件的扩展功能就行了。要实现以上功能,最关键的就是在CTRL_SLEDIT接受到键盘输入之后,把输入显示到屏幕上之前,进行自己的过滤算法判定;当输入的是不符合用户设定的字符则截断,不发送给父类CTRL_SLEDIT处理(这样它就显示不出来了);当输入是符合用户设定的字符就发送给父类处理(这样它就能正常显示出来)。流程图如下:

Figure 1 
图 1 CTRL_SLEDIT流程图

1:EEXMODE_TEXT

文本模式能让用户指定不允许输入某些字符(过滤),还是只允许输入某些字符(反过滤)。不过注意,这里针对的是字符,而不是字符串。字符串又要麻烦很多了。这个模式我只是顺带做了一下,下面的数字模式才是比较实用的。(汉字是占2个字符[字节],所以这里MS也不能过滤了 -_-||)

2:EEXMODE_DIGITAL

首先数字编辑模式就只能输入’0~9’、’+’、’-‘、’.’这些字符。在此基础上能让用户选择能否输入小数,开启的话就能输入小数;关闭的话就能输入整数。还能让用户指定数值的输入范围(闭区间)。

三、详细设计

1:数据结构

SLEditEx? 的控件变量都是实例变量。控件变量数据结构我命名为EEXDATA:

typdef struct _eexdata_st
{
        ... ...
} EEXDATA;
typdef EEXDATA* PEEXDATA;


首先需要一个变量能保存当前的编辑模式。这里我没有使用控件本身的风格变量,因为父类CTRL_SLEDIT把那低16bit用得差不多了,我懒得去搅和了,自己拿一个变量来保存得了:

// 编辑模式定义
typedef enum _eexmode_en
{
        EEXMODE_TEXT,         // 文本编辑模式
        EEXMODE_DIGITAL,      // 数字编辑模式
        
} EEXMODE;

EEXMODE nMode;            // 编辑模式 


由于继承原有控件,所以控件数据占用了留给应用程序的dwAdditionalData1(附加数据1,忘记了怎么回事的赶快回头看教程2 ^_^),所以还要多加一个DWORD:

DWORD dwUserAddData; // 用户控件附加数据

文本模式需要一个标志来表示当前是过滤还是反过滤;我把过滤(反过滤)的字符存入一个静态字符数组中(不用动态链表了,那个麻烦,我把这个数组大小设置成512,应该够了):

char strFilterChar[EEX_MAXCHAR]; // 过滤字符串 BOOL bFilter; // 过滤模式标志

数字编辑模式也需要一个标志来表示当前是否允许输入小数;还需要2个浮点型来保存允许输入的最大值和最小值(浮点型可以表示整型的整数部分,但是整型就无法表示浮点型的小数部分了,所以要用浮点型)。如果设置的最小值大于最大值的话,我就把这种情况设计成不限制输入范围。这里我还多设计了一个范围的数据结构,其实为了下面的消息接口,因为一个消息只能传递2个参数,我把范围和允许输入小数的开关的设置放到一个接口里去了。但是这需要传递3个参数,所以我就弄了一个范围的数据结构出来,把2个参数整合成1个来传递。(其实完全可以用之前ButtonEx控件的那个钟传递参数的方法:1个参数传递控件变量指针,1个参数传递要设置的变量类型;不过这2个中传递方法我也说不上哪种好,哪种不好,我这里都用了,大家看自己喜欢了。其实MiniGUI原来的控件里也是这2种都用了的,例如:CTRL_LISTVIEW):

// 限定输入数字范围数据结构
typedef struct _eexrange_st
{
        double dMin;      // 最小值
        double dMax;      // 最大值
        
} EEXRANGE;
typedef EEXRANGE* PEEXRANGE;


double dMin;       // 允许输入最小值
double dMax;       // 允许输入最大值
BOOL  bInteger;    // 输入是否是整数标志


2:接口

注册和卸载的接口,之前的教程说过了的:

BOOL RegisterSLEditExControl (void);
BOOL UnregisterSLEditExControl (void);


消息为什么定义成下面这个样子,之前的教程也数过了的。这里为什么减去25咧。因为我的这些控件都是在一个工程里的,当然要防止消息定义冲突啦,我给之前的ButtonEx预留了25个消息。

#define MSG_EEXMBASE	 (0xEFFF-25)
#define MSG_EEXMXX      MSG_EEXMBASE – 1


1:设置控件附加数据。这个之前教程说过了的(我MS重复这句话很多次了-_-||):

DWORD* pdwAddData;
wParam = (WPARAM)pdwAddData;
lParam = 0L;

#define EEXM_SETADDDATA  MSG_EEXMBASE - 1


2:获取控件附加数据。和设置相对应:

DWORD* pdwAddData; 
wParam = (WPARAM)pdwAddData;
lParam = 0L;

#define EEXM_GETADDDATA  MSG_EEXMBASE - 2


3:设置当前编辑模式。

int nMode;
wParam = (WPARAM)nMode;
lParam = 0L;

#define EEXM_SETEDITMODE  MSG_EEXMBASE - 3


4:获取当前编辑模式。和设置对应,直接用返回值获取

wParam = 0;
lParam = 0L;

#define EEXM_GETEDITMODE  MSG_EEXMBASE - 4


5:设置数字模式下的编辑属性。包括是否允许输入小数,输入范围:

PEEXRANGE pRange; 
BOOL bInteger;
wParam = (WPARAM)pRange;
lParam = (LPARAM)bInteger;

#define EEXM_SETDIGITALRANGE  MSG_EEXMBASE - 5


6:获取数字模式下输入范围,和设置相对应,允许输入小数标志用返回值获取:

PEEXRANGE pRange;
wParam = (WPARAM)pRange;
lParam = 0L;

#define EEXM_GETDIGITALRANGE  	MSG_EEXMBASE - 6


7:设置文本编辑模式下过滤字符:

char* pstrFilter; 
BOOL bFilter;
wParam = (WPARAM)pstrFilter;
lParam = (LPARAM)bFilter;

#define EEXM_SETFILTERCHAR  	MSG_EEXMBASE - 7


8:获取文本模式过滤字符,和设置相对应,过滤标志用返回值获取:

char* pstrFilter; 
wParam = (WPARAM)pstrFilter;
lParam = 0L;

#define EEXM_GETFILTERCHAR  	MSG_EEXMBASE - 8


3:通知码

1:输入非法通知码。当输入不符合设置的规则时发送。这里定义成3是因为父类把0~2用掉了,这个要注意啊。

#define EEXN_INPUTINVALID 3

四、功能实现

1:文本模式过滤

这个功能实现起来很简单。就是拿当前输入的字符去和设置的过滤字符想比较可以了,在过滤字符里就不符合,不在就符合。这里说一下我在判断函数(EEX_ValidateInput)用到的一些strex开头的函数(像strexFind()、strexInsert()等)。这些strex开头的函数也是我自己写的,主要用于实现像CString里的一些常用的字符串操作功能,C语言原来的字符串操作函数很多功能没有,只好自己写了。具体的大家可以去看工程里include里的StringEx.h,这里我是打包成了另外一个库了的,里面还包括了一些常用的数据结构的C语言实现(链表、队列等)。大家其实完全可以自己实现的,我个人感觉我写的也不是特别好 -_-||,又需要的话我再放代码上来吧。

2:数字模式过滤

这里我判断的方法是:

1:首先拿当前输入和”0123456789-+.”比较,也就是说首先只允许输入0~9、-、+、.(如果设置了只能输入整数的话,则不允许输入.)。

2:对于通过了1的字符来说,只要再同时满足一下2个条件就是有效的数字: "-", "+"只能出现一次并且只能在第一个位置。 "."只能出现一次。

3:对于通过了2的字符来说,只需要再验证当前输入的数字是否在设置的范围内就完成了判断了。

我感觉我的方法应该还是对的,不知道大家还什么更好的方法没有 ^_^ 。不过这里有个小问题:就是在最后判断范围的时候,在判断下限的时候我使用整数判断。因为我是在显示到屏幕之前进行判断的,如果是小数的话会有问题。例如下限是1.5,本来用户是想输入1.7的,先输入的是1;如果是小数判断的话,1比1.5要小,不在范围内,就会被判定成不合法,从而屏蔽掉输入。所以这里我判断下限的时候采用了整数判断的方法,会造成下限范围设置成小数时,只能限制整数的问题,但总比不能输入要好,不知道大家有什么好办法解决没有。

五、注意问题

其实前面那些看代码也能明白,现在说说最关键的,就是继承父类控件需要注意的一些问题(同时也包括了实现本控件需要注意的一些问题 ^_^)。

1:调用父类过程处理函数

就是在自己的控件过程处理函数最后,把自己不处理的消息都转发给父类控件过程处理函数处理。这样才能享有父类控件原有的功能,而且这样才能叫得上“继承啊“。代码如下:

WNDCLASS EEXClass;

EEXClass.spClassName = CTRL_SLEDIT;
EEXClass.opMask = 0x00FF;
if (GetWindowClassInfo (&EEXClass) == FALSE)
return FALSE;

old_ctrl_proc 		= EEXClass.WinProc;

... ...

return (*old_ctrl_proc) (hCtrl, message, wParam, lParam);


至于获取时候的注意事项,忘记了的要回头去看教程2了哦。然后继承的方式也需要在使用前注册,使用完成后卸载,也是只能使用CreateWindow()来创建,方法和教材4中的一样。

2:为每份控件实例保存数据

这个上面也提到了的,方法和教程2的一样,要用附加数据1保存,然后自己多加一个DWORD的变量出来提供给外部应用程序使用即可。

3:其它

1:判断输入消息选用MSG_CHAR。为什么选用这个,而不用MSG_KEYDOWN呢。因为MSG_CHAR是经过字符翻译了的。我们的控件判断只关心有意义的字符,像delete、insert、home、pageup、pagedown、left、right、up、down之类的我们根本不用管。正好MSG_CHAR是不会翻译这些按键消息的 ^_^。

2:有关MSG_GETDLGCODE。还记上次教程我说过控件在dialog中要想正确获取按键所有就要处理这个消息的吗。没错像编辑框这种控件确实是要正确处理这个消息才能正确的获取所有的键盘输入。但是这里我建议大家不要画蛇添足,因为父类已经帮我们处理,直接把这条消息扔给父类的处理函数就行了。

3:编辑框控件有个能用鼠标选中一串字符然后用输入的字符代替掉选中字符的功能。这个功能在数字模式下要进行特别的处理,这个、这个大家还是看我代码吧,这里不好说呢 ^_^ 。

六、总结

好了,我觉得需要注意的就是这么多了,其它的大家看代码就OK了。其实扩展原有控件类(继承)的方法和自己重新开始写,大体上来说基本类似,就是注意下以下的问题就行了:

1:最后调用的父类处理函数。继承的当然是调用父类的啦(注意获取父类处理函数的注意事项);自己重新开始写是调用 DefaultControlProc? ()。

2:注意一些已经被父类用掉了的资源。像保存实例数据变量的附加数据,风格变量、通知码等。扩展的需要注意,重新写的就不用在意啦,放心用 ^_^。所以大家在写自己的自定义控件的时,一开始就确定好,到底是继承还是重新开始写。

好,到这里MiniGUI2.0版本以前本人会的自定义控件的方法就全部介绍完了。据说3.0的自定义控件的方法比2.0的简单了很多,更接近于OOP。但是本人最近一直没什么时间用3.0,所以只好“落伍“一下了 -_-||。 我写的ControlEx中还有2个扩展控件:进度条和滚动显示。后面的教程都只是说我写的这些控件的具体实现的了,就不说MiniGUI自定义控件的方法了。

哎,2月3号的起的头,又拖到8号才写完。发现我越来越懒了,杯具 -_-|| 。

参考资料:飞漫MiniGUI编程指南2.0.4


原始出处:飞漫wiki(原作者就是我)

MiniGUI软件架构  MiniGUI从技术架构上包括几个模块:输入抽象层(IAL)、输出抽象层(GAL)、消息模块、窗口模块、图形设备接口模块(GDI)及MiniGUI组件。其架构图如下:  1. 图形抽象层和输入抽象层  在MiniGUI 3.0版本的开发中,引入了图形抽象层(Graphics Abstract Layer)和输入抽象层(Input Abstract Layer)的概念。抽象层的 阅读详情

相关推荐

快速搭建MiniGUI图形界面开发环境

本文还有配套的精品资源,点击获取 简介:MiniGUI安装包由北京飞漫软件技术有限公司开发,是一个稳定的跨平台图形库,支持多种操作系统,特别是适用于嵌入式设备和小型系统。它提供完整的图形用户界面支持,包括窗口管理、事件处理和图形绘制等。开发者能够通过一系列简单步骤快速安装和配置MiniGUI,并使用其丰富的API来构建交互式应用程序。本文将介绍MiniGUI的安装过程,包括...

weixin_35257663的博客 1886

Linux成功安装minigui教程(最详细)

Linux成功安装minigui教程(最详细)

qq_51643989的博客 3252

MiniGUI 按键切换图片,背景图片,控件透明。

代码实现了MiniGUI的模拟触摸屏,按键切换图片,控件透明,适合新手欢迎下载,评论,讨论。

MiniGUI 自定义控件教程4

接着上次的教程继续。上次介绍了ButtonEx控件的设计,这次介绍ButtonEx的具体实现。这里我不打算说C语言的语法和简单的MiniGUI API调用,我就只说一些需要注意的问题。因为我认为这些才是大家真正需要了解的。 注册类 不管你是自己完全重新开始写控件类,还是继承现有的控件类。自己的控件类被外部程序使用前就必需要注册(通常是应用程序初始化的时候)。我目前还没深

mingming_killer的专栏 2952

Minigui界面编辑器

在网友的minigui uidesigner 2.0 基础上修改了界面 变成3.0版 具体功能: 可视化的minigui界面编辑器

独立游戏开发者必看:STEAM税务信息更新全流程(附中国区避坑指南)

本文为独立游戏开发者详细解析了Steam税务信息更新的全流程,重点针对中国区开发者提供了避坑指南。文章深入解释了W-8BEN表格的填写要点,并指导如何准备个人所得税纳税记录和身份证等核心证明文件,以确保顺利通过审核,避免收入被预扣税款。

tcp8optimizer的博客 1281

minigui 自定义按键

本类按键是在静态框基础上增加了MSG_MOUSEMOVEIN(鼠标移入和移出窗口)和MSG_LBUTTONUP(鼠标在窗口松手)两个消息,通过发送NotifyParent消息给控件实现自定义控件消息,类似于静态框的超类。同样可以修改源码调用源码API将其他消息交给原控件完成,实现控件的超类。

livesflying的博客 3126

tcllib2.0 package - csv

tcl lib 的csv库

shin 859

MiniGUI 自定义控件教程7

接着上次的教程继续。这次给大家介绍的是界面美观的进度条控件。它功能上和MiniGUI原有的进度条控件(CTRL_PROGRESSBAR)是一样的(其实进度条也就是那些功能,哪还能整出别点什么花样哦)。 一、功能确定 1:要具有MiniGUI原有进度条控件的所有功能,像设置范围,设置步进值,设置当前位置等;垂直、水平风格;还有一些通知码。因为本控件的主要目的是美观,但是这要保

mingming_killer的专栏 1818

Stata: 空间面板数据模型及Stata实现

  作者:游万海 (福州大学) Stata 连享会: 知乎 | 简书 | 码云 | 优快云   来源:Golgher 和 Voss (2016)   1. 背景介绍 由于面板数据模型所具有的众多优点 (刻画个体异质性,减弱模型共线性和增加自由度等),其被广泛应用于实证计量中。在 「 Stata: 面板数据模型-一文读懂」 文中,我们已对面板数据模型进行了介绍。 然而,当研究样本涉及到多个...

Stata连享会 7万+

NVMe与PCIe的完美结合:高速存储背后的技术解析

本文深入解析了NVMe与PCIe技术如何完美结合,实现高速存储性能的飞跃。从机械硬盘到NVMe SSD的进化历程出发,详细介绍了PCIe总线的高带宽优势与NVMe协议的低延迟设计,以及两者协同工作带来的显著性能提升。通过实测数据对比,展示了NVMe SSD在消费级和企业级应用中的卓越表现,并提供了选购与优化建议。

weixin_29216353的博客 376

在miniGUI中增加自定义控件

本文转载于:http://www.minigui.org/cgi-bin/lb5000/topic.cgi?forum=25&topic=1514 本人初学MiniGUI,现将在miniGUI中增加自定义控件的学习心得整理出来。目的是抛砖引玉,共同提高。以增加一个Chart控件为例(目前我试验的此控件实际是一个复制的static控件). 一、命名规则:1. 预定义宏_CTRL_CHAR

杨哈哈的专栏 1345

gem5 run parsec2.1 ---- 亲测跑通教程

使用gem5模拟仿真parsec2.1,排除了各种bug,成功跑通,亲测有效!!!

m0_55539563的博客 1545

minigui[基础篇][5]—— 控件与控件类

minigui手册阅读

qq_43601873的博客 1035

华为OD机考双机位C卷 - 区间交集(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 区间交集

算法大师! 1136

LPDDR6来了!到底比LPDDR5/5X强在哪?从速度到总线,技术细节一次说清!

LPDDR6不仅仅是速度快点、位宽大点那么简单,它是一次架构级的革新,从引脚、总线、时钟管理到Burst协议全部升级。🎯我们正在迈入一个“AI优先”的时代,内存架构也必须跟上。对于做芯片、做整机、做系统的你,理解LPDDR6的技术变化,提前规划测试方案,是现在就该启动的动作!

weixin_43199439的博客 1284

MiniGui Samples运行效果

本文主要是mingui里面的例子效果图,方便自己以后根据效果,有针对性的学习,例子是在ubuntu14.04使用qvfb运行的,如果有同学不知道怎么在ubuntu上运行例子程序,可以参考我上一篇文章《Ubuntu 64位移植MiniGui》

逐梦的博客 9247

自定义模型训练——打造专属OpenClaw模型(2026AI版)

本文介绍了OpenClaw自定义模型训练的核心流程,包括框架选择(PyTorch、TensorFlow、HuggingFace和原生OpenClaw框架)、训练环境搭建脚本、以及数据收集系统的设计。数据收集器支持从数据库、API、文件和网络等多种来源获取训练数据,并提供灵活的过滤机制确保数据质量。通过这套系统,开发者可以高效准备训练数据,为后续模型训练打下坚实基础。

博客 875

minigui编程基础知识

一、minigui的各控件的风格、消息可见各控件的头文件。如static.h; 二、minigui的控件标示符,除预定义的几个外,使用中都需用户自己在创建控件时指定。 预定义的几个控件标示符可见window.h,如下: /* Standard control IDs */ #define IDC_STATIC    0 #define IDOK          1 #define I

小虾米就是我喽 1640

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

MiniGUI原理分析 控件

五.控件分析 5.1 控件管理的基本数据结构 typedef struct _CTRLCLASSINFO { char name[MAXLEN_CLASSNAME + 1];// class name /* * common properties of this class */ DWORD dwStyle;

lieye_leaves的专栏 1502

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

MiniGUI学习笔记

第一章.嵌入式GUI系统概述关于操作系统和上层软件的关系,某些操作系统被称为内核空间(kernel space),而操作系统以上的部分被称为用户空间(user space)。按照功能,操作系统以上的部分可以分为中间件和上层应用两个部分。中间件一般提供了一些相对底层的软件层次的功能。它的实现一般不包括应用程序的逻辑,而是向上层软件提供了各种方便的应用程序接口(API)。GUI系统的移植实现基础包含输出设备和输入设备两个方面       在学习一个嵌入式GUI特性和功能的时候,需要关注可移植性、稳定性和可靠性、

huangxin8707的专栏 2692

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【转】minigui的窗口

<br />minigui中的Windows <br /> 图形编程中,窗口是一个重要的概念,窗口其实是一个矩形框,应用程序可以使用其从而达到输出结果和接受用户输入的效果。窗口系统(Window System)界于操作系统层次之上,它是一个软件系统,负责把显示屏幕分隔为不同的部分来帮助用户管理和控制不同的显示环境,它提供基于窗口的工作模式。在Linux上面,X就是一个典型的窗口系统吧。   在MiniGui中有三种窗口类型:主窗口,对话框和控件窗口。主窗口作为应用程序的主界面或开始界面。子窗口通常是控件窗口

qp314的专栏 1304

MiniGUI源码分析-- 开始篇

背后的故事 从接触MiniGUI到现在已经5年了,在飞漫也工作了4年多。由于种种原因,加上android的冲击,minigui越来越式微。让人感觉很痛心。 如今赋闲在家,无所事事,正好利用年末和春节这段时间,把这几年来对minigui所做、所想、所悟分享出来,一来,对以往的工作做个总结; 二来趁minigui即将开源之际,对minigui推波助澜;三来,希望把这款优秀的开源软件介绍给大家,希

doon的专栏 1万+

基于linux的MiniGUI简介

MiniGUI是由北京飞漫软件技术有限公司创办的开源Linux图形用户界面支持系统,经过近些年的发展,MiniGUI已经发展成为比较成熟的性能优良的、功能丰富的跨操作系统的嵌入式图形界面支持系统。“小”是MiniGUI的特色,它目前已经广泛应用于通讯、医疗、工控、电子、机顶盒、多媒体等领域。目前,MiniGUI的最新版本为MiniGUI 3.0,所以MiniGUI对中文的支持最好。它支持GB231

yyt7529的专栏 2331

全志 Tina Linux 图形系统 框架介绍 最全介绍 MiniGUI、QT5、EFL、GTK+(WebkitGtk、Midori)、DirectFB、Wayland

本文档将介绍 Allwinner Tina Linux 中已经移植好的窗口系统,以及怎么使用,包括MiniGUI、QT5、EFL、GTK+(WebkitGtk、Midori)、DirectFB、Wayland,整体结构如下:适用范围:Tina Linux v3.5及以上版本。

韦东山嵌入式专栏 8617

MiniGUI 使用TTF字体

 矢量字体的配置和使用如下 :       1、    编译配置(使MiniGUI支持矢量字体):               ( 1 )下载并安装Freetype1               ( 2 ) MiniGUI 编译时,打开configure相应的配置选项:--enable-ttfsupport                           (注: 如果没有安装Freetype1

salsabachata的专栏 6245
上一篇: MiniGUI 自定义控件教程4
下一篇: MiniGUI 自定义控件教程6
mingming_killer
博客等级 码龄19年 18粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值