高级输入联想在组合控件中的应用

2014-12-11 13:28冯伟伟王远斌嵇亮亮
江苏科技信息 2014年23期
关键词:下拉菜单字符串控件

冯伟伟,王远斌,嵇亮亮

(中国电子科技集团公司第二十八研究所,江苏南京 210007)

0 引言

在网络日益发达的今天,无论是百度、搜狐等国内知名的搜索引擎,还是大家经常使用的IE、360 浏览器,它们无时无刻不在使用输入联想功能。输入联想功能加快了人们的输入速度,同时越来越成为人们登录互联网不可或缺的一项基本功能,它为人们提供了很大的方便。在工程应用中,经常会通过人机交互界面输入较复杂的控制命令,这时输入联想功能显得尤为重要。对于已经输入过的比较复杂的控制命令,用户只需要输入命令开头的几个控制字符,就可以在产生的下拉列表框中选择所需指令,而不需要逐个字符的手动输入,这样就为用户提供了极大的方便。

ComboBox 控件可以实现自动选择的功能[1],当用户在组合框中按下一个键时,以该字母开头的第一个条目被自动高亮显示。每当一个键被按下,该字符串就被检查一遍,并检查列表框中是否存在与该项相匹配的条目,如果存在,则高亮显示。本文在此文献的基础上,采用自定义控件实现了ComboBox 控件的输入联想功能。

1 自定义组合框的体系结构

从用户角度看,ComboBox 控件由一个允许用户键入的文本框和下拉列表框组成[2,3]。用户可以从预先定义的列表框里选择一个选项,也可以直接在文本框里输入文本信息。当下拉菜单的选项较多时,下拉菜单的右侧会产生一个滚动条来实现手动滚动查询。

自定义组合框控件为了实现ComboBox 控件的相应功能一般需要包含以下4 个类:CEdit 类、窗口类、下拉列表类、滚动条类[4,5]。自定义组合框的创建及其实现输入联想的过程与上述4 个类创建顺序的关系如图1 所示。

图1 自定义组合框与相应类创建顺序关系框

手动输入也是组合框的一项基本功能,而CEdit 类可以使自定义组合框控件具有手动键盘输入的功能,由图1知,CEdit 类在自定义控件产生时已经产生,因此这时的控件已经具有了键盘输入功能,而与控件的下拉菜单是否产生无关。

窗口类是自定义组合框控件实现下拉菜单必不可少的部分,当用户点击控件的下拉按钮或进行联想输入功能时程序创建一个窗口类,此窗口可以承载所产生的下拉列表框和滚动条。

下拉列表框类是随着窗口类的产生而产生,当下拉窗口产生后会创建下拉列表框类,当销毁下拉窗口时,需要先销毁下拉列表框类。

滚动条类也是随着窗口类的产生而产生,当下拉窗口产生后会创建滚动条类,当销毁下拉窗口时,需要先销毁滚动条类。

2 自定义组合框输入联想的实现

本文基于对话框实现自定义组合框控件,首先添加一个自定义控件到对话框,设置控件的基类为CAdvComboBox。CAdvComboBox 是新建的类,它继承于类CWnd。此外,还需要添加继承于类CWnd 的窗口类CDropWnd,继承于类CListBox的列表框类CDropListBox 和继承于类CSrollBar 的滑动条类CDropScrollBar。

类CAdvComboBox 包含类CComboBox 的基本功能,因此,它需要重载CComboBox 的一些完成基本功能的函数,如SetCurSel()、GetCurSel()、GetCount()等。

当程序创建自定义控件时,首先进行一些初始化操作,包括创建CEdit 类以支持控件键盘输入功能等,因此,需要重载PreSubclassWindow()函数来完成这些任务。

2.1 输入联想内部实现

自定义组合控件的内部使用List 实现[6],其内部处理流程如图2 所示。

当用户手动输入字符串时,程序内部需要判断哪些历史记录需要在下拉框中显示,因此,需要重载输入响应函数OnUpdateEdit()进行判断,函数中判断列表框的命令记录中那些与当前输入的字符串相匹配的条目,其主要代码如下:

图2 输入联想内部实现流程

类成员变量m_List 中存储加入控件的指令历史记录,临时变量suggestList 用来存储命令记录中与当前输入的字符相匹配的条目。当用户输入可见字符串str,程序会遍历列表m_List 的每一个元素,查找元素开头字符串与字符串str 一致的条目并把该条目加入到suggestList 列表中。遍历m_List 结束后,判断suggestList 是否为空,如果为空则返回,如果不为空,则创建下拉菜单并显示列表suggestList 的所有元素项。

2.2 键盘输入实现联想

当第一次使用此输入控件时,或者输入的指令不在列表中,或者用户只知道某条指令开始的几个字符,这时就需要手动输入指令,手动键盘输入时联想功能流程如图3 所示。

由图3 可知,当用户使用键盘向控件中输入指令时,如果列表框的命令记录中不存在与当前输入的字符串相匹配的条目,此时不会创建下拉菜单窗口,指令输入完毕按下回车键,程序会把当前输入框中的指令加入到命令记录中,同时把指令发送到接收端,接收端接收到指令进行相应的操作。

如果列表框的命令记录中存在与当前输入的字符相匹配的条目,则程序会执行函数CreateDropList(suggestList)创建一个窗口类,其中的参数suggestList 为列表框的命令记录中与当前输入的字符串相匹配条目的列表,函数代码如下:

图3 键盘输入时联想功能流程

在上述代码中,当程序执行完函数m_pDropWnd->Create()后会自动执行窗口类重载的函数CDropWnd::OnCreate(),在此函数中创建滚动条类和列表框类,主要代码如下:

滚动条类和列表框类创建成功后就会出现选择下拉菜单,则下拉菜单会列出所有与输入字符串相匹配的命令记录,这时用户可以通过上、下键选择输入命令,最后把指令发送出去,但是,如果下拉菜单列出的所有与输入字符串相匹配的命令记录中不存在用户想要输入的命令,那么用户还需要继续手动输入指令,最后把指令加入到命令记录并发送出去。

2.3 下拉按钮实现选择

除了通过上述的方式输入指令外,用户还可以通过点击自定义控件右侧下拉按钮的方式实现指令输入,此时系统工作流程如图4 所示。

图4 点击下拉按钮的流程

由图4 可知,当用户点击自定义控件右侧的下拉按钮时,程序会创建一个窗口类,因此需要重载类CAdvComboBox 的鼠标左键的响应函数OnLButtonDown()。接着,调用函数CreateDropList(m_list)创建一个滚动条类和一个列表框类,其中参数m_list 加入自定义控件的指令历史记录。当滚动条类和列表框类创建成功后会显示新创建的选择下拉菜单,如果控件中存在输入指令记录,则下拉菜单会列出所有命令记录,这时用户可以通过上、下键选择输入命令。当用户按下回车键时,被选择的指令就会加入当前的输入框,同时下拉菜单销毁。当用户再次按下回车键时,就可以把当前输入框中的指令发送出去。

3 自定义组合框输入联想的应用

在人机交互的应用中,利用上述思想我们实现了自定义组合框控件的联想功能。当用户输入命令时,用户只需要输入命令开头的几个字符就可以在列表框中选择需要输入的命令,这样就为用户提供了很大的方便。人机交互模块的输入联想功能应用如图5 所示。

4 结语

图5 人机交互应用

本文介绍了一种全新的设计思想实现组合控件的输入联想功能,虽然程序的设计和编码相对比较繁琐,但其实现了比较高级的输入联想功能,满足了用户的需求,获得了较好的使用效果。

[1]孙皓.Visual C++范例大全[M].北京:机械工业出版社,2009.

[2]David j et al.Visual C++6.0 技术内幕[M].希望图书室,译.5版.北京:北京希望电子出版社,1999.

[3]侯俊杰.深入浅出MFC[M].2 版.武汉:华中科技大学出版社,2001.

[4]Bjarne Stroustrup.C++程序设计语言[M].裘宗燕,译.北京:机械工艺出版社,2002.

[5]钱能.C++程序设计教程[M].北京:清华大学出版社,1994.

[6]范磊.零起点学通C++:多媒体范例教学[M].北京:科学出版社,2010.

[7]孙鑫.VC++深入详解(修订版)[M].北京:电子工业出版社,2012.

[8]Lippman Lajoie.C++Primer 中文版[M].潘爱民,张丽,译.3版.北京:中国电力出版社,2002.

[9]Christopher Tavares,Kirk Fertitta,Brent Rector.深入解析ATL[M].赖仪灵,曹雨田,译.2 版.北京:电子工业出版社,2007.

[10]Dale Rogerson.COM 技术内幕[M].杨秀章,译.北京:清华大学出版社,1998.

猜你喜欢
下拉菜单字符串控件
基于文本挖掘的语词典研究
巧做智能下拉菜单
关于.net控件数组的探讨
制作更炫酷的下拉菜单
将Widget小部件放到
ASP.NET服务器端验证控件的使用
一种新的基于对称性的字符串相似性处理算法
依据字符串匹配的中文分词模型研究
GE MINItrace回旋加速器操作系统中Production与Tracer下拉菜单的功能差异
一种针对Java中字符串的内存管理方案