在应用程序中集成自动完成功能

Textbox 的自动完成(Auto Completion)功能 Textbox 的自动完成(Auto Completion)功能 张洪举(http://www.vfptop.com) Microsoft Visual FoxPro MVP 概述在即将发布的VFP9.0(公测Beta版可以从http://msdn.microsoft.com/vfoxpro/下载)中,为Textbox控件增加了类似IE浏览器的“自动完成”(AutoComple 阅读详情
 

本文的很多内容来自使用自动完成这篇文章。

介绍

自动完成功能,就是用户在输入时,程序自动提示匹配用户输入的条目,并且/或者自动输入剩余部分,自从IE提供了表单和地址栏的自动完成功能之后,很多程序在用户界面中集成了这个功能。在适当使用时,它可以大大减少用户输入的时间。尽管这个功能如此有用,但是在平台开发工具包中甚至连一个示例都找不到。Paul DiLascia在2000年8月的C++ Q&A文章中使用子类化窗口类完成了这个功能,但是他的方法太依赖于MFC了,以至于不能很好的移植到非MFC的程序。这里是他的程序的图示:

他的文章中最后比较了使用COM接口和他的方法之间的异同,有兴趣可以去看看。

Windows外壳中的自动完成

 

Windows的文件打开和保存对话框,以及运行对话框,IE的地址栏都具有自动完成功能。

这个功能也在Windows API中提供。Windows Shell Light API提供SHAutoComplete函数,可以把系统内建的自动完成资源CLSID_ACLHistory 、CLSID_ACLMRU和CLSID_ACListISF(说明见后)绑定到编辑框。这个函数使得你不必处理COM接口就可以提供自动完成功能,但是如果你想要更好地控制自动完成的行为或者列表条目,那么你需要使用一些COM接口,例如IAutoComplete和IACList。

创建一个简单的自动完成对象

你可以采用下列步骤创建一个简单自动完成对象。简单自动完成对象从一个资源来提取自动完成所需的字符串。为使代码明确起见,错误检查的代码被省略,下同。

  1. 创建自动完成对象
    IAutoComplete *pac;
    CoCreateInstance(CLSID_AutoComplete,
                     NULL,
                     CLSCTX_INPROC_SERVER,
                     IID_IAutoComplete,
                     (LPVOID*)&pac);
  2. 创建自动完成资源
    你可以使用预定义的自动完成资源,或者编写你自己的自动完成资源。
    1. 使用预定义的自动完成资源
      IUnknown *punkSource;
      CoCreateInstance(clsidSource,
                       NULL,
                       CLSCTX_INPROC_SERVER,
                       IID_IACList,
                       (LPVOID*)&punkSource);
      下列外壳对象具有IAutoComplete接口,可以用CoCreateInstance创建之后给你的应用程序提供自动完成功能。
      • CLSID_ACLHistory - IE维护,匹配当前用户的历史记录。
      • CLSID_ACLMRU - 也是IE维护,匹配当前用户的最近文档记录。
      • CLSID_ACListISF -匹配外壳命名空间(包括文件系统和虚拟目录,例如我的电脑和控制面板)
    2. 编写你自己的自动完成资源
      IUnknown *punkSource;
      CCustomAutoCompleteSource *pcacs = new CCustomAutoCompleteSource();
      hr = pcacs->QueryInterface(IID_IUnknown,
                                 (void **) &punkSource);
      pcacs->Release();
      你可以编写实现IEnumString接口的自动完成资源对象。IACList和IACList2的实现是可选的。
    3. 实现IEnumString接口
      和其他IEnumXXXX接口一样,IEnumString接口有如下四个方法
         HRESULT Next(ULONG celt, LPOLESTR * rgelt, ULONG * pceltFetched);
          HRESULT Skip(ULONG celt);
          HRESULT Reset(void);
          HRESULT Clone(IEnumString ** ppenum);
      你可以用MFC或者ATL的 方法快速构造实现IEnumString接口的对象,也可以自己手动实现IEnumString接口。通常,列表项来自字符串数组或者数据库。下面是这两种情况下IEnumString的实现方法的建议
      1. 字符串数组(以CStringArray为例)
        • Next:提取指定数量字符串,并且增加当前字符串索引。
        • Skip:增加当前字符串索引
        • Reset:当前字符串索引复位为0
        • Clone:复制字符串数组和当前字符串索引
      2. 数据库
         
        • Next:提取指定数量字符串,并且向后移动当前记录位置。
        • Skip:向后移动当前记录位置
        • Reset:复位当前记录位置到记录集开头
        • Clone:复制记录集或者记录集参数和/或复位当前记录位置。
  3. 设置自动完成资源
    如果需要,你可能通过IACList或者IACList2接口设置一些选项来自定义自动完成资源,例如过滤某些列表条目。这对CLSID_ACListISF对象特别有用。可以查看IACList2::SetOptions的文档来查看有效的选项。
    IACList2 *pal2;
    if (SUCCEEDED(punkSource->QueryInterface(IID_IACList2, (LPVOID*)&pal2))){
        pal2->SetOptions(ACLO_FILESYSONLY);
        pal2->Release();
    }
    对于某些特定资源,你可能需要查询其他接口来进行更加复杂的设置,例如在资源管理器或者IE浏览到一个新的目录时,自动完成的列表内容也随之变化。对于 CLSID_ACListISF对象,你可以设置ACLO_CURRENTDIR让它来枚举当前目录的内容,这样你需要查询它的IACList接口,并且设置它的当前 位置。
    有两种方法可以设置当前目录。如果传递的只是目录的话,它们是等价的。
    1. 使用IPersistFolder
      你可以用这个接口来告诉自动完成对象当前的位置。因为当前位置可以不是真实的目录,例如是桌面或者是我的电脑所以这个方法比下一个更加灵活。
      IPersistFolder *ppf;
      extern LPITEMIDLIST pidlCurrentDirectory;//这个是有效的命名空间位置
      if (SUCCEEDED(pal->QueryInterface(IID_IPersistFolder, (LPVOID*)&ppf))){
          ppf->Initialize(pidlCurrentDirectory);
          ppf->Release();
      }
    2. 使用ICurrentWorkingDirectory
      你可以通过对象的这个接口把当前目录传递给对象。
      ICurrentWorkingDirectory *pcwd;
      if (SUCCEEDED(pal->QueryInterface(IID_ICurrentWorkingDirectory, (LPVOID*)&pcwd))){
          pcwd->SetDirectory(pwszDirectory);
          pcwd->Release();
      }

    如果你编写了自定义的自动完成资源,那么你可以自行编写修改设置的方法,例如限制最大枚举条目数目,或者根据用户的输入和上下文过滤枚举条目(这在枚举数据库记录时特别有用)。

  4. 绑定到编辑框
    IAutoComplete::Init将自动完成资源绑定到一个编辑框。有一些未公开的方法可以获得COMBOBOX控件中的编辑框的句柄,但是COMBOBOXEX控件提供了直接访问其中的编辑框的方法 (CBEM_GETEDITCONTROL),所以推荐使用COMBOBOXEX控件。
    extern    HWND    hwndEdit;//要添加自动完成的目标窗口
    extern    LPUNKNOWN punkSource;//第二步创建的自动完成资源的IUnknown接口指针。
    pac->Init(hwndEdit, punkSource, NULL, NULL);
    可以查看IAutoComplete::Init来的文档了解其他参数的含义。
    IAutoComplete::Init将会增加对象的引用计数,并且在编辑框销毁时减少对象的引用计数,见步骤6。
    一个自动完成对象一次只能绑定到一个窗口。
  5. 设置自动完成对象的行为
    如果需要的话,可以通过IAutoComplete2接口设置选项来更改自动完成对象的行为。可以查看IAutoComplete2::SetOptions的文档来了解其他参数。
    IAutoComplete2 *pac2;
    if (SUCCEEDED(pac->QueryInterface(IID_IAutoComplete2, (LPVOID*)&pac2))){
        pac2->SetOptions(ACO_AUTOSUGGEST);
        pac2->Release();
    }
  6. 释放对象
    pac->Release();
    punkSource->Release();
    自动完成对象在释放后仍绑定到编辑框(因为IAutoComplete::Init增加了对象的引用计数),并且在编辑框销毁时自动释放。在还需要访问对象的时候不应该提前销毁对象。例如,你可能在自动完成对象绑定到对话框之后,仍需要通过步骤3的方法设置自动完成资源。

创建复合自动完成对象

复合自动完成对象从多个自动完成资源中查找匹配的项目。例如,IE的地址栏查找访问过的URL和当前目录中的内容。可以采用下列步骤创建一个复合自动完成对象。

  1. 创建自动完成对象
    IAutoComplete *pac;
    CoCreateInstance(CLSID_AutoComplete,
                     NULL,
                     CLSCTX_INPROC_SERVER,
                     IID_IAutoComplete,
                     (LPVOID*)&pac);
  2. 创建复合自动完成资源对象管理器。它将多个自动完成资源组合成一个自动完成资源。
    IObjMgr *pom;
    CoCreateInstance(CLSID_ACLMulti,
                     NULL,
                     CLSCTX_INPROC_SERVER,
                     IID_IObjMgr,
                     (LPVOID*)&pom);
  3. 对每一个简单自动完成对象进行前面一个例子的步骤2和3,完成创建和初始化工作。
  4. 连接简单自动完成对象到复合自动完成资源对象管理器。
    extern    LPUNKNOWN punkSource;//第3步创建的自动完成资源的IUnknown接口指针。
    pom->Append(punkSource);
  5. 绑定到编辑框
    这个步骤和前面一个例子的步骤4一样,除了把自动完成资源的IUnknown接口指针换成了复合自动完成资源对象管理器的IUnknown接口指针之外。
    pac->Init(hwndEdit, pom, NULL, NULL);
  6. 设置自动完成的选项
    同前面一个例子。
  7. 释放对象
    pac->Release();
    pom->Release();
    punkSource->Release(); /* 每一个步骤3的创建对象都要释放 */
    你可以在使用对象之后立刻释放对象,但是你可能需要保留对象接口指针以便以后修改选项。
     

自动完成的模式

自动完成具有两种互相独立的模式:自动扩展和自动建议。你可以调用IAutoComplete2::SetOptions来分别启用/禁用这两种模式。

  • 自动扩展:在此模式下,自动完成功能自动将最可能的候选字符串添加到当前子复制或并且高亮显示。编辑框表现得和扩展的字符串已经输入并高亮显示一样。如果用户继续输入字符,那么它们被添加到已经输入的部分字符串。如果用户输入的字符和扩展的部分的首字符一致,那么这个字符的高亮显示被关闭,剩余的扩展字符串继续保持高亮显示状态;否则自动完成试图用用户输入的新字符串产生一个新的候选扩展字符串,并和前面一样添加到当前字符串末尾并高亮显示。如果没找到候选扩展字符串,那么编辑框的行为和没有自动完成功能时一样。这个过程持续到用户完成输入。
  • 自动提示:在此模式下,自动提示显示一个下拉列表,显示一个或多个建议的完成字符串。用户可以选择其中一个,通常是用鼠标,或者继续输入以减少匹配的列表项数目。在输入过程中,列表内容可能根据输入的字符串更改。如果你在IAutoComplete2::SetOptions的dwFlag参数中设置了ACO_SEARCH标志,那么自动完成在列表末尾提供根据当前的部分字符串搜索的选项。这个选项甚至在没有提示的候选字符串时也显示。如果用户选择了这个选项,应用程序应该启动一个搜索引擎来帮助用户。
    尽管可以通过字符串匹配来判断用户是否选择了搜索选项,但是由于语言的不同,搜索选项的前缀也不一样。你应该考虑如何去掉“Search for”或者“搜索”这样的前缀
Textbox+listbox实现自动完成功能 using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.IO;namespace Test_AutoComplete{    public partial class Form1 : For 阅读详情

相关推荐

PP生产订单的BADI增强 WORKORDER_UPDATE

我们的项目需求是: 1、 保存时检查工单BOM是否存在物料号相同的行项目,如果有则提示“物料& 重复,请检查工单BOM” 系统增强出口:PPCO0001,检查组件行项目是否有重复物料项 开始以为的增强增强看一下是用PPCO0001还是PPCO0007 后来找到了badi WORKORDER_UPDATE IF_EX_WORKORDER_UPDATE~BEFORE_UPDATE

ERP运维咨询(目标和成功) 4634

关于BSTR数据类型

1.COM字符串类型字符串的长度可能互不相同,因此跨COM边界传输特定的字符串时,需要确定它的长度,而且,字符串有时需要分配内存。2.Unicode和ANSI数据类型3.OLECHAR,LPOLESTR,LPCOLESTRCOM的基本字符数据类型是OLECHAR,与平台无关的字符表示法。在创建该字符集时,OLECHAR的基本数据类型随操作系统的不同而不同。如今最流行的COM平台是基于Win32_A

铜板的专栏 6374

万达电影 com.wandafilm.app headers check

万达电影 安卓逆向 抓包 逆向 check

weixin_43786514的博客 1437

BSTR、LPSTR和LPWSTR  

 一、   BSTR、LPSTR和LPWSTR   在Visual C++.NET的所有编程方式中,我们常常要用到这样的一些基本字符串类型,如BSTR、LPSTR和LPWSTR等。之所以出现类似上述的这些数据类型,是因为不同编程语言之间的数据交换以及对ANSI、Unicode和多字节字符集(MBCS)的支持。那么什么是BSTR、LPSTR以及LPWSTR呢?  BSTR(Basic S

David的专栏 5050

ROS2 -Jazzy 一步一步(第一步_工作空间以及编译)

文件夹作用特点是否需要手动创建/维护src存放自己写的 ROS 2 包一个 workspace 可以有多个包需要手动创建build保存编译过程中的中间文件每个包生成对应子目录自动生成,可删除install保存编译完成后的功能包每个包有独立子目录,含可执行文件自动生成,可删除log保存编译日志用于查看错误原因、调试自动生成,不需修改colcon是 ROS 2 推荐使用的构建工具自动处理功能包的依赖和编译顺序一条命令就能编译整个工作空间。

jerrykorea的博客 1380

【正点原子I.MX6U-MINI移植篇】Ubuntu-base根文件系统移植构建过程详解(四)

能不能在ARM板上运行Ubuntu呢?答案肯定是可以的,Ubuntu是Linux系统的一种,可以简单的将Ubuntu理解为一个根文件系统,和我们用busybox、buildroot制作的根文件系统一样。因此移植Ubuntu也就是将Ubuntu根文件系统移植到我们的开发板上。

果果小师弟的博客 3767

ML-KWS-for-MCU静态审计:嵌入式AI落地前的可靠性闸门

关键词唤醒(KWS)是边缘AI的核心落地形态,其在MCU上的实现需兼顾极低内存占用、确定性实时响应与无堆运行等硬约束。传统动态测试难以暴露跨层级数据流污染、Q-format定点溢出、MPU配置缺失等底层风险,而静态代码分析可穿透执行域隔离、算法抽象、硬件解耦与部署封装四层架构,提前验证内存安全、时序可控性与模型完整性。尤其在ARM Cortex-M系列平台,结合CMSIS语义建模与自定义规则的静态评测,已成为从‘能跑通’迈向‘可交付’的关键工程实践。本文以ML-KWS-for-MCU为典型,详解面向裸机环境

ciya3282的博客 343

2023年5月青少年软件编程Python等级考试四级真题(含答案和解析)

电子学会,2023年5月,青少年软件编程,Python等级考试,四级真题(含答案和解析)

m0_37554648的博客 903

在应用程序中集成自动完成功能 (转)

在应用程序中集成自动完成功能 (转)[@more@] 在应用程序中集成自动完成功能 本文的很多内容来自microsoft.com/library/en-us/shellcc/platform/shell/programm...

csd3176的博客 105

YOLOv9分割改进 ,YOLOv9分割改进主干网络为华为EfficientNet,助力涨点

EfficientNet论文中研究了卷积网络的缩放和,并证明对深度,宽度和分辨率复合缩放的重要性,因此精度和效率更好。为了阐述相关的原理,我们提出了简单有效的复合缩放方法,使得模型缩放具有一定设计准则,同时兼顾了模型的效率。我下文将 YOLOv9 分割模型改进主干网络为 EfficientNet 融合网络结构。论文地址代码地址下文都是手把手教程,跟着操作即可添加成功把环境配置好,数据集处理好,训练基本能成功,创作不易,请帮忙点一个爱心,关注我,带你不挂科!

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 937

YOLOv11训练命令完全指南:从核心参数解析到高级调优实战(数据配置、epochs设定、batch-size优化与img-size调整)(二)

本文介绍了YOLOv11训练命令的完整配置与解析,提供了基础训练命令示例及参数详解。示例命令包含数据集配置(coco.yaml)、训练轮次(300)、批次大小(64)、图像尺寸(640)等核心参数,以及优化器(AdamW)、学习率(0.001)等调优选项。通过代码实现展示了训练器的初始化流程,包括参数解析、设备设置、数据加载和模型创建等关键步骤,为YOLOv11模型训练提供了实用指导。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1093

Atlas学习手记(4):使用AutoComplete Extender实现自动完成功能

摘要:自动完成功能在Ajax时代已经见的很多了,像Google Suggest,很多邮箱中也都有应用。在Atlas对于自动完成功能提供了很好的支持,提供了客户端的AutoComplete Behavior和服务器端的AutoComplete Extender的支持。本文主要看一下使用AutoComplete Extender来实现自动完成功能。 主要内容 1.AutoComplete...

JUDD14273的博客 149

最新Python爬虫实战(入门爬虫篇)——案例20:某股票数据采集(详细爬虫思路截图+抓包动图演示+完整爬虫代码+详细注释)

本次案例针对某股票行情网的静态HTML页面,实现了全市场股票数据的全自动化爬取,覆盖了从抓包分析、请求模拟、数据解析到数据存储的完整爬虫流程,非常适合入门学习者巩固基础,核心知识点和实现要点总结如下:首先是页面分析的核心逻辑,静态HTML页面的数据爬取,核心在于通过浏览器开发者工具,完成完整的抓包分析和标签结构定位。我们不需要像动态页面那样找隐藏的API接口,只需要确认数据在主文档的HTML源码中,然后通过元素选择器,精准找到每个字段对应的标签,总结出统一的标签结构规律,就能实现批量数据提取。

努力让自己发光,对的人才能迎着光而来 19万+

推荐:WinFBE - 免费的FreeBASIC集成开发环境

推荐:WinFBE - 免费的FreeBASIC集成开发环境 1、项目介绍 WinFBE(FreeBASIC Editor for Windows)是一款专为FreeBASIC编程语言设计的强大编辑器,由Paul Squires开发并维护。这款编辑器充分利用了Scintilla编辑库,并提供了一个全功能的开发环境,包括内置的Visual Designer,支持GUI应用程序的开发。除了基础的文本编...

gitblog_00085的博客 787

WINCC7.3破解文件

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

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

iOS开发学习笔记:使用xcode里的单元测试,放在STAssert…里面的语句无法使用自动完成功能...

在xcode里集成了一个单元测试框架OCUnit(在xcode自动生成的头文件里自动实现了SenTestCase的接口,不知道OC和Sen这2个字头有什么来历?),在新建一个工程时,可以自动生成单元测试框架,在如何在原有工程上加入单元测试框架就没有时间折腾了(好像有个帖子说可以的)。 实际上只有一些基础类需要用单元测试保证质量,对于那些大量界面操作的还是用手工测试吧,所以又要把原来的程序拆成2部...

weixin_33913332的博客 93

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

idea 用iterm 终端_iTerm2 for Mac(终端软件)

iTerm2是终端的替代品,也是iTerm的继承者。iTerm2 for Mac是一款适用于Mac的多功能全功能终端应用程序,专为高级用户,开发人员以及最近迁移到Mac并且更喜欢终端窗口的用户而设计,并支持拆分选项卡和多个终端实例iTerm2 for Mac(终端仿真软件) 3.3.1b1iTerm2 Mac软件功能拆分窗格将选项卡划分为多个窗格,每个窗格显示不同的会话。您可以垂直和水平切片,并以...

weixin_39912163的博客 499

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

通过增强的WindowsForms支持为.NET应用程序精心制作华丽的UI -- ITDB教程库

Windows Forms 2.0 比它之前的任何 Windows 应用程序开发平台的功能都要丰富得多。您将会发现全方位的改进:采用更为紧凑的全功能 Microsoft® .NET Framework、Visual Studio® 与许多新的附加设计器的集成更为紧密、采用统一的数据绑定模型以及锦上添花的 ClickOnce Web 样式部署。 System.Windows.Forms 命名空间(构

1777

ide快捷生成定义对象_您如何定义IDE一词?

在TechTarget网站系列中,最受欢迎的是WhatIs,人们可以在这里找到容易理解的首字母缩写词,术语和新的技术流行语的技术定义。 该网站已经存在了很长一段时间,尽管它在搜索引擎和整个IT社区中都赢得了很大的尊重,但其血统的缺点之一是,有时定义有些陈旧。 我最近被要求更新的术语之一是IDE, 根据目前在姊妹站点SearchSoftwareQuality上托管的WhatIs定义 ,其代表集...

服务器编程交流平台 278

studio官网下载

studio官网下载

m0_53396342的博客 742

Objective-C 的集成开发环境

AppCode 是一个全新的 Objective-C 的集成开发环境,用于帮助开发 Mac、iPone 和 iPad 的应用程序。 主要特性: 超乎想象和便利的代码导航以及代码自动完成 即时代码分析和快速简易 代码搜索,包括类、方法、变量和资源 即时代码转换,支持i18n 更好的代码重构 其他特性: 可直接打开 Xcode 项目 可与 Interf

展望 614

EditPlus自动完成功能

uusee网络电视官方下载2011PPTV网络电视官方下载风行下载2011正式版麦克疯破解讯雷7麦克疯破解版uusee网络电视2011风行2011pipi 下载pp影视下载 EditPlus自动完成功能 2008年04月12日 星期六 13:57 近来由于有很多代码需要编辑,遂试用了Editplus和EmEditor,感觉在编写和查看代码的时候的确不错,EmEdito

mtzai的专栏 7134

MassAutocomplete:为AngularJS应用程序提供高效自动完成功能

MassAutocomplete:为AngularJS应用程序提供高效自动完成功能 MassAutocomplete 是一个开源项目,致力于为 AngularJS 应用程序提供自动完成功能。该项目主要使用 JavaScript 编程语言,同时包含了 CSS 样式文件。 核心功能 该项目的主要功能是为 AngularJS 应用程序提供一个强大的自动完成组件,可以轻松集成到任何 AngularJS 应...

gitblog_01144的博客 361

At.js – 用于 Web 应用程序的自动完成库

  At.js 是一个自动完成库,用来实现自动完成提示,表情等,就像你在 Github 或 Twitter 上看到的一样。它支持 HTML5 contentEditable 元素。你可以听任何字符,而...

QDY5945的博客 679
上一篇: 使用虚列表和自画实现文件夹的缩略图显示
下一篇: 使用目录内容建立菜单
xmlscript
博客等级 码龄25年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值