什麼是「控制項半透明效果」 ?
如下圖所示,美圖秀秀中間的四個按鈕,邊緣四個角都是透明的,呈現出橢圓效果:
熟悉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...