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

谷歌瀏覽器的源碼分析(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條評論
主站蜘蛛池模板: 成人精品视频一区二区三区 | 日韩专区亚洲精品欧美专区 | 成人免费视频在线看 | 亚洲综合一二三 | 国产亚洲精品久久久久久久网站 | 欧美一级毛片日本 | 成人影院免费观看 | 波多野结中文字幕在线69视频 | 久久久久久九 | 性做久久久久久久久男女 | 天天做天天爱天天怼 | 欧美精品v欧洲高清 | 欧美激情亚洲激情 | 在线观看免费黄色小视频 | 中文字幕不卡在线播放 | 亚洲欧美日韩精品久久久 | 亚洲码欧美码一区二区三区 | 国产欧美成人免费观看视频 | 国产毛片哪里有 | 日韩综合 | 欧美aaa毛片免费看 欧美aaa性bbb毛片 | 亚洲乱码一区二区三区国产精品 | 前田香织一区二区中文字幕 | 成人亚洲欧美 | 中文字幕在线观看亚洲日韩 | 北条麻妃手机在线观看 | 亚洲精品成人网 | 四虎永久免费地址在线网站 | 午夜手机看片 | 欧美精品www| 亚洲综合国产一区二区三区 | 国产精品一区二区免费 | 热99视频 | 狠狠色欧美亚洲综合色黑a 狠狠色视频 | 黄色高清在线观看 | 国产精品一区伦免视频播放 | 日韩在线观看中文字幕 | 日日噜噜夜夜躁躁狠狠 | 久久天堂成人影院 | 亚洲精品mv在线观看 | 日本精品一二三区 |