MiniGUI 自定义控件教程2

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

控件功能确认

咋接着上次的教程继续。这次我们依托一个例子来说明如何使用MiniGUI中的第一种方法(也就是子类化已经创建的控件实例)。假设我们的例子是:某个学校的某个年级的某些班在某个时间搞了某次考试 -_-|| 。考试过后经老师研究决定把考试成绩按班为单位分成3个分数段:差、中等、好。现在咱们就要用MiniGUI来整一个统计图来直观的显示这个3个分数段的学生比例。但是有几个班就有几个统计图啊。你可能说,我可以只画一个图然后切换数据显示不就行啦。哎呀,那么大的窗口你就忍心只放一个图么,再说了你偏要这么弄,那咋的教程也进没办法进行下去了。所以我决定在界面上放上2个统计图(其实放多少个都可以,反正代码只有写一次 ^_^)。然后再弄1个按钮在切换不同的班级数据显示。最终的效果如下图:

Figure 1 
图 1 控件最终效果

控件设计

OK,首先让我们确定下要“继承”哪一个MiniGUI的控件。哎,其实这问题太明显了。我们要的是一个统计直方图,基本上控件都是自己画出来的了,MiniGUI原来控件的一些特性基本上用不到,那当然是选择继承CTRL_STATIC啦,这个控件本身没多少自己数据(占用资源少),而且如果你不设置任何信息在上面的话,就是白花花的一块画布啊,赶紧画吧 ^_^ 。

第二次OK,让我们设计下我们这个控件的数据结构:我们需要保存3个分数段的学生人数(弄个int的3元素的数组啦);班级的名字(弄个32个字符的char数组啦);控件附加数据(DWORD类型,这个为什么要要,在后面的注意事项里再说)。所以我们的控件的数据结构就是:

typedef struct _statgdata_st
{
        int nData[3];
        char strName[32];
        
        DWORD dwUserAddData;
} STATGDATA;
typedef STATGDATA* PSTATGDATA;


第三次OK,然后我们再来设计下我控件对外的接口。MiniGUI 采用消息机制,那和外部打交道的当然就是消息啦。注意我这里说设计的消息是指控件自定义的消息,不是MiniGUI 原有的消息。

1:初始化。观众又要说了不是有MSG_CREATE消息么,为什么还要自己再弄一个。嘿嘿,这个在同样在后面的注意事项再说。我把它整成STATGM_INIT;不要任何参数;主要负责初始化控件数据变量。

2:设置控件数据。这个就不多什么了,没这个你还怎么操作控件?我把它整成STATGM_SETDATA;WPARAM 传入字符串指针来设置strName;LPARAM传入int数组首地址来设置nData。

3:设置控件附加数据。这个说了后面再说的。我把它整成STATGM_SETADDDATA;WPARAM传入DWORD的附加数据。

4:获取控件附加数据。有了前面的设置附加数据能没这个么。我把它整成STATGM_GETADDDATA;WPARAM传入获取的DWORD指针。为啥不用SendMessage的返回值,那个是int的,DWORD在MiniGUI的定义为unsigned long 其实还是和int的有区别的。

对了,应该还有一个STATGM_GETDATA的来获取当前控件的数据值的,但是我一想反正是弄了小例子而已,大家有兴趣的自己去改我的源代码啦。所以我们的消息就是:

#define STATGM_BASE                 MSG_USER + 3000

#define STATGM_INIT                   STATGM_BASE + 1
#define STATGM_SETDATA           STATGM_BASE + 2
#define STATGM_SETADDDATA     STATGM_BASE + 3
#define STATGM_GETADDDATA     STATGM_BASE + 4


第四次OK,控件数据结构和消息都设计好了,可以开工写了。其实C语言,MiniGUI的API的调用大家都会,我这里就是主要说一下使用这样方式自定义控件的注意事项,也算为把之前挖的坑给填了 ^_^ 。

需要注意的问题

1:如何继承父类(我们这里是CTRL_STATIC)

飞漫的编程指南里,写的是用一个全局的WNDPROC 变量来保存SetWindowCallbackProc() 的返回值来获取原来控件的过程处理函数指针。然后在新的过程处理函数消息处理过后再利用这个全局变量来跳转到父类控件的过程处理函数去执行。我个人不怎么喜欢这样方式。我的方法是用如下这段代码来获得父类控件的过程处理函数:

WNDCLASS wcStatic;

wcStatic.spClassName =  CTRL_STATIC;
wcStatic.opMask = 0x00FF;

GetWindowClassInfo (&wcStatic);
wpOldStatic = wcStatic.WinProc;


其中wpOldStatic是自定义控件源文件的文件变量。我定义一个接口函数把这段代码封装起来,然后在子类化控件实例前调用。注意这个一定要获取正确不然得不到正确的继承效果的,一般来整个项目的初始化过程里调用。然后我再解释下那个opMask为啥要设置成0x00FF。这个是飞漫的API编程手册里没写清楚的地方之一(至少我看的2.0.4的没写)。这个DWORD的掩码告诉下面的GetWindowClassInfo() 函数你想要获取的控件类的信息。然后这个函数会把控件类的相关信息填入你传入的WNDCLASS指针里。不过要注意你传入的WNDCLASS的spClassName字段你要填好,不然这个函数不知道你要获取的是哪个控件类的信息。opMask掩码含义:

#define COP_STYLE 	0x0001  // 获取风格信息
#define COP_HCURSOR  	0x0002  // 获取鼠标信息
#define COP_BKCOLOR     0x0004  // 获取背景颜色信息
#define COP_WINPROC 	0x0008  // 获取过程处理函数信息
#define COP_ADDDATA 	0x0010  // 获取附加数据信息


我们要的就是 COP_WINPROC(0x0008)这个啦,不过为什么设置为0x00FF咧。哎,这个就代表我以后的信息全部获取,当然也就包括控件的过程处理函数啦。

2:如何子类化控件实例

飞漫的编程手册里介绍的是用 SetWindowCallbackProc? () 来替换掉要子类化的控件实例的过程处理函数。没错就是用这个函数来替换,不过需要注意一个问题。你控件需要初始化吧。大家说:响应MSG_CREATE消息不就得啦。嘿嘿,这就不行了吧。大家仔细想想看,MSG_CREATE消息是什么时候发送的?是在控件创建好之后就发送了。那你是什么时候替换掉它的过程处理函数的?你别告诉我可以再控件实例创建好之前替换。你替换时候的控件句柄哪来的,不创建好后你能GetDlgItem到控件句柄?所以如果这个时候你把初始化控件变量的代码写到了MSG_CREATE里的话,你就着道了。你的控件数据是不会被初始化的,这个对于指针来说,意味着什么会C、C++的人不用我说了吧。所以我才在上面说要自己整一个初始化的消息让外部在替换的时候告诉控件:要初始化啦。 这样我就把实例化封装成一个接口函数:

void InstanceStatGCtrl (HWND hCtrl)
{
        SetWindowCallbackProc (hCtrl, StatGraphProc);
        SendMessage (hCtrl, STATGM_INIT, 0L, 0L);
}


每次子类化控件实例,把该控件实例的句柄传入这个函数就可以啦。

3:控件数据如何实现每个实例保存一份

C++里有类和对象的概念,每个类的对象都拥有自己的数据(叫成员变量,或者叫实例变量),也有所有对象公用的数据(叫类数据,在定义类的数据时加上static即可)。可是C语言是没有真正的类的数据的,只有结构体。MiniGUI的每个控件都有2个附件数据,都是DWORD类似的其实就是unsigned long,在一般的linux上是32bit的。用于保存控件的私有数据(其实就是可以理解为每个控件实例自己的数据)。又有人问了,这只是一个32bit的数据,怎么保存各种各样的数据啊?嘿嘿,C语言忘了指针了么。如果你拿这个32bit的空间来保持数值确实不能干什么事,但是如果你是拿来保持地址呢。这个地址指向了你希望保持数据的首地址,那这就把这个问题给解决了。

我把控件的数据类型定义成一个结构体,然后在初始化话的时候给它申请内存空间,然后把地址(也就是这个结构体的变量的指针)保存到附加数据里。然后在后面的消息处理中,通过获取控件的附加数据(获取后强制转化为控件结构体指针),就能够操控每个控件实例的数据了。别了在控件销毁时释放内存哦。

但是这里还要特别强调一点。MiniGUI每个控件有2个附加数据。这不是随便用其中的一个的。其中dwAdditionalData2(附加数据2)是被MiniGUI原有的控件用掉了的,用来保存它们的控件私有数据去啦。所以像这种“继承”至MiniGUI原有控件的绝对不能使用dwAdditionalData2,不然控件就很容易出乱子,甚至程序崩溃,因为MiniGUI原来的控件也是使用指针的方式来保持的,你把它原来的弄掉了,然后它原来的代码又用这个指针干原来的事情,想想看多危险的情况啊。这个在飞漫的编程指南里有提到,但是仅仅是在44页的一个不起眼的地方用了一个小字体一笔带过而已 -_-|| 。

所以,我现在一个例子的这种情况应该使用dwAdditionalData1(附加数据1)来保存我们自定义控件的数据。不过这个附近数据还有一个用途就是应用程序的开发人员来保持一些特定应用程序的一些数据的。但是这里被我们用掉了,咋办咧。嘿嘿,这个也好办,还记得我设计的时候说设计了一个设置控件附加数据的消息么,MiniGUI 有SetWindowAdditianlData() 的API了,我为什么还要设计这个接口咧。这就是原因啦,本来设计保留给应用程序的dwAdditionalDtat1别我的控件占用掉了,我们控件的开发原则就是尽量方便外部应用程序的使用,不能让人家不能使用原有的功能啊。所以我在自定义控件的结构体里增加了一个DWORD类型的数据,然后提供结构给外部来设置和获取。不过这里一定要告诉使用控件的人,让他使用你提供的消息来设置和获取控件附加数据,而不是直接使用SetWindowAdditionalData 和GetWindowAdditionalData 。

这里再啰嗦一点:外部的应用程序不管什么情况下,都不要轻易的使用SetWindowAdditionalData2和GetWindowAdditionalData2。这个之前说过了,是保存MiniGUI 原有控件数据的指针,不是开放给外部应用程序使用的。

其他的一些通常的MiniGUI GUI编程的一些就不多说,看我的源代码相信大家都会。这次介绍子类化已有控件实例的方法。下次我将结合自己写的一些通用自定义控件介绍子类化控件类和完全自己从头开始写自定义控件类(我管某一种方式叫完全自己从头开始写,至于准不准确大家自己看着办了,话说我还没开始介绍咧 -_-||)的方法。

本人比较懒散些,所以更新慢是必然的,请大家多多包涵。飞漫的MiniGUI的3.0版本都出来了,据说和1.6/2.0 区别很多,本人这些全是在2.0的基本上研究的,哎,不知道过时了没 -_-|| 。


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


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


代码下载:地址



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

相关推荐

【MiniGui示例图片】

MiniGUI示例代码图片信息

sinat_23896491的博客 323

MiniGUI 自定义控件教程7

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

mingming_killer的专栏 1818

minigui控件处理细节

1,控件的隐藏 2、控件之间切换 3、改变和移动窗口大小 如何设置文本前景色和背景色等内容

MiniGUI 的多窗口机制以及相关的窗口类技术

1 引言在任何一个足够复杂的 GUI系统中,处理窗口之间的互相剪切是其首要解决的问题。因为多窗口系统首先要确保一个窗口中的绘制输出不会影响到另外一个窗口。为此,GUI系统一般要利用 Z 序来管理窗口之间的互相剪切关系。根据窗口在 Z序中所处的位置,GUI系统要计算每个窗口受剪切的区域,即剪切域。通常,窗口的剪切域定义为互不相交的矩形集合。GUI系统的底层图形引擎在进

shenbin1430的专栏 2508

Minigui 的使用手册

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

Hodgkin-Huxley Model

介绍了经典的动力学模型:HH Model

weixin_73557167的博客 2474

miniui自定义messageBox框

miniui自定义MessageBox

好好的专栏 1万+

三极管开关电路在脉冲应用中的性能瓶颈分析

深入探讨三极管开关电路在高频脉冲场景下的响应延迟与功耗问题,揭示其性能限制的关键因素。结合实际应用,分析开关速度与信号完整性之间的矛盾,为优化三极管开关电路设计提供实用参考。

weixin_42602368的博客 587

MiniGUI 自定义控件教程3

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

mingming_killer的专栏 3948

VirtualBox虚拟机拖放文件总失败?手把手教你配置双向拖放与共享文件夹(Ubuntu版)

本文详细指导如何在VirtualBox的Ubuntu虚拟机中配置高效的数据交换方案。核心是安装VirtualBox Guest Additions,并在此基础上开启双向拖放与共享粘贴板功能,同时建立稳定的共享文件夹,彻底解决主机与虚拟机间文件传输失败的问题,构建无缝的跨系统工作环境。

weixin_29245767的博客 232

YOLOv5轻量化实战:从Ghost模块到工业级部署的完整指南

本文详细介绍了YOLOv5轻量化实战,重点解析了Ghost模块在工业检测中的应用及其优化策略。通过Ghost卷积技术,模型参数量和GFLOPs显著降低,同时保持高精度,适用于实时性要求严格的工业场景。文章还提供了从模型优化到TensorRT加速的完整部署指南,助力开发者实现高效工业级应用。

weixin_28223453的博客 489

MiniGUI 自定义控件教程1

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

mingming_killer的专栏 2061

基于LSTM算法实现交通流量预测(Pytorch版)

本研究采用PyTorch框架,设计并实现了一种基于LSTM(Long Short-Term Memory)网络的交通流量预测模型。针对时序性显著的交通流量数据,模型首先将多节点、多通道的时空信息整合为一维特征输入至多层LSTM单元,利用其捕捉长期依赖及短期波动的能力进行深度学习。全连接层随后调整时间步长以适应预测周期需求。模型结构灵活,能适应不同节点数、输入输出长度及通道配置,实现在给定历史流量数据基础上对未来交通流量的精准预测,为交通管理与规划提供数据驱动支持。

打酱油的葫芦娃 4637

MiniGUI 自定义控件教程5

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

mingming_killer的专栏 1357

大疆司空 2 私有化部署:FH2、Terra、4G 三大服务区别详解

摘要: 司空2私有版包含三大模块:FH2(核心平台,必选)、Terra(建模算力,需NVIDIA显卡)、4G(内网图传)。FH2是基础,支持设备管理与任务调度;Terra适用于测绘建模场景,依赖GPU算力;4G模块保障复杂环境下的图传稳定性,适合纯内网部署。选择逻辑:先部署FH2,再按需添加Terra(需显卡)或4G(需内网支持),避免资源浪费。

2501_93651177的博客 576

从零开始理解Linux中断架构(1)-前言

前段时间在转行手撸WIFI路由器,搞wifi路由器需要理解网络驱动程序,以太网卡驱动程序,无线WIFI驱动程序,而网卡驱动的关键路径就在中断程序中,需要了解NIC设备驱动程序如何收发数据,为了彻底的知道数据包是如何二层传递上来的,又需要了解一点Linux中断系统。第一次看到这张表是无感的,大概能够看懂的就是那个中断次数,因为不停的cat,这个数值会一直不停的增加。第一列是逻辑中断号,第二三列是中断次数,第四列是中断控制器的名字,第五列是硬件中断号,第六列 中断类型,第七列是 中断源关联设备。

maxleng的专栏 881

创建MiniGUI自定义控件

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

OneOrZero的专栏 2001

Graphviz安装及使用:决策树可视化

Python大数据分析与机器学习学习笔记 Graphviz安装及使用:决策树可视化

算法工程师 1万+

MiniGUI 自定义控件教程4

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

mingming_killer的专栏 2952

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

MiniGUI 自定义控件教程6

接着上次的教程继续。之前就已经介绍完MiniGUI 2.0以前本人掌握的自定义控件的方法了(3.0的好像不太一样了呢,目前本人还没研究过)。恩,让我们来回顾下先: 1、对已经创建了的控件实例进行子类化。 2、对某个控件的子类进行子类化;这个又可以分为针对某个已有的控件(继承父类,类似之前的SLEditEx),重新自己写(继承自最顶层的DefaultControl,类似之前的Button

mingming_killer的专栏 1178

jre9下载 jdk9

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

MiniGUI编程指南

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

xixihaha331的博客 3982

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

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

Rockchip MiniGUI Desktop开发指南

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

1353

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

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

chuchazou4550的博客 734

自定义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

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

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

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值