点击这里给我发消息 点击这里给我发消息

谷歌浏览器的源码分析(5)

添加时间:2013-12-7
    相关阅读: 网络 谷歌
  当我们键入字母或者文字开始时,那么类AutocompleteEdit就会从窗口消息里获取到相应的字母或者文字,然后根据输入的信息到本地或者网络上保存的信息库里查找相应的输入提示,这就是自动完成的实现。下面就来先分析输入的函数:

 #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 }

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

相关谷歌浏览器的源码分析(5)

咨询热线:020-85648757 85648755 85648616 0755-27912581 客服:020-85648756 0755-27912581 业务传真:020-32579052
广州市网景网络科技有限公司 Copyright◎2003-2008 Veelink.com. All Rights Reserved.
广州商务地址:广东省广州市黄埔大道中203号(海景园区)海景花园C栋501室
= 深圳商务地址:深圳市宝源路华丰宝源大厦606
研发中心:广东广州市天河软件园海景园区 粤ICP备05103322号 工商注册