当初在两年多前开始做现在这个项目时,我们最初决定花长时间来升级现有的游戏引擎,包括服务器和客户端,我负责了一部分的客户端的功能升级和配套工具集的开发和升级,我们这套引擎的工具集包含工具比较多,每个工具的工作模式都是,编辑大量的数据并存储成一个文件,每个数据文件都有自己的ID和名称,策划和美术人员每次想修改某个特定ID或者名称的数据项节点时,都不是太方便,虽然都有搜索功能,但是首先需要选择按照ID还是名称搜索,然后输入关键字,再点击搜索按钮,才能选中需要的项,并不是太方便。更不方便的是程序员针对每个搜索功能都需要编写大量的针对性搜索代码,功能差不多,但具体细节不同。
说道这里,无论是否用过mac的人,只要用过iTunes的人,都知道苹果的控件,有一个带图标的搜索框,看上去很通用,因为到处都有,只要你一输入关键字,下面的List控件立即开始筛选符合条件的项目,而且点击搜索框左边的放大镜图标,还能弹出菜单更改搜索选项。而实际上人家确实是一个通用的内建控件,但windows下至少MFC没有这样一个内建的控件。
iTunes的搜索框:
iTunes的搜索基本都是即时改变列表框等控件里匹配的项目,但是我还想加入一个对匹配关键字的高亮显示,比如改变背景什么的,这样的搜索才更加直观,但iTunes的这种搜索方式在MFC下实现很困难,难以通用,因为我需要对每个关联的数据集控件进行继承重写和定制,尤其是绘制代码的修改,工作量太大不容易实现。
但是如果我在搜索框搜索,这时会有像Combobox控件这样自动弹出下拉列表,显示出匹配的项目,并且高亮显示出关键字,当我点击选中或者键盘方向键选择后回车等操作后,直接会在数据集的控件中选中我刚才选择的搜索结果,这样一来,无论和什么数据集控件的关联,都只是单纯的数据关联,没有任何代码的耦合行,定制性极强,同时我也可以任意的完善搜索框的代码。
后来我在CodeProject上找到了两个项目:
1:一个自定义 MFC CEdit 外观的项目,作者的本身目的就是要把CEdit的外观变成iTunes搜索框的外观,左右各一个按钮图标,但不具备任何搜索功能。地址:http://www.codeproject.com/Articles/15043/iTunes-like-Find-Edit-Control?msg=4551618#xx4551618xx
2:一个自定义 MFC CEdit 和 CCombobox 的项目,能根据你在 CEdit 和 CCombobox 中的输入,自动在下拉列表中显示补全你输入的项,形式上非常像已有的 CCombobox 控件,但是多了自动弹出下拉列表和补全功能,这也是做着的主要目的。地址:http://www.codeproject.com/Articles/2607/AutoComplete-without-IAutoComplete
项目1的外观和项目2的自定义 Listbox window,如果我将这两项结合,就正好出现了我想要的东西了:iTunes搜索框的外观和通用的搜索显示补全。
于是诞生了这个项目:GUSIconEdit - General Used Search Icon Edit
如图所示,这个控件可以和任意的数据集控件(CListbox, CListCtrl, CTreeCtrl等)结合,非常轻易的搜索和显示结果并定位结果在数据集控件中的位置。搜索框的外观是自定义皮肤,左边的放大镜可以定制一个菜单,用来显示搜索选项,比如大小写匹配和是否从开头搜索等等,右边的小叉可以直接清除输入内容等;下拉列表中全部都是数据集中符合抖索条件的数据项(可以设置是否对筛选的结果升降排序),黄色背景和选中项的深蓝色背景用来表示这是当前匹配的关键字。所有的颜色和外观都可以通过接口自由修改定制。
虽然是使用的已有开源项目构建,但是这两个项目我都只使用了其中的一部分,而且改动的代码比较多,很多接口和结构我几乎都重写或者修改了,同时也优化了搜索和结果排序等代码(这个改动最多,使得我修改了整个列表框内部的数据结构),还有就是这个下拉列表以前拖动窗口或者鼠标点击其他区域,列表框并不立即消失,原作者使用的是一个timer查看父窗口的位置和原位置是否相同,如果不同表示用户移动了,那么列表框消失,实际上由于bug,会导致有些情况,列表框不能像Combobox的列表框一样,点击其它地方立即消失,这个问题我也解决了,花了很多时间才解决其中一些很莫名的问题。
这个项目我已经广泛的应用在了公司引擎配套的工具集中,效果也非常好,主要功能一年多以前就写完并开始使用了,平常有时间或想起来了就偶尔改进改进,最近时间比较多,就正式的整理并打算发布了。
由于这是个人项目,版权不属于公司(应该是本人授权了公司使用:)),除了遵守其中有些代码原作者的Licence外,我的其余代码都是使用The Code Project Open License (CPOL),不过这些Licences都是允许你随意修改使用以及商业项目的应用(但要保留原作者的版权),项目我已经放到了GitHub上,地址:https://github.com/yaukeywang/GUSIconEdit。感兴趣的同学可以自行下载研究扩充,或根据需要使用在你自己的项目中,示例程序已经包含了大部分功能的演示,其他的大家去看代码吧,暂时还没有文档,以后或许会补充,我很乐意大家下载和使用,希望这个东西能对你有所帮助。
Enjoy It!