您好,登錄后才能下訂單哦!
說明
當(dāng)父窗口的大小發(fā)生改變的時(shí)候,父窗口的OnSize函數(shù)優(yōu)先調(diào)用,然后遍歷子窗口的OnSize函數(shù)。在自定義控件,并且實(shí)現(xiàn)隨著父窗口的大小,進(jìn)行伸縮變換,可以創(chuàng)建一個(gè)比例尺因子,根據(jù)父窗口當(dāng)前的大小,在父窗口的OnSize函數(shù)中調(diào)用子控件的兩個(gè)方法進(jìn)行子控件大小和位置的調(diào)整:
SetPosition設(shè)置子控件的位置
SetClientSize設(shè)置子控件的大小
問題
為了能夠?qū)崿F(xiàn)界面的拉伸,當(dāng)窗口發(fā)生改變的時(shí)候,發(fā)出重繪事件(OnSize會(huì)調(diào)用OnPaint)進(jìn)行界面的刷新,可以看到在快速伸縮窗口的情況下,非常明顯看到閃爍的情況。
解析
在系統(tǒng)設(shè)置最佳的外觀性能要求,拉伸界面的邊框,會(huì)出現(xiàn)虛擬邊框,等到鼠標(biāo)彈起的時(shí)候,才會(huì)重新渲染界面,避免了閃爍。在其他的外觀選項(xiàng)下,拉伸界面邊框的時(shí)候,實(shí)時(shí)的渲染,會(huì)產(chǎn)生閃爍現(xiàn)象
真正自定義渲染
目前想到的一個(gè)解決方案:當(dāng)鼠標(biāo)按下拖動(dòng)窗口的時(shí)候,并不進(jìn)行窗口的重繪,而是等到鼠標(biāo)彈起的時(shí)候,才進(jìn)行重繪,這里就涉及到一個(gè)難點(diǎn),該在什么地方關(guān)聯(lián)鼠標(biāo)彈起事件EVT_LEFT_UP,并且需要實(shí)時(shí)控制邊框的渲染
注意
當(dāng)父控件銷毀的時(shí)候,也會(huì)調(diào)用子控件的析構(gòu)函數(shù),對子控件進(jìn)行銷毀
兩次進(jìn)入OnSize函數(shù)的問題
啟動(dòng)程序,在準(zhǔn)備進(jìn)入到主界面,渲染自定義的控件時(shí)候,檢測到有兩次進(jìn)入到OnSize函數(shù),導(dǎo)致界面在進(jìn)入的時(shí)候,渲染了兩次,目前不清楚是什么地方發(fā)送了兩次WM_ONSIZE消息,導(dǎo)致該問題
懷疑方向
1 是否是設(shè)置了父窗口指針:證實(shí)必須提供一個(gè)父窗口的指針
2 是否是設(shè)置了擴(kuò)展屬性WX_EXPAND:沒有理由根據(jù)
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。