MiniGUI 自定义控件教程1

前言:

MiniGUI 采用的机制是与win32十分类似的消息机制,基本上与win32的sdk一致。win32上经典的Framework MFC 采用的是C++,面向对象的方法,自定控件可以直接使用继承的方式,十分方便。MiniGUI 使用的是c语音,重所周知这是一个面向过程的语言。但是其实它也可以使用类似c++的面向对象的思想(详细的可以看一本叫做 《Object-Oriented Programming with ANSI-C》的书,具体的就不在这里研究了)。MiniGUI 本身自带的控件就是用c语言来模仿一些面向对象思想来实现的。

飞漫的编程指南上也提到了自定控件的方法。但是与其它的章节比起来篇幅太小了 -_-||。网上这方面的资料更是少得可怜,在csdn和pudn上我可以随便搜到MFC、VB、Dephi等自定义控件的例子,但是MiniGUI基本上就没看到。想当初自己研究,很费劲,走了不少弯路。现在总结了一些心得,希望开发定义控件的弟兄们少走些弯路。

一、自定控件的方法

MiniGUI  原有的控件用一个叫做 WNDCLASS 的来表示。从名字就可以看出了,飞漫把这玩意当类来对待了。不过c++(面向对象的语言相对来说本人对c++比较熟悉,就拿这个举例子了)里的自定义控件可都是子类化某个原有的控件类,然后写好类之后,实例化得到控件对象就可以使用了。

飞漫的编程指南里说到了3种方法:

1、对已经建立的控件实例进行子类化,子类化的结果只会影响这一个控件实例。 2、是对某个控件类进行子类化,将影响其后创建的所有该控件类的控件实例。 3、是在某个控件类的基础上新注册一个子类化的控件类,不会影响原有控件类。在 Windows 中,这种技术又称为超类化。

恕本人水平及理解能力有限,我目前只理解和使用了第1和第3种方法,第2种我愣是没明白怎么回事 -_-||。要是哪位兄弟理解了的,望留言或发email告诉我 ^_^。 那现在我就说说我理解了的这2种方法吧。

1、对已建立的控件进(实例)行子类化 MiniGUI 的控件就是一类特殊的子窗口,所以它们也有自己的过程处理函数 typedef int (* WNDPROC) (HWND, int, WPARAM, LPARAM) 。这种方式的实现其实就是替换掉已经创建了的控件原来的过程出来函数。这个函数其实是每个控件结构体变量里一个函数指针所指向的。通过函数指针指向不同的处理函数就能实现控件的不同功能已经不同的属性。再配合上每个控件的实例数据(后面再说这个东东),是不是有点像面向对象的感觉了呢 ^_^。

这种方法只会对你替换了过程处理函数的控件实例才生效。个人感觉比较适用的情况是:一个工程里,有好几个界面用到了同一个控件或者一个界面用到了好几个控件;但是这些控件都是和本工程关系比较紧密的,其他工程基本上用不到的。例如:一个项目里需要画N个直方图,这些直方图只是数据不一样而已,绘图方法基本一致;但是别的工程基本上用不到这个东西。其实这个用一个函数来实现也可以,让其传入绘图dc和相应的区域坐标就可以了。不过我感觉用函数这种方法没有封装成控件来得方便。1:函数使用的绘图相关的变量是和父窗口相关的,用起来不怎么方便。2:提供给工程里别的模块使用话,在MiniGUI这种gui编程中,封装成控件,使用消息机制更符合MiniGUI的编程方式。哎~~总之大家自己可以感受封装成控件的好处的,我表达能力有限,好像没怎么说清楚 -_-||。

不过这样弄有点点代价。就是MiniGUI的控件都有自己的数据结构变量,会稍微占有一些额外的资源,不过都能跑GUI的设备了,这些应该问题不大啦。

2、对控件类进行子类化 这种方法与上一种相比,应该算是更接近C++的自定义控件的方法。上一种是针对原有控件实例的,而这种是针对控件类了。是改动整了类,正如飞漫编程指南上写的,这种方法能影响到每一个创建的控件实例。 这种方法要是向MiniGUI 注册自己的类,然后自己设计控件数据(不是指GUI系统的调用的控件窗口数据(这些例如客户区、私有DC、托管窗口之类的),而是指保存控件某些行为的数据(例如ctrl_button里的BUTTONDATA这一些的数据))和过程处理函数。

这种方法我个人认为比较适用用于像扩展按钮(Button)、编辑框(Edit)、进度条(ProgressBar)之类的通用性比较强的控件。例如你觉得MiniGUI原来的Button不怎么好看,就可以自己弄一个,然后你写的所有工程都可以用你写的好看的Button来装饰了。

这里先介绍些理论的东西,之后再结合实际来讲解具体的方法。

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


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

你可能感兴趣的:(minigui,button,编程,mfc,数据结构,语言,windows)