什麼是“控件半透明效果” ?
如下圖所示,美圖秀秀中間的四個按鈕,邊緣四個角都是透明的,呈現出橢圓效果:
熟悉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 我自繪了一個邊角橢圓的按鈕和編輯框 如下圖所示: