MiniGUI 自定义控件教程6

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

接着上次的教程继续。之前就已经介绍完MiniGUI 2.0以前本人掌握的自定义控件的方法了(3.0的好像不太一样了呢,目前本人还没研究过)。恩,让我们来回顾下先:

1、对已经创建了的控件实例进行子类化。

2、对某个控件的子类进行子类化;这个又可以分为针对某个已有的控件(继承父类,类似之前的SLEditEx),重新自己写(继承自最顶层的DefaultControl,类似之前的ButtonEx)。

这里主要是把ControlEx工程中剩下的2个自定义控件RollShow和ProgressBarEx的实现过程也介绍下,这里都是采用第2种方法。

一、功能确定

滚动控件,顾名思义,就是像街上某些广告牌一样,能将一条字符串信息在指定的空间内滚动的显示。我这里是学习目的,所以功能上就简化些:

1:控件自定判断当前的字符能否在当前的矩形空间里显示完全,能则正常显示,不能则滚动显示。

2:滚动只要从右到左滚动就可以,能够持续的滚动,直到显示的字符串改变能够在空间内完整显示为止。

最终效果见下图:

Figure 1 
图 1 CTRL_ROLLSHOW效果图

二、概要设计

我把控件取名为CTRL_ROLLSHOW,自己重新写(继承顶层的DefaultContorl)。因为它主要就是一些显示功能,MiniGUI原有的控件的一些功能也不能有效的“帮上什么忙”,所以选择自己重新写,这样灵活性还高些。

三、详细设计

1:数据结构

ROLLSHOW的主要是用来显示字符串,我设计成控件只保存当前显示字符串的指针,这样外部可以方便的修改,而且控件也无需管理字符串的缓冲空间。滚动的效果用定时器来实现,本来我是想设计成所有的ROLLLSHOW控件只创建一个定时器来管理滚动效果的,不过我发现这样以我目前的水平来实现有些困难。所以我弄成每一个ROLLSHOW实例都自己创建一个定时器,这里要注意下,MiniGUI有限定thread下一个应该用程序最多只能创建16个定时器(这个和MiniGUI的内部实现有关)。不过其实也不要紧,因为一般这个ROLLSHOW控件在显示的界面中不会创建好很多个的,所以这个方案也凑活行得通了^_^ 。用一个int来保存滚动的速度(定时器的间隔)。然后用2个变量分别保存当前的文字显示颜色和背景颜色。最后用一个RECT变量来保存当前文本滚动的区域:

// RollShow 数据数据结构
typedef struct _rsdata_st
{
        char* pstrText;          // 显示字符串指针
        
        int nStep;              // 滚动步长
        int nTimerSpeed;  	    // 定时器时间
        
        gal_pixel pixelText;       // 文本颜色
        gal_pixel pixelBk;        // 背景颜色
        
        
        RECT rcText;            // 文本显示区域
        
} RSDATA;
typedef RSDATA* PRSDATA;


2:接口

注册和卸载的接口,老规矩了:

BOOL RegisterRollShowControl (void);
BOOL UnregisterRollShowControl (void);


消息为什么定义成下面这个样子,也是老规矩了的,25*2是因为之前已经有了2个自定义控件了。

#define MSG_RSMBASE	  (0xEFFF-25*2)
#define MSG_RSMXX          MSG_RSMBASE – 1


1:设置控件数据。这个和ButtonEx的设计思路一样了:

#define RS_TEXT 		0x00000001L
#define RS_COLOR 		0x00000002L
#define RS_SPEED 		0x00000004L
#define RS_ALL 		((RS_TEXT) | (RS_COLOR) | (RS_SPEED))

#define RSM_SETDATA  MSG_RSMBASE – 1


2:获取控件数据。和设置相对应:wParam传入获取PRSDATA,lParam传入需要获取的变量:

#define RSM_GETDATA  MSG_RSMBASE - 2

3:通知控件显示字符串已被修改。这个消息用于让控件重新计算当前显示字符串的空间,重新判断是否要滚动显示:

#define RSM_TEXTMODIFIED 	MSG_RSMBASE - 3

3:通知码 本控件目前不需要通知码。

四、功能实现

这里最主要的就是滚动的动态功能实现了。这里如果要用自己方法弄也可以,但是既然我们用的MiniGUI,咋要就要好好挖掘MiniGUI的API,这个时候你就会发现MiniGUI有几个API为ROLLSHOW的实现提供了很好的解决办法。一个是GetTextExtent()、一个是DrawText()。GetTextExtent能够计算出给定字符串在指定的DC中输出所需要的空间大小,这个API可以用来实现判断当前字符串是否需要滚动显示的功能。

DrawText? 是在给定的一个RECT空间内按照预定的几种对齐格式进行文本输出。好了,先来让我们想象一下——拿一张白纸,然后再拿一张上面写了字的白纸;然后以一定的速度拿着写了字的白纸从没有字的白纸上从右到左的移动。OK,我们看到了什么——这个就是我们要的滚动效果啊。那张没字的白纸就相当于控件的客户区,有字的白纸就相当于DrawText中指定的RECT空间,我只要在定时器中以一定的速度改变这个RECT的位置就可以实现滚动功能了。我这里只是调用这些上层的API而已,剩下的事情就交给MiniGUI解决吧 ^_^。想象能力差点的,请看下面的图,黑色的矩形表示控件客户区,红色的矩形表示显示文本的DrawText的RECT空间:

Figure 2 
图 2 滚动效果实现图

五、注意问题

那些自定控件实现方法需要注意的问题我前面的教程已经说过了,这里说下专门针对实现本控件需要注意的问题吧。我认为这里需要注意点的问题,第一个前面的说的定时器数量的问题,我用的MiniGUI版本的thread模式最多只能同时存在16个,这个在使用的时候需要注意,不过创建太多的本控件实例就没啥问题。 第二个就是控件的背景透明问题。如果是父窗口没有使用背景图片的,就把控件的背景颜色设置成父窗口的背景颜色就行了。如果父窗口使用了背景图片的,也好办,使用CreateWindowEx创建控件实例并指定WS_EX_TRANSPARENT风格也可以解决问题。


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


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


MiniGui开发问题锦集 前言 本文记录了我学习MiniGui开发过程中遇到的一些有意思问题与解决方法,会随着我学习的深入慢慢的更新下去。文章中窗口指的是通过CreateMainWindow创建的窗口,控件是指CreateWindow或CreateWindowEx创建的控件。 1 创建透明背景窗口 方法一:窗口创建时,在界面的窗口过程函数里添加MSG_ERASEBKGND监听,什么也不画就是透明背景,这种方法有... 阅读详情

相关推荐

Minigui 的使用手册

Minigui 的使用手册,libminigui的特性说明书

MiniGUI 自定义控件教程3

接着上次的教程继续。之前介绍了子类化已有的控件实例的方法,现在介绍子类化类和完全自己重新开始写控件类的方法。这个2种区别就是:子类化类,其实就是OOP里的继承,继承一个已有的控件类,在其基础上作扩展。完全自己重新开始写控件类是我自己的叫法,可以理解为MFC(我个人对MFC相对来说熟悉些,就拿这个做类比了)里的继承自CObject。 这次先介绍完全自己重新开始写控件类的方法。这里我以我自己写的一个M

mingming_killer的专栏 3948

基于STM32的可穿戴式多生理参数实时监测与预警系统

针对传统可穿戴健康设备存在的生理参数监测种类单一、数据处理依赖云端导致响应滞后、续航能力弱等问题,设计一种基于STM32的可穿戴式多生理参数实时监测与预警系统。系统以STM32L476RG低功耗微控制器为核心,集成心率血氧传感器、体温传感器、血压传感器,实现人体心率、血氧饱和度、体温、收缩压/舒张压的同步采集;通过边缘端轻量化数据处理算法完成参数异常判定,结合低功耗硬件设计与软件休眠策略,在保证监测精度的同时延长续航。测试结果表明,系统心率监测误差≤2次/分钟,血氧饱和度误差≤2%,体温误差≤±0.2℃,血

m0_74026776的博客 2039

MiniGUI学习整理

Ministudio开发miniGUI指南 --目录-- 1.概念 2.搭建Windows下Ministudio开发环境 3.Ministudio使用指导 4.ubuntu12.4上安装minigui3.0.12教程 5.Windows下ministudio开发程序移植到Ubuntu 6.常见错误及解决放法 1.概念 1.1 miniGUI是啥? MiniGUI 是一个自由软...

liuxiaoxiaocsdn的博客 1万+

生成式引擎优化(GEO)的概念与技术路径

生成式引擎优化(GEO)是针对生成式AI引擎的新型优化策略,旨在提升内容在AI搜索与问答平台中的可见性和可信度。与传统SEO相比,GEO更注重语义理解、知识图谱和多模态生成等技术,通过优化内容的结构化和平台适配性,使品牌信息在生成式AI中更易被采纳和呈现。其核心技术包括语义理解、向量数据库和实时反馈优化等,应用于品牌传播、智能客服和个性化推荐等领域。随着AI技术发展,GEO将向智能化、自动化方向演进,成为内容优化的重要工具。

Baixue5209的博客 1047

Oracle到金仓数据库信创改造迁移实施规划方案

**性能测试和优化**:对金仓数据库的性能进行测试,根据业务负载情况进行必要的调优,确保系统能够稳定高效运行。- **数据兼容性**:评估Oracle数据库中的数据结构和金仓数据库的兼容性,明确需要重构的数据模型。- **性能测试**:通过对金仓数据库的性能测试,预估在实际业务环境下的表现,是否能达到业务需求。- **工具选择**:选择适合的迁移工具,如金仓数据库提供的迁移工具,能够提升迁移效率和准确性。- **全面迁移**:在初步迁移成功后,进行全面数据迁移,确保所有数据完整迁移到金仓数据库上。

hdrhdrjdididrr的博客 480

MiniGUI 自定义控件教程7

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

mingming_killer的专栏 1818

手把手教你搞定CAC会议投稿:从LaTeX模板到PDF eXpress避坑全流程

本文详细解析CAC会议投稿全流程,重点介绍LaTeX模板调整、Turnitin查重技巧及PDF eXpress校验避坑指南。通过实战案例和代码示例,帮助研究者高效完成IEEE格式论文投稿,避免常见技术性失误,提升投稿成功率。

weixin_29969209的博客 397

MiniGui Samples运行效果

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

逐梦的博客 9247

外设测试 - ATAES132A 加解密芯片测试

原理 使用芯片官方提供的读写操作库,进行先写后读并校验,确认数据一致。 示例代码 int main(void) { uint8_t ret; aes132p_enable_interface(); ret = write_memory_test(); if (ret != AES132_FUNCTION_RETCODE_SUCCESS) { aes132p_disable_interface(); printf

一个软件工程师的技术笔记 858

卸载python弹框报错:Could not set file security for file ‘D:\Config.Msi\abd5.rbf‘. Error: 5. Verify...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 6479

MiniGUI 自定义控件教程2

控件功能确认 咋接着上次的教程继续。这次我们依托一个例子来说明如何使用MiniGUI中的第一种方法(也就是子类化已经创建的控件实例)。假设我们的例子是:某个学校的某个年级的某些班在某个时间搞了某次考试 -_-|| 。考试过后经老师研究决定把考试成绩按班为单位分成3个分数段:差、中等、好。现在咱们就要用MiniGUI来整一个统计图来直观的显示这个3个分数段的学生比例。但是有几个班就有几个统计图

mingming_killer的专栏 1878

OBYC自动科目确定整理

WGI是用来重估发货的,通过比较发货时的价格和最新计算的价格,以此将所有差异过账到分配给此事务码的总账科目。是工厂还是公司,一般项目中都是使用工厂,使用工厂的意思就是物料在每个工厂下有一个价格,如果使用公司,则一个公司下的所有工厂都使用一个价格。如果该物料用的是移动平均价,那么该库存依然还存在的情况下,这个价格差异会过账到存货科目上而不会过账到存货的价格差异科目上。用于确定存货评估过账的存货冲抵科目。事务码WGR是用来重估工厂收货的,根据 计算出来的价格差异,把库存的调整过账分配给这个事务码中的总账科目。

nopicture的博客 348

MiniGUI 自定义控件教程1

前言: MiniGUI 采用的机制是与win32十分类似的消息机制,基本上与win32的sdk一致。win32上经典的Framework MFC 采用的是C++,面向对象的方法,自定控件可以直接使用继承的方式,十分方便。MiniGUI 使用的是c语音,重所周知这是一个面向过程的语言。但是其实它也可以使用类似c++的面向对象的思想(详细的可以看一本叫做 《Object-Oriented P

mingming_killer的专栏 2061

基于coze studio开源框架二次定制开发教程

CozeStudio是一站式AIAgent开发工具,支持大模型接入、智能体编排、工作流开发等功能。采用Golang+React技术栈,基于微服务架构设计。项目包含后端API、领域逻辑、前端应用等模块,支持自定义任务流节点开发。开发流程涵盖前后端节点定义、实现逻辑编写等步骤,提供完整的开发规范和参考文档。相比商业版,开源版本在功能上有所精简,但仍保留核心开发能力。

coding change your life 790

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

MiniGUI 自定义控件教程5

接着上次的教程继续。上次以ButtonEx控件的开发为例介绍了如果自己完全重新开始写控件,这次我以一个扩展单行编辑框控件为例介绍如何在原有控件的基础上扩展自定义功能(继承原有控件功能)。 一、功能确定 MiniGUI原来的单行编辑框控件CTRL_SLEdit除了具有编辑框的基本编辑功能外,就提供了一个限制输入字符长度的功能。没有类似MFC中CEdit限制输入类型,字符还是数

mingming_killer的专栏 1357

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

创建MiniGUI自定义控件

创建MiniGUI自定义控件在MiniGUI中,创建MiniGUI自定义控件,是通过替换已有的窗口过程实现的。这种方法是对某个控件类进行子类化,达到创建自定义控件的目的。下面用一个自定义按钮的例子,说明创建过程。这个例子中,用户绘制一个自己定义形状的按钮,而不是普通的3D按钮。 //旧的回调函数句柄static WNDPROC old_proc;//创建一个按键HWND

OneOrZero的专栏 2001

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

MiniGUI 自定义控件教程4

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

mingming_killer的专栏 2952

MiniGUI编程指南

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 ...

xixihaha331的博客 3982

自定义IP控件添加到MINIGUI源码中

刚开始接触minigui,需要用到很多的自定义控件,原有的控件有限,所以需要将自定义控件添加到源码中。使用MINIGUI1.6.10  自定义控件IP添加方法:1、首先编写IP控件(最后附加程序)2、修改configure    $ vim configure    仿照edit 在963行添加 enable_ctrlipedit               在1707行添加   --enable-ctrlipedit      include IPEDIT control                在

wxsuper_2008的专栏 720

Rockchip MiniGUI Desktop开发指南

MiniGUI是一款面向嵌入式系统的高级窗口系统和图形用户界面支持系统,目前我们在MiniGUI的基础上编写了MiniGUI Desktop,用以实现音频播放、视频播放、图片浏览等功能,支持按键或触屏控制,便于二次开发。

1353

minigui[基础篇][6]—— 控件的高级编程

minigui手册阅读

qq_43601873的博客 554

MINIGUI 中主窗口、控件(即子窗口)的理解

MINIGUI 中大体分为 主窗口、控件(即子窗口),而其他的一些都属于这两类,如对话框属于主窗口,按键等属于控件 对于主窗口、控件的理解,根据以下程序和效果图,更容易明白。 #include<stdio.h> #include<stdlib.h> #incl...

chuchazou4550的博客 734

MiniGUI学习日记一----MiniGUI基础编程篇

一、什么是事件驱动编程: MinGUI是一个图形用户界面支持系统。通常的GUI编程概念均适用于MiniGUI编程。 二、焦点和光标: 焦点和光标的概念用于管理输入设备和输入事件的传送。鼠标光标是一个绘制在屏幕上的小位图,指示当前的鼠标位置,应用程序可以绘制哪一个位图以及是否显示光标。应用程序还可以捕捉光标并获取光标事件。 三、MINIGUI的三种运行模式 ① MiniGUI-Threads,运行在MiniGUI-Threads上的程序可以在不同的线程...

KLh 5451

在miniGUI中增加自定义控件

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

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值