谷歌浏览器的源码分析 7

当我们键入字母或者文字开始时,那么类AutocompleteEdit就会从窗口消息里获取到相应的字母或者文字,然后根据输入的信息到本地或者网络上保存的信息库里查找相应的输入提示,这就是自动完成的实现。下面就来先分析输入的函数:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

#001  void AutocompleteEdit::OnChar(TCHAR ch, UINT repeat_count, UINT flags) {

#002    // Don‘t let alt-enter beep.  Not sure this is necessary, as the standard

#003    // alt-enter will hit DiscardWMSysChar() and get thrown away, and

#004    // ctrl-alt-enter doesn‘t seem to reach here for some reason?  At least not on

#005    // my system... still, this is harmless and maybe necessary in other locales.

下面把alt-enter组合键消息过滤掉。

#006    if (ch == VK_RETURN && (flags & KF_ALTDOWN))

#007      return;

#008

#009    // Escape is processed in OnKeyDown.  Don‘t let any WM_CHAR messages propagate

#010    // as we don‘t want the RichEdit to do anything funky.

下面把ESC键的消息过滤掉。

#011    if (ch == VK_ESCAPE && !(flags & KF_ALTDOWN))

#012      return;

#013

下面把TAB键的消息过滤掉。

#014    if (ch == VK_TAB) {

#015      // Don‘t add tabs to the input.

#016      return;

#017    }

#018

这里处理其它有用的按键消息。

#019    HandleKeystroke(GetCurrentMessage()->message, ch, repeat_count, flags);

#020  }

AutocompleteEdit::OnChar函数是WTL里的WM_CHAR消息处理,当用户键入字母时就会触发这个消息。这个函数先跳过几个不要处理的消息,最后调用函数HandleKeystroke来处理,如下:

#001  void AutocompleteEdit::HandleKeystroke(UINT message, TCHAR key,

#002                                         UINT repeat_count, UINT flags) {

冻结RichEdit的更新。

#003    ScopedFreeze freeze(this, GetTextObjectModel());

处理消息变化前的动作。

#004    OnBeforePossibleChange();

处理消息

#005    DefWindowProc(message, key, MAKELPARAM(repeat_count, flags));

处理消息变化后的动作。

#006    OnAfterPossibleChange();

#007  }

在这里为什么要进行窗口的消息冻结呢?又为什么需要进行消息处理和消息变化后处理呢?下一次再告诉你。

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

原文地址:https://www.cnblogs.com/skiwnchh/p/10346949.html

时间: 2024-08-02 09:34:43

谷歌浏览器的源码分析 7的相关文章

谷歌浏览器的源码分析 21

分享一下我老师大神的人工智能教程吧.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net 上一次说到类RenderThread和类RenderView把消息处理,那么这两个类是怎么样处理消息的呢?又是怎么样处理浏览的消息呢?现在就带着这两个问题去分析它的源码,理解它处理消息的方法.类RenderThread处理消息的代码如下:<?xml:namespace prefix = o ns = "urn:schemas-

谷歌浏览器的源码分析 4

关于对话框,主要实现了让用户查看当前软件的版本.软件信息和检查升级的功能.因此这个类主要继续ChromeViews::View类.ChromeViews::DialogDelegate和GoogleUpdateStatusListener.其中ChromeViews::View实现窗口的布局和显示问题,ChromeViews::DialogDelegate实现了事件响应,或者窗口某时是否可以显示按钮的问题,GoogleUpdateStatusListener是用来实现接收更新程序状态信息. 这个

谷歌浏览器的源码分析 6

前面已经介绍了这么引人的输入自动完成功能,并且可以在输入超级连接框里直接通过GOOGLE搜索所有的内容,这是比较大的创新,不但可以节省界面的占用面积,还很方便大家查询的需要,比如记不住的连接,根本不需要去记了,只要你记住需要的内容就行了.这样既不需要到什么门户网站去找连接,也不需要去记住众多的网站,这个功能是非常方便的. 这个输入框的自动完成的功能,是比较智能化的.因为它会根据以往的输入自动完成,或者智能提示所需要的连接或者内容. 下面就来先看这个类的定义: #001  // Provides

谷歌浏览器的源码分析 34

通过上一次的分析,我们看到所有网页数据经过HTML分析器之后,都会变成一个一个RenderObject对象,那么这些RenderObject对象又是怎么样显示到界面上面的呢?现在就带着这个疑问来分析下面的代码,这样肯定会找到解决方法的.怎么样找到入口呢?其实可以先从界面显示的类开始,可以看到显示界面的窗口类名称叫做Chrome_RenderWidgetHostHWND,有了这个类名称,就可以到代码里查看它在那里了. #001  class RenderWidgetHost; #002  clas

谷歌浏览器的源码分析 9

为了处理字符消息实现自动完成的功能,这是怎么样实现的呢?其实是先记录字符消息响应前的字符串以及选中状态,接着再处理消息,最后才查询可能的输入,做出智能提示.<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> #001  void AutocompleteEdit::OnBeforePossibleChange() { #002    // Record our state.

谷歌浏览器的源码分析 13

分享一下我老师大神的人工智能教程吧.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net 上一次说到调用函数OpenURL来打开网络连接,这仅是网络浏览的开始,现在再来分析它怎么样去下载网页数据,然后再显示出来.<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> #001  void Autocom

谷歌浏览器的源码分析 29

分享一下我老师大神的人工智能教程吧.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net 上一次说到通过WinHTTP来接收网络数据,但没有具体介绍怎么样接收,现在就来分析这方面的代码.首先是通过函数WinHttpQueryHeaders来查询HTTP协议头的大小,接着还是通过函数WinHttpQueryHeaders把数据接收到缓冲区里.下面这段代码,就是做这样的事情:<?xml:namespace prefix =

TeamTalk源码分析之login_server

login_server是TeamTalk的登录服务器,负责分配一个负载较小的MsgServer给客户端使用,按照新版TeamTalk完整部署教程来配置的话,login_server的服务端口就是8080,客户端登录服务器地址配置如下(这里是win版本客户端): 1.login_server启动流程 login_server的启动是从login_server.cpp中的main函数开始的,login_server.cpp所在工程路径为server\src\login_server.下表是logi

Android触摸屏事件派发机制详解与源码分析二(ViewGroup篇)

1 背景 还记得前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>中关于透过源码继续进阶实例验证模块中存在的点击Button却触发了LinearLayout的事件疑惑吗?当时说了,在那一篇咱们只讨论View的触摸事件派发机制,这个疑惑留在了这一篇解释,也就是ViewGroup的事件派发机制. PS:阅读本篇前建议先查看前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>,这一篇承接上一篇. 关于View与ViewGroup的区别在前一篇的A