MFC 幾種子控制項半透明效果的實現辦法

2021-07-29 19:21:44 字數 1092 閱讀 9510

什麼是「控制項半透明效果」 ?

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

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

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

很多場景下 需要在子控制項的區域顯示其父視窗的畫面 表現出「子控制項的這個區域是透明的」

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

實現方法有哪些?

1、純色背景

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

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

2、拷貝父視窗對應區域的dc資料

當繪製子控制項時 先拷貝父視窗對應區域的dc資料 用其填充子控制項的畫布

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

解決了陰影的bug 但依舊有使用限制:如果父視窗的背景變化了 子控制項無法得到通知 

如何讓子控制項實時地收到通知? 可以參考cbuttonst裡面的邏輯 具體我已經忘記了 大家可以自己去看原始碼)

3、渲染父視窗時 儲存父視窗的畫布背景 

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

具體辦法:

a、渲染父視窗時 在父視窗類中 用資料成員hdc m_canvascache儲存父視窗的背景

b、渲染子控制項時 先用父視窗m_canvascache對應區域的資料 填充子控制項的畫布

C GDI 半透明的陰影效果

利用 gdi 可以很容易的描畫出逼真的半透明效果的陰影。void drawshadow graphics g,graphicspath buttonpath int count 1 brush.setsurroundcolors colors,count brush.setfocusscales 0...

產生半透明效果的步驟

要製作半透明效果,必須先決定圖形所要顯示的透明度,例如透明度100 就是完全透明,透明度50 就是半透明。下面就來說明製作半透明效果的步驟 步驟一 取出點陣圖的各個畫素點,將各畫素點的rgb值乘以透明度百分比,然後將它放入到乙個記憶體陣列中。步驟二 取出背景圖與點陣圖重疊部分的畫素點,將各畫素點的r...

C GDI 半透明的陰影效果

利用 gdi 可以很容易的描畫出逼真的半透明效果的陰影。void drawshadow graphics g,graphicspath buttonpath int count 1 brush.setsurroundcolors colors,count brush.setfocusscales 0...