接着上次的教程继续。上次以ButtonEx控件的开发为例介绍了如果自己完全重新开始写控件,这次我以一个扩展单行编辑框控件为例介绍如何在原有控件的基础上扩展自定义功能(继承原有控件功能)。
一、功能确定
MiniGUI 原来的单行编辑框控件CTRL_SLEdit除了具有编辑框的基本编辑功能外,就提供了一个限制输入字符长度的功能。没有类似MFC中CEdit限制输入类型,字符还是数字,数字还可以限制范围(不过CEdit是在输入完之后才能判断的)。不过这些功能对于应用程序还是比较有用的。于是我决定在CTRL_SLEDIT的基础上扩展这些功能:1、2种编辑模式:文本;数字。文本模式可以输入任意字符,数字模式只能输入0~9、+、-和小数点。
2、文本模式提供过滤输入字符的功能,能够指定屏蔽掉特定的字符;提供反向过滤功能,就是能够指定只允许输入特定的字符。
3、数字模式提供指定是否限定输入整数;并在此基础上提供指定输入范围功能。
二、概要设计
这里因为继承了CTRL_SLEDIT,所有只需专注控件的扩展功能就行了。要实现以上功能,最关键的就是在CTRL_SLEDIT接受到键盘输入之后,把输入显示到屏幕上之前,进行自己的过滤算法判定;当输入的是不符合用户设定的字符则截断,不发送给父类CTRL_SLEDIT处理(这样它就显示不出来了);当输入是符合用户设定的字符就发送给父类处理(这样它就能正常显示出来)。流程图如下:
图 1 CTRL_SLEDIT流程图
1:EEXMODE_TEXT
文本模式能让用户指定不允许输入某些字符(过滤),还是只允许输入某些字符(反过滤)。不过注意,这里针对的是字符,而不是字符串。字符串又要麻烦很多了。这个模式我只是顺带做了一下,下面的数字模式才是比较实用的。(汉字是占2个字符[字节],所以这里MS也不能过滤了 -_-||)
2:EEXMODE_DIGITAL
首先数字编辑模式就只能输入’0~9’、’+’、’-‘、’.’这些字符。在此基础上能让用户选择能否输入小数,开启的话就能输入小数;关闭的话就能输入整数。还能让用户指定数值的输入范围(闭区间)。
三、详细设计
1:数据结构SLEditEx? 的控件变量都是实例变量。控件变量数据结构我命名为EEXDATA: