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

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

系統(tǒng) 2685 0
?

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

ScopedFreeze freeze(this, GetTextObjectModel());

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

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

?

先判斷這個(gè)接口是否獲取到,如果已經(jīng)獲取到就不再去重復(fù)獲取了。

#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 接口,如果你深入去分析這個(gè)賦值操作符,會(huì)看到它自動(dòng)去調(diào)用 IRichEditOle 的接口 IUnknown::QueryInterface 來查詢到 ITextDocument 接口,這個(gè)過程對(duì)于程序員來說是完全不用關(guān)心的,這就是使用 mutable CComQIPtr<ITextDocument> text_object_model_ 定義的作用。

?

#007 ????? text_object_model_ = ole_interface;

#008 ??? }

#009 ??? return text_object_model_;

#010 ? }

?

通過上面的分析,可見使用 CComQIPtr<ITextDocument> 智能指針可以省了很多 COM 調(diào)用的操作,這真是模板類的強(qiáng)大功能的使用之處。當(dāng)把 ITextDocument 接口獲取回來之后,對(duì)于 RichEdit 操作就可以輕松訪問了, ScopedFreeze 類生成一個(gè)局部對(duì)象,這個(gè)對(duì)象實(shí)現(xiàn)了對(duì) RichEdit 自動(dòng)凍結(jié)和解凍結(jié)的功能,這個(gè)過程是通過局部對(duì)象在棧里生命周期的特性應(yīng)用。如下面的代碼:

?

#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) {

?

這里需要手動(dòng)地更新窗口的顯示。

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

?

從上面的代碼可以看到構(gòu)造函數(shù)里凍結(jié),析構(gòu)造函數(shù)里解凍結(jié),如果需要就會(huì)自動(dòng)更新窗口的顯示。

?

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

?

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


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

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

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 日本亚洲一区二区 | 四虎影视在线播放 | 99精品视频在线在线视频观看 | 男人的天堂久久精品激情 | 无人码一区二区三区视频 | 四虎影院视频 | 四虎影院免费观看 | 成人影院高清在线观看免费网站 | 欧美日韩亚洲无线码在线观看 | 一级特黄一欧美俄罗斯毛片 | 亚洲rv国产rv日本rv | 九九国产精品视频 | 国产一区二区在免费观看 | 成人看片黄a毛片 | 四虎com | 4虎最新网址 | 中国一级特黄特级毛片 | 日韩欧美在线免费观看 | 黄色.www| 日本黄页网站在线观看 | 欧美.成人.综合在线 | 精品视频在线观看一区二区三区 | 一个色综合亚洲色综合 | 欧美经典人人爽人人爽人人片 | 日韩中文字幕在线亚洲一区 | 成人在线视频观看 | 国产区久久 | 松永纱奈在线观看 | 久久4| 色婷婷精品视频 | 日本一级黄色毛片 | 欧美毛片在线 | 色视频一区二区三区 | 午夜精品久久久久久毛片 | 国产精品98福利小视频 | 久草免费在线视频观看 | 国产美女流白浆的免费视 | 国内精品欧美久久精品 | 中文字幕一区在线 | 91精品久久久久含羞草 | 老妇色 |