[MFC] 幾種子控件半透明效果的實現辦法

什麼是“控件半透明效果” ?

如下圖所示,美圖秀秀中間的四個按鈕,邊緣四個角都是透明的,呈現出橢圓效果:



熟悉MFC開發的都知道 雖然四個按鈕的邊緣是橢圓的 實際上橢圓之外的角落 也屬於子控件的窗口區域 

即:如下圖所示 雖然子控件的四個角是橢圓 但是橢圓之外的區域(即黑框與黃框之間的區域) 也屬於子控件的窗口區域


很多場景下 需要在子控件的區域顯示其父窗口的畫面 表現出“子控件的這個區域是透明的”

這個區域的UI如何繪製 就是實現這個UI效果的關鍵了


實現方法有哪些?


1、純色背景

這也是最簡單的方法 即父窗口的背景色 採用純色背景  當繪製子控件時 先用對應的純色FillRect 填充子控件的畫布

這個方法簡單 但應用場景限制太大:如果父窗口的背景色不是純色 方法就無效了


2、拷貝父窗口對應區域的dc數據

當繪製子控件時 先拷貝父窗口對應區域的dc數據 用其填充子控件的畫布

關鍵詞:GetDC(GetParent())、BitBlt

但是有個問題 多次渲染後 發現子控件上有陰影問題 網上有這個bug的解決辦法  

解決了陰影的bug 但依舊有使用限制:如果父窗口的背景變化了 子控件無法得到通知 
如何讓子控件實時地收到通知? 可以參考CButtonST裏面的邏輯 具體我已經忘記了 大家可以自己去看源碼)


3、渲染父窗口時 保存父窗口的畫布背景 

與方法2類似 依舊是畫布拷貝 不過此時父窗口的畫布獲取 不再使用GetDC(GetParent()) 

具體辦法:

a、渲染父窗口時 在父窗口類中 用數據成員HDC m_CanvasCache保存父窗口的背景

b、渲染子控件時 先用父窗口m_CanvasCache對應區域的數據 填充子控件的畫布

按照方法3 我自繪了一個邊角橢圓的按鈕和編輯框 如下圖所示:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章