亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

谷歌瀏覽器的源碼分析(8)

系統 2296 0
?

上一次說到處理 WM_CHAR 消息,當用戶每鍵入一個字符時,萬能連接框就會去進行一次查找的過程,然后把智能提示信息顯示出來。說到 AutocompleteEdit::HandleKeystroke 函數的操作,那么它為什么需要凍結這個函數的使用呢?現在就來分析這部份的內容。如下:

ScopedFreeze freeze(this, GetTextObjectModel());

在這行代碼里,首先會調用函數 GetTextObjectModel() 來獲取一個文檔 ITextDocument 接口,然后再使用它的功能。這個函數的代碼如下:

#001 ? ITextDocument* AutocompleteEdit::GetTextObjectModel() const {

?

先判斷這個接口是否獲取到,如果已經獲取到就不再去重復獲取了。

#002 ??? if (!text_object_model_) {

#003 ????? // This is lazily initialized, instead of being initialized in the

#004 ????? // constructor, in order to avoid hurting startup performance.

?

這里使用了智能指針來獲取 IRichEditOle 接口。

#005 ????? CComPtr<IRichEditOle> ole_interface;

?

獲取到的 IRichEditOle 接口綁定到智能指針里。

#006 ????? ole_interface.Attach(GetOleInterface());

?

?

下面通過 = 操作符獲取 ITextDocument 接口,如果你深入去分析這個賦值操作符,會看到它自動去調用 IRichEditOle 的接口 IUnknown::QueryInterface 來查詢到 ITextDocument 接口,這個過程對于程序員來說是完全不用關心的,這就是使用 mutable CComQIPtr<ITextDocument> text_object_model_ 定義的作用。

?

#007 ????? text_object_model_ = ole_interface;

#008 ??? }

#009 ??? return text_object_model_;

#010 ? }

?

通過上面的分析,可見使用 CComQIPtr<ITextDocument> 智能指針可以省了很多 COM 調用的操作,這真是模板類的強大功能的使用之處。當把 ITextDocument 接口獲取回來之后,對于 RichEdit 操作就可以輕松訪問了, ScopedFreeze 類生成一個局部對象,這個對象實現了對 RichEdit 自動凍結和解凍結的功能,這個過程是通過局部對象在棧里生命周期的特性應用。如下面的代碼:

?

#001 ? AutocompleteEdit::ScopedFreeze::ScopedFreeze(AutocompleteEdit* edit,

#002 ?????????????????????????????????????????????? ITextDocument* text_object_model)

#003 ????? : edit_(edit),

#004 ??????? text_object_model_(text_object_model) {

#005 ??? // Freeze the screen.

#006 ??? if (text_object_model_) {

#007 ????? long count;

#008 ????? text_object_model_->Freeze(&count);

#009 ??? }

#010 ? }

#011 ?

#012 ? AutocompleteEdit::ScopedFreeze::~ScopedFreeze() {

#013 ??? // Unfreeze the screen.

#014 ??? // NOTE: If this destructor is reached while the edit is being destroyed (for

#015 ??? // example, because we double-clicked the edit of a popup and caused it to

#016 ??? // transform to an unconstrained window), it will no longer have an HWND, and

#017 ??? // text_object_model_ may point to a destroyed object, so do nothing here.

#018 ??? if (edit_->IsWindow() && text_object_model_) {

#019 ????? long count;

#020 ???? ? text_object_model_->Unfreeze(&count);

#021 ????? if (count == 0) {

?

這里需要手動地更新窗口的顯示。

#022 ??????? // We need to UpdateWindow() here instead of InvalidateRect() because, as

#023 ??????? // far as I can tell, the edit likes to synchronously erase its background

#024 ??????? // when unfreezing, thus requiring us to synchronously redraw if we don't

#025 ??????? // want flicker.

#026 ??????? edit_->UpdateWindow();

#027 ????? }

#028 ??? }

#029 ? }

?

從上面的代碼可以看到構造函數里凍結,析構造函數里解凍結,如果需要就會自動更新窗口的顯示。

?

通過上面的分析,學會使用 RichEdit 的凍結窗口的輸入,并且解凍結和更新窗口的顯示,也同時學會使用智能指針來操作 COM 接口的方便性,最后還學會了使用棧對象的生命周期來方便對加鎖和解鎖的操作,以便降低代碼的出錯率。

?

谷歌瀏覽器的源碼分析(8)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产日韩欧美成人 | 一级午夜a毛片免费视频 | 看全色黄大色黄大片爽一下 | 夜夜摸天天操 | 国内自拍在线观看 | 日日夜夜伊人 | 天天射天天射天天射 | 99久热re在线精品视频 | 日日日日日日bbbbb视频 | 日本特级视频 | 国产婷婷色综合成人精品 | 久久综合九色综合97婷婷女人 | 来自深渊在线观看 | 伊在人香蕉99久久 | 国产精品久久久久9999 | 国产成人精品久久一区二区小说 | a级片网址| 久久久免费网站 | 香蕉伊人网 | 欧美毛片aaaaa片久久久久 | 六月丁香深爱六月综合激情 | 99久久亚洲国产高清观看 | avav国产| 久久国产一区二区三区 | 久久精品视频在线播放 | 亚洲高清成人 | 曰本不卡视频 | 毛片b| 五月婷在线视频 | 美女视频免费在线观看 | 97在线观看免费版 | 99九九视频 | 亚洲欧洲国产精品 | 毛片免费观看的视频 | 香蕉综合网 | 欧美高清激情毛片 | 国内一级特黄女人精品片 | 毛片免费看看 | 看真人一级毛多毛片 | 天天操天天操天天操 | 一区二区三区不卡免费视频97 |