• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            萬星星@豌豆莢 歡迎加入我們
            一個吃軟飯的男人!!!!!我只想寫程序####
            微博:http://weibo.com/wanlianwen
            posts - 172,  comments - 1253,  trackbacks - 0

            最近工作上比較忙,加之編碼任務較多,沒來得及繼續之前的講解。抽出時間把這最重要的一部分東西做個闡述。行文以基本的編程思維及個人思考過程為線索。

             

            眾所周知,RichEdir強大在于其圖文混排(在這里不跟Word、HTML比),其中的圖替換為動態圖的核心問題就歸結于如何高效刷新。我們知道GDI操作是最消耗CPU的,所以刷新整個RichEdit窗口是不可取的,其副作用會導致更嚴重的閃爍問題。解決問題的思路很簡單:類似于拖拽時候在屏幕繪制異或線,我們的動畫重繪時不請求RichEdit,而直接在其窗口的DC上繪制當前動畫幀,此時缺少是如何確定該OLE的位置,這個是所有問題的關鍵。先看下面這幅圖:

             

            假定1-5全部都是GIF圖片,非GIF可以暫時無視,這個后面大家會非常清楚如何處理。在這個過程中,2不見了,而4是新出現的。對于4新出現時,RichEdit自身肯定會觸發其:

            Draw(
                DWORD dwDrawAspect, LONG lindex, void* pvAspect,
                DVTARGETDEVICE* ptd, HDC hicTargetDev, HDC hdcDraw,
                LPCRECTL prcBounds, LPCRECTL prcWBounds,
                BOOL (__stdcall *pfnContinue)(DWORD_PTR dwContinue),
                DWORD_PTR dwContinue)

             

            這個時候,我們知道新的GIF圖片進入可視區,可以把它添加到集合中。對于2的動畫觸發時間到來時,我們可以確定其位置且與可視區比對,發現其不再可視區,則從集合中移除。這樣就可以得到一個接近于(略大于)當前視口中的動畫控件集合,當有新的動畫觸發時間到來時,我們可以先檢查其是否在可視區,如果不在則不用GDI操作,僅僅更新其當前幀。當然這些工作你也可以不做,但是在動畫控件數量大的時候效率可能略有下降,主要是查找的過程(索引、位置)比較耗時。

             

            如何確定一個OLE的位置呢?由于我們插入OLE都使用了REO_BELOWBASELINE標志,也就是跟當前行的底部對齊,所以OLE左下角位置的精確度對我們來說很重要。看下圖:

            假設圖中黑框是一個OLE對象,其字符索引為CPN,假定第N+1行的第一個字符索引為CPN1,那么OLE左下角坐標={PosFromChar(CPN).x, PosFromChar(CPN1).y },PosFromChar這個是RichEdit提供的。問題的關鍵是最后一行怎么計算?此時沒有第N+1行。對于這種特殊情況,主要是Y坐標的計算,可以這樣考慮:Y=RichEdit內容高度-滾動條位置。猜測: 計算內容高度可能比較耗時,故QQ的聊天消息顯示部分強制在底部加了一行,以避免這種情況出現。

             

            得到左下角位置以后,可能你會覺得就萬事大吉了。錯!還有一個關鍵點!我們可以通過OLE的接口GetExtent得到其大小,然而這個大小沒有考慮縮放比例,所以你需要根據當前縮放比例進行計算,而這個計算牽扯到浮點數運算,過程中的來回不僅麻煩而且不精確,所以OLE的可視大小要想非常精確是不能通過計算來的。我們前面知道OLE繪制的時候會傳入可視范圍,假如我們保存下來是不是就可以解決問題了呢?當然,顯然,你可以試試!

            這些問題主要原因是RichEdit的很多接口方法沒有暴露,而Win8的SDK會做重大升級,很多之前的問題都會變成不是問題,或許還會引起更多的新特性,但是動畫本身的邏輯還是需要自己實現,或者會簡單許多,至于多少我還尚不清楚,但是目前來看這種方案效率足夠! 

             

            到了這里,核心技術應該大白天下,整個過程,我追求了位置的精準度,并據此獲得最小可視集合進行刷新優化。

             

            最新SDK&Demo,參見:http://code.google.com/p/im-solution/。希望你會喜歡!

            posted on 2012-09-08 18:10 萬連文 閱讀(4810) 評論(16)  編輯 收藏 引用 所屬分類: 小作品richedit

            FeedBack:
            # re: richedit研究06 – 高效動畫刷新
            2012-09-08 19:09 | iunkown
            問一下,GIF對應的IOleInPlaceSite::GetWindowContext 取到的位置是否準確?為什么要用GetExtent呢?

            我的一個實驗DEMO的SOURCE CODE如下,
            http://www.shnenglu.com/Files/mcs51a/GifDisplayCtrl.rar

            DEMO中代碼比較偷懶,可能有不準確的地方  回復  更多評論
              
            # re: richedit研究06 – 高效動畫刷新
            2012-09-08 19:39 | 萬連文
            @iunkown
            這個我沒有測試過,也沒有考慮過,不過確實是一種思路,你可以自己確認。但是我的方法未嘗不是好方法,不是么?


            后來我看了你的東西,覺得就是前面說的毫無章法,無頭蒼蠅。你的那個鏈接我看了,連運行一下的心情都木有。  回復  更多評論
              
            # re: richedit研究06 – 高效動畫刷新
            2012-09-08 20:04 | 路障
            呵呵,萬大俠,我之前以為你用了OLE接口的其它方法刷新的,原來也是直接在DC上面繪制的。

            我還想問個問題,當你在DC上面繪制GIF幀的時候,你如何獲取RichEdit的背景顏色或者背景圖片?因為自己直接在DC上面繪制時,是不會像在OLE接口的Draw()函數里面那樣,已經由系統先繪制了背景的。  回復  更多評論
              
            # re: richedit研究06 – 高效動畫刷新
            2012-09-08 20:06 | 萬連文
            @路障
            看我的Demo,看我的接口,你就會發現我是怎么做的!!給我點面子唄。  回復  更多評論
              
            # re: richedit研究06 – 高效動畫刷新
            2012-09-09 11:30 | Loaf
            一直RSS,博主非常高產啊……  回復  更多評論
              
            # re: richedit研究06 – 高效動畫刷新
            2012-09-09 12:32 | 萬連文
            @Loaf
            其實我非常少做項目,很多工作時間用來搞這些興趣。

            我個人表示對RSS不太了解,有點土鱉。  回復  更多評論
              
            # re: richedit研究06 – 高效動畫刷新
            2012-09-09 15:50 | 路障
            @萬連文

            萬大俠,之前的評論絕對沒有取笑的意思。還是多虧了萬大俠,提供了這么多篇網上幾乎沒有詳細講的教程,使我們受益良多。否則還要走更多的彎路呢。繼續膜拜萬大俠。
              回復  更多評論
              
            # re: richedit研究06 – 高效動畫刷新
            2012-09-12 14:07 | M77
            @Loaf

            google Reader的RSS鏈接出現錯誤了
              回復  更多評論
              
            # re: richedit研究06 – 高效動畫刷新
            2012-09-12 14:09 | M77
            @萬連文
            樓主這SDK頭文件寫得很有Google的范  回復  更多評論
              
            # re: richedit研究06 – 高效動畫刷新
            2012-09-12 14:28 | 萬連文
            @M77
            過獎,回頭一看又發現幾個不標準的地方,努力遵守Google規范。  回復  更多評論
              
            # re: richedit研究06 – 高效動畫刷新
            2013-01-05 03:28 | 程旭
            慨嘆天下文章一大抄,天下程序也是一大抄,就看你怎么抄,抄的有沒有思想,呵呵。老萬研究很透徹,盡管描述不適合初學者,但是非常不錯了。  回復  更多評論
              
            # re: richedit研究06 – 高效動畫刷新
            2013-01-05 20:36 | 程旭
            全部重建感覺放棄ATL太浪費,盡管Ctrl鍵按的次數不多,呵呵。重建了Create其他可以沿用ATL也可以,這方面效率沒影響。繪制方法對效率可差萬倍。所以重點還是對richedit的擴展,STL使用必不可少,不嫌費事當然可以自己寫鏈表之類的。不知 萬老師 現在又開始研究什么新東西了?  回復  更多評論
              
            # re: richedit研究06 – 高效動畫刷新
            2013-01-05 22:54 | 萬連文
            @程旭
            最近這幾個月從研究webkit,轉向虛擬機字節碼,然后有轉向IDA OD學習,比較閑散自由無目的,但是沒有偷懶就好。  回復  更多評論
              
            # re: richedit研究06 – 高效動畫刷新
            2013-01-07 01:16 | 程旭
            @萬連文
            IDA對沒加密的很好用,OD對付加密的絕佳。  回復  更多評論
              
            # re: richedit研究06 – 高效動畫刷新
            2013-01-11 07:14 | 程旭
            600動態表情同時顯示,CPU占用1%也許0%。  回復  更多評論
              
            # re: richedit研究06 – 高效動畫刷新
            2013-05-21 16:25 | 楊瀟
            我來這里是為了感謝博主@萬連文 的。博主提供了從動畫OLE類要實現的接口,到如何精確地找出需重繪的動畫這一整套信息,在思路上的參考價值再怎么高估也不過分。

            同時,通過對微軟WindowlessRE項目的參考,我終于成功地將無窗口模式的RichEdit、RichEdit動畫控件集成到了我們內部自己實現的DirectUI界面之中。

            萬大俠提供的思路讓我節省了大量時間,少走了N多彎路。

            再次謝謝萬大俠的分享!
              回復  更多評論
              
            簡歷下載
            聯系我

            <2011年8月>
            31123456
            78910111213
            14151617181920
            21222324252627
            28293031123
            45678910

            常用鏈接

            留言簿(66)

            隨筆分類

            隨筆檔案

            相冊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久婷婷五月综合色高清| 性高朝久久久久久久久久| 三级韩国一区久久二区综合| 国产精品久久久久久久| 久久国产精品无码一区二区三区| 久久久久久久久久久久久久| 一本一道久久a久久精品综合| 久久婷婷人人澡人人| 亚洲国产成人久久一区久久| 久久九九久精品国产| 色老头网站久久网| 亚洲国产精品无码久久久蜜芽| 伊人久久精品无码二区麻豆| 久久精品国产2020| 久久精品国产亚洲AV高清热| 国产人久久人人人人爽| 国产精品毛片久久久久久久| 久久www免费人成看国产片| 人人狠狠综合88综合久久| 亚洲精品乱码久久久久久久久久久久| 人人狠狠综合久久88成人| 色综合久久久久网| 亚洲精品成人久久久| 狼狼综合久久久久综合网| 嫩草影院久久99| 亚洲精品国产综合久久一线| 久久人人爽人人爽人人片AV不| 亚洲∧v久久久无码精品| 岛国搬运www久久| 亚洲午夜久久久久久久久电影网| 99久久久国产精品免费无卡顿| 久久人人爽人人澡人人高潮AV| 精品久久亚洲中文无码| 91精品国产高清91久久久久久| 久久中文精品无码中文字幕| 麻豆亚洲AV永久无码精品久久| 久久久久99精品成人片牛牛影视| 天天躁日日躁狠狠久久| 亚洲美日韩Av中文字幕无码久久久妻妇 | 久久亚洲电影| 久久精品www|