国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于LayeredWindow的異形窗體局部刷新

2014-03-06 23:49:14魏振鋼張恩偉
中文信息 2014年2期
關(guān)鍵詞:窗體畫布異形

魏振鋼 張恩偉

摘 要:通過對(duì)現(xiàn)存界面庫的分析,解釋當(dāng)前異形窗體的創(chuàng)建與刷新的難點(diǎn),及刷新時(shí)CPU占用率高的問題,通過對(duì)updateLayeredwindow接口的深度剖析,闡述了利用雙界面合成的方法來模擬局部刷新。采用先對(duì)局部窗體重繪,然后與原界面合成的方法,大量減小了刷新時(shí)的重繪量,從而大幅度減輕了CPU的占用率。

關(guān)鍵詞:界面 異形窗體updateLayeredwindow 局部刷新

中圖分類號(hào):TP3011.11 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1003-9082(2014)02-0001-02

一、引言

隨著計(jì)算機(jī)的發(fā)展,當(dāng)今用戶對(duì)應(yīng)用軟件不再僅僅滿足于功能的完善,而且對(duì)用戶界面友好性、美觀性要求越來越高。所以,以往的桌面應(yīng)用程序開發(fā)并不能滿足這些界面開發(fā)要求,這就致使越來越多的界面庫的涌現(xiàn),而現(xiàn)今的界面庫大都基于DirectUI的設(shè)計(jì)思想[1],但由于原有窗體是規(guī)則的,所以根本無法實(shí)現(xiàn)異形窗體。隨著微軟分層窗體的設(shè)計(jì)思想及UpdateLayeredWindow函數(shù)的出現(xiàn),異形窗體的實(shí)現(xiàn)才真正成為可能。但由于UpdateLayeredWindow本身的特性導(dǎo)致每次都必須全部重繪整個(gè)程序界面,所以即便是一個(gè)像素的改變,都將導(dǎo)致整個(gè)窗體的刷新,這對(duì)于CPU的占用是非常巨大的,尤其在大型軟件中,這將是災(zāi)難性的。

本文在解析分層窗體和UpdateLayeredWindow的基礎(chǔ)上,利用雙界面合成的方法模擬實(shí)現(xiàn)異形界面的局部刷新,徹底解決了異形窗體的刷新問題,為DirectUI實(shí)現(xiàn)異形窗體掃除了一大障礙,為界面庫的研究提供了新方法,新思路。

二、異形窗體與局部刷新技術(shù)

1.異形窗體簡(jiǎn)介

1.1分層窗體簡(jiǎn)介

在創(chuàng)建窗體時(shí),擁有擴(kuò)展屬性WS_EX_LAYERED的窗體就是分層窗體了。通過分層窗體,我們可以實(shí)現(xiàn)異形、具有alpha值的窗體,另外還能為窗體實(shí)現(xiàn)動(dòng)作,解決了以往的純靜態(tài)窗體的現(xiàn)實(shí)。對(duì)于分層窗體的繪圖機(jī)制,可以有兩種選擇,其一是采用以往的WM_PAINT消息響應(yīng)機(jī)制及局部刷新技術(shù),但這種方法無法實(shí)現(xiàn)異形窗體。其二就是使用UpdateLayeredWindow函數(shù),將繪圖工作由系統(tǒng)托管,用戶只需告訴系統(tǒng)需要繪制哪些圖像;

1.2 UpdateLayeredWindow函數(shù)簡(jiǎn)介及現(xiàn)存問題

UpdateLayeredWindow函數(shù)是WIN32 API里功能非常強(qiáng)大的一個(gè)函數(shù)。通過在內(nèi)存DC上作畫,然后把該DC傳遞給UpdateLayeredWindow,系統(tǒng)就會(huì)托管后面的圖像儲(chǔ)存、壓縮、渲染等工作,并且所有的繪圖工作都由UpdateLayeredWindow來執(zhí)行,也就是說你在內(nèi)存DC上畫了什么,就會(huì)顯示出來什么[2]。

UpdateLayeredWindow改變了以往窗體繪制方式,由于每次繪圖都要由UpdateLayeredWindow來操作,所以每次我們都要畫出當(dāng)前的整個(gè)應(yīng)用程序界面,這就導(dǎo)致每次都要重新繪制整個(gè)窗體。這樣就引起了我們引言中講到的CPU占用高的問題。正是由于這個(gè)問題,當(dāng)今的所有開源界面庫全部都沒有基于UpdateLayeredWindow來實(shí)現(xiàn)界面,當(dāng)然也就無法實(shí)現(xiàn)異形,所以對(duì)于異形窗體,如何實(shí)現(xiàn)局部刷新是必須要解決的。

2.雙界面合成方法模擬實(shí)現(xiàn)局部刷新

通過上節(jié)的講解,全部刷新是由于UpdateLayeredWindow自身實(shí)現(xiàn)的問題,所以我們無法更改,所以我們只有采用模擬的方法來實(shí)現(xiàn)局部刷新。

如圖一所示,原界面上有三個(gè)按鈕控件,均為橢圓狀,虛線框表示每個(gè)控件的大小,實(shí)際并不存在,這里要實(shí)現(xiàn)的效果是,當(dāng)用戶點(diǎn)擊第一個(gè)控件時(shí),將其改變成另一樣式(菱形),雙界面合成方法實(shí)現(xiàn)局部刷新的過程如下:

2.1首先,保存原界面;(步驟一)

眾所周知,在WINDOWS程序中,繪圖DC是與畫布相關(guān)聯(lián)的,只要我們的畫布不銷毀,界面就不會(huì)改變。所以,我們先保存上次的畫布,為合成最新的畫布做準(zhǔn)備。

2.2創(chuàng)建一個(gè)臨時(shí)畫布,并在其上畫出當(dāng)前最新的控件樣式及其背景;(步驟二)

2.4將最新繪制的控件及其背景根據(jù)更新區(qū)域大小進(jìn)行裁剪;(步驟四)

2.5將裁剪后的圖像與原圖像摳圖進(jìn)行合成,形成最終的軟件界面;(步驟五)

2.6將最終的軟件界面?zhèn)鬟f給UpdateLayeredWindow顯示出來即可;

三、結(jié)論

通過研究分層窗體,實(shí)現(xiàn)了局部刷新技術(shù),解決了當(dāng)前所有的界面庫都無法創(chuàng)建異形的問題,另外在此基礎(chǔ)上,在繪圖時(shí),可以使用GDI+繪畫技術(shù),而不會(huì)出現(xiàn)穿透性問題,同時(shí)解決了GDI+與異形窗體的融合性問題。當(dāng)然對(duì)于界面庫而言,興起時(shí)間也不長,對(duì)于異形窗體的實(shí)現(xiàn)更是具有難度的,我相信對(duì)于異形窗體的研究會(huì)出現(xiàn)更多的成果,就要靠大家在實(shí)踐中慢慢摸索了。

參考文獻(xiàn)

[1]BjarkeViksoe.UI: Become windowless.[20011-9-16] .http://www.viksoe.dk/code/windowless1.htm

[2] VadimGorokhovsky, Lou Amadio .MSDN—LayeredWindow.[2010-7] http://msdn.microsoft.com/en-us/library/ms997507.aspx

摘 要:通過對(duì)現(xiàn)存界面庫的分析,解釋當(dāng)前異形窗體的創(chuàng)建與刷新的難點(diǎn),及刷新時(shí)CPU占用率高的問題,通過對(duì)updateLayeredwindow接口的深度剖析,闡述了利用雙界面合成的方法來模擬局部刷新。采用先對(duì)局部窗體重繪,然后與原界面合成的方法,大量減小了刷新時(shí)的重繪量,從而大幅度減輕了CPU的占用率。

關(guān)鍵詞:界面 異形窗體updateLayeredwindow 局部刷新

中圖分類號(hào):TP3011.11 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1003-9082(2014)02-0001-02

一、引言

隨著計(jì)算機(jī)的發(fā)展,當(dāng)今用戶對(duì)應(yīng)用軟件不再僅僅滿足于功能的完善,而且對(duì)用戶界面友好性、美觀性要求越來越高。所以,以往的桌面應(yīng)用程序開發(fā)并不能滿足這些界面開發(fā)要求,這就致使越來越多的界面庫的涌現(xiàn),而現(xiàn)今的界面庫大都基于DirectUI的設(shè)計(jì)思想[1],但由于原有窗體是規(guī)則的,所以根本無法實(shí)現(xiàn)異形窗體。隨著微軟分層窗體的設(shè)計(jì)思想及UpdateLayeredWindow函數(shù)的出現(xiàn),異形窗體的實(shí)現(xiàn)才真正成為可能。但由于UpdateLayeredWindow本身的特性導(dǎo)致每次都必須全部重繪整個(gè)程序界面,所以即便是一個(gè)像素的改變,都將導(dǎo)致整個(gè)窗體的刷新,這對(duì)于CPU的占用是非常巨大的,尤其在大型軟件中,這將是災(zāi)難性的。

本文在解析分層窗體和UpdateLayeredWindow的基礎(chǔ)上,利用雙界面合成的方法模擬實(shí)現(xiàn)異形界面的局部刷新,徹底解決了異形窗體的刷新問題,為DirectUI實(shí)現(xiàn)異形窗體掃除了一大障礙,為界面庫的研究提供了新方法,新思路。

二、異形窗體與局部刷新技術(shù)

1.異形窗體簡(jiǎn)介

1.1分層窗體簡(jiǎn)介

在創(chuàng)建窗體時(shí),擁有擴(kuò)展屬性WS_EX_LAYERED的窗體就是分層窗體了。通過分層窗體,我們可以實(shí)現(xiàn)異形、具有alpha值的窗體,另外還能為窗體實(shí)現(xiàn)動(dòng)作,解決了以往的純靜態(tài)窗體的現(xiàn)實(shí)。對(duì)于分層窗體的繪圖機(jī)制,可以有兩種選擇,其一是采用以往的WM_PAINT消息響應(yīng)機(jī)制及局部刷新技術(shù),但這種方法無法實(shí)現(xiàn)異形窗體。其二就是使用UpdateLayeredWindow函數(shù),將繪圖工作由系統(tǒng)托管,用戶只需告訴系統(tǒng)需要繪制哪些圖像;

1.2 UpdateLayeredWindow函數(shù)簡(jiǎn)介及現(xiàn)存問題

UpdateLayeredWindow函數(shù)是WIN32 API里功能非常強(qiáng)大的一個(gè)函數(shù)。通過在內(nèi)存DC上作畫,然后把該DC傳遞給UpdateLayeredWindow,系統(tǒng)就會(huì)托管后面的圖像儲(chǔ)存、壓縮、渲染等工作,并且所有的繪圖工作都由UpdateLayeredWindow來執(zhí)行,也就是說你在內(nèi)存DC上畫了什么,就會(huì)顯示出來什么[2]。

UpdateLayeredWindow改變了以往窗體繪制方式,由于每次繪圖都要由UpdateLayeredWindow來操作,所以每次我們都要畫出當(dāng)前的整個(gè)應(yīng)用程序界面,這就導(dǎo)致每次都要重新繪制整個(gè)窗體。這樣就引起了我們引言中講到的CPU占用高的問題。正是由于這個(gè)問題,當(dāng)今的所有開源界面庫全部都沒有基于UpdateLayeredWindow來實(shí)現(xiàn)界面,當(dāng)然也就無法實(shí)現(xiàn)異形,所以對(duì)于異形窗體,如何實(shí)現(xiàn)局部刷新是必須要解決的。

2.雙界面合成方法模擬實(shí)現(xiàn)局部刷新

通過上節(jié)的講解,全部刷新是由于UpdateLayeredWindow自身實(shí)現(xiàn)的問題,所以我們無法更改,所以我們只有采用模擬的方法來實(shí)現(xiàn)局部刷新。

如圖一所示,原界面上有三個(gè)按鈕控件,均為橢圓狀,虛線框表示每個(gè)控件的大小,實(shí)際并不存在,這里要實(shí)現(xiàn)的效果是,當(dāng)用戶點(diǎn)擊第一個(gè)控件時(shí),將其改變成另一樣式(菱形),雙界面合成方法實(shí)現(xiàn)局部刷新的過程如下:

2.1首先,保存原界面;(步驟一)

眾所周知,在WINDOWS程序中,繪圖DC是與畫布相關(guān)聯(lián)的,只要我們的畫布不銷毀,界面就不會(huì)改變。所以,我們先保存上次的畫布,為合成最新的畫布做準(zhǔn)備。

2.2創(chuàng)建一個(gè)臨時(shí)畫布,并在其上畫出當(dāng)前最新的控件樣式及其背景;(步驟二)

2.4將最新繪制的控件及其背景根據(jù)更新區(qū)域大小進(jìn)行裁剪;(步驟四)

2.5將裁剪后的圖像與原圖像摳圖進(jìn)行合成,形成最終的軟件界面;(步驟五)

2.6將最終的軟件界面?zhèn)鬟f給UpdateLayeredWindow顯示出來即可;

三、結(jié)論

通過研究分層窗體,實(shí)現(xiàn)了局部刷新技術(shù),解決了當(dāng)前所有的界面庫都無法創(chuàng)建異形的問題,另外在此基礎(chǔ)上,在繪圖時(shí),可以使用GDI+繪畫技術(shù),而不會(huì)出現(xiàn)穿透性問題,同時(shí)解決了GDI+與異形窗體的融合性問題。當(dāng)然對(duì)于界面庫而言,興起時(shí)間也不長,對(duì)于異形窗體的實(shí)現(xiàn)更是具有難度的,我相信對(duì)于異形窗體的研究會(huì)出現(xiàn)更多的成果,就要靠大家在實(shí)踐中慢慢摸索了。

參考文獻(xiàn)

[1]BjarkeViksoe.UI: Become windowless.[20011-9-16] .http://www.viksoe.dk/code/windowless1.htm

[2] VadimGorokhovsky, Lou Amadio .MSDN—LayeredWindow.[2010-7] http://msdn.microsoft.com/en-us/library/ms997507.aspx

摘 要:通過對(duì)現(xiàn)存界面庫的分析,解釋當(dāng)前異形窗體的創(chuàng)建與刷新的難點(diǎn),及刷新時(shí)CPU占用率高的問題,通過對(duì)updateLayeredwindow接口的深度剖析,闡述了利用雙界面合成的方法來模擬局部刷新。采用先對(duì)局部窗體重繪,然后與原界面合成的方法,大量減小了刷新時(shí)的重繪量,從而大幅度減輕了CPU的占用率。

關(guān)鍵詞:界面 異形窗體updateLayeredwindow 局部刷新

中圖分類號(hào):TP3011.11 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1003-9082(2014)02-0001-02

一、引言

隨著計(jì)算機(jī)的發(fā)展,當(dāng)今用戶對(duì)應(yīng)用軟件不再僅僅滿足于功能的完善,而且對(duì)用戶界面友好性、美觀性要求越來越高。所以,以往的桌面應(yīng)用程序開發(fā)并不能滿足這些界面開發(fā)要求,這就致使越來越多的界面庫的涌現(xiàn),而現(xiàn)今的界面庫大都基于DirectUI的設(shè)計(jì)思想[1],但由于原有窗體是規(guī)則的,所以根本無法實(shí)現(xiàn)異形窗體。隨著微軟分層窗體的設(shè)計(jì)思想及UpdateLayeredWindow函數(shù)的出現(xiàn),異形窗體的實(shí)現(xiàn)才真正成為可能。但由于UpdateLayeredWindow本身的特性導(dǎo)致每次都必須全部重繪整個(gè)程序界面,所以即便是一個(gè)像素的改變,都將導(dǎo)致整個(gè)窗體的刷新,這對(duì)于CPU的占用是非常巨大的,尤其在大型軟件中,這將是災(zāi)難性的。

本文在解析分層窗體和UpdateLayeredWindow的基礎(chǔ)上,利用雙界面合成的方法模擬實(shí)現(xiàn)異形界面的局部刷新,徹底解決了異形窗體的刷新問題,為DirectUI實(shí)現(xiàn)異形窗體掃除了一大障礙,為界面庫的研究提供了新方法,新思路。

二、異形窗體與局部刷新技術(shù)

1.異形窗體簡(jiǎn)介

1.1分層窗體簡(jiǎn)介

在創(chuàng)建窗體時(shí),擁有擴(kuò)展屬性WS_EX_LAYERED的窗體就是分層窗體了。通過分層窗體,我們可以實(shí)現(xiàn)異形、具有alpha值的窗體,另外還能為窗體實(shí)現(xiàn)動(dòng)作,解決了以往的純靜態(tài)窗體的現(xiàn)實(shí)。對(duì)于分層窗體的繪圖機(jī)制,可以有兩種選擇,其一是采用以往的WM_PAINT消息響應(yīng)機(jī)制及局部刷新技術(shù),但這種方法無法實(shí)現(xiàn)異形窗體。其二就是使用UpdateLayeredWindow函數(shù),將繪圖工作由系統(tǒng)托管,用戶只需告訴系統(tǒng)需要繪制哪些圖像;

1.2 UpdateLayeredWindow函數(shù)簡(jiǎn)介及現(xiàn)存問題

UpdateLayeredWindow函數(shù)是WIN32 API里功能非常強(qiáng)大的一個(gè)函數(shù)。通過在內(nèi)存DC上作畫,然后把該DC傳遞給UpdateLayeredWindow,系統(tǒng)就會(huì)托管后面的圖像儲(chǔ)存、壓縮、渲染等工作,并且所有的繪圖工作都由UpdateLayeredWindow來執(zhí)行,也就是說你在內(nèi)存DC上畫了什么,就會(huì)顯示出來什么[2]。

UpdateLayeredWindow改變了以往窗體繪制方式,由于每次繪圖都要由UpdateLayeredWindow來操作,所以每次我們都要畫出當(dāng)前的整個(gè)應(yīng)用程序界面,這就導(dǎo)致每次都要重新繪制整個(gè)窗體。這樣就引起了我們引言中講到的CPU占用高的問題。正是由于這個(gè)問題,當(dāng)今的所有開源界面庫全部都沒有基于UpdateLayeredWindow來實(shí)現(xiàn)界面,當(dāng)然也就無法實(shí)現(xiàn)異形,所以對(duì)于異形窗體,如何實(shí)現(xiàn)局部刷新是必須要解決的。

2.雙界面合成方法模擬實(shí)現(xiàn)局部刷新

通過上節(jié)的講解,全部刷新是由于UpdateLayeredWindow自身實(shí)現(xiàn)的問題,所以我們無法更改,所以我們只有采用模擬的方法來實(shí)現(xiàn)局部刷新。

如圖一所示,原界面上有三個(gè)按鈕控件,均為橢圓狀,虛線框表示每個(gè)控件的大小,實(shí)際并不存在,這里要實(shí)現(xiàn)的效果是,當(dāng)用戶點(diǎn)擊第一個(gè)控件時(shí),將其改變成另一樣式(菱形),雙界面合成方法實(shí)現(xiàn)局部刷新的過程如下:

2.1首先,保存原界面;(步驟一)

眾所周知,在WINDOWS程序中,繪圖DC是與畫布相關(guān)聯(lián)的,只要我們的畫布不銷毀,界面就不會(huì)改變。所以,我們先保存上次的畫布,為合成最新的畫布做準(zhǔn)備。

2.2創(chuàng)建一個(gè)臨時(shí)畫布,并在其上畫出當(dāng)前最新的控件樣式及其背景;(步驟二)

2.4將最新繪制的控件及其背景根據(jù)更新區(qū)域大小進(jìn)行裁剪;(步驟四)

2.5將裁剪后的圖像與原圖像摳圖進(jìn)行合成,形成最終的軟件界面;(步驟五)

2.6將最終的軟件界面?zhèn)鬟f給UpdateLayeredWindow顯示出來即可;

三、結(jié)論

通過研究分層窗體,實(shí)現(xiàn)了局部刷新技術(shù),解決了當(dāng)前所有的界面庫都無法創(chuàng)建異形的問題,另外在此基礎(chǔ)上,在繪圖時(shí),可以使用GDI+繪畫技術(shù),而不會(huì)出現(xiàn)穿透性問題,同時(shí)解決了GDI+與異形窗體的融合性問題。當(dāng)然對(duì)于界面庫而言,興起時(shí)間也不長,對(duì)于異形窗體的實(shí)現(xiàn)更是具有難度的,我相信對(duì)于異形窗體的研究會(huì)出現(xiàn)更多的成果,就要靠大家在實(shí)踐中慢慢摸索了。

參考文獻(xiàn)

[1]BjarkeViksoe.UI: Become windowless.[20011-9-16] .http://www.viksoe.dk/code/windowless1.htm

[2] VadimGorokhovsky, Lou Amadio .MSDN—LayeredWindow.[2010-7] http://msdn.microsoft.com/en-us/library/ms997507.aspx

猜你喜歡
窗體畫布異形
商業(yè)模式畫布
為什么要在畫布上割一刀?
試談Access 2007數(shù)據(jù)庫在林業(yè)檔案管理中的應(yīng)用
檔案天地(2019年5期)2019-06-12 05:12:02
讓鮮花在畫布上盛開
一種異形平衡梁設(shè)計(jì)與應(yīng)用
水晶異形卡可以定制的交通卡
汽車與安全(2017年7期)2017-08-03 17:20:12
水晶異形卡可以定制的交通卡
汽車與安全(2017年6期)2017-07-25 09:57:08
水晶異形卡 可以定制的交通卡
汽車與安全(2017年3期)2017-04-26 01:25:27
大師的畫布
數(shù)組矩陣虛擬窗體算法在自動(dòng)分揀系統(tǒng)設(shè)計(jì)中的應(yīng)用
福海县| 宾阳县| 江津市| 库车县| 张掖市| 广安市| 涟水县| 灵台县| 浦江县| 敦煌市| 铜梁县| 孝义市| 砚山县| 佛学| 仪陇县| 蒙自县| 萨迦县| 英吉沙县| 龙游县| 东乌珠穆沁旗| 醴陵市| 会东县| 吴旗县| 渝中区| 祁东县| 蒙城县| 响水县| 历史| 独山县| 进贤县| 洪泽县| 呼图壁县| 株洲县| 平乐县| 武安市| 寿宁县| 罗江县| 静宁县| 民丰县| 精河县| 蒙自县|