1. 程式人生 > >MFC對話方塊視窗使用GDI+給按鈕貼圖

MFC對話方塊視窗使用GDI+給按鈕貼圖

        最近要做一個有透明效果的按鈕出來,先是大致學了PS教程,製作一個PNG格式的背景透明的按鈕,如圖1所示。然後使用GDI+進行貼圖,最後要達到圖2所示效果。開發環境是VS2010,MFC。


圖1 PS製作的PNG格式按鈕


圖2 效果圖

    1、背景填充,可以使用圖片或者純色來填充,我使用的是純黑色;

    2、設定按鈕屬性為自繪,然後在dlg物件裡新增OnDrawItem訊息響應,在這個函式裡使用GDI+實現貼圖;

    本來以為按照上面的步驟就可以達到效果了,但事實是如圖3所示。


圖3 奇怪的效果

    圖3中看著好像是按鈕貼圖的透明背景不透明瞭,顯示成了灰白色。然後就開始調查這個問題。一開始以為是圖片出問題了,因為自己PS剛開始學,以為製作的PNG圖片背景不夠透明,但是實際上製作的時候已經選擇了透明背景了,所以排除了圖片的問題,所以應該還是背景和貼圖的問題。然後開始試驗除錯。

    1、第一種是將背景填充色去掉,然後按鈕是正常的,如圖4所示,沒有白邊。


圖4 去掉背景填充色

    2、按鈕不貼圖,背景還是填充顏色,當然按鈕還是自繪屬性。效果如圖5所示。


圖5 只填充背景色

       觀察圖片5,發現沒有給按鈕貼圖的時候按鈕是這樣顯示的,將圖5和圖3進行比較,發現貼圖的白邊實際上是按鈕的背景色,並不是貼圖的透明背景顯示出來了。背景填充的時候,只是填充了對話方塊的客戶區,並不會繪製按鈕,也就是說按鈕把背景那一塊區域給蓋上了。所以應該先將按鈕背景和對話方塊背景一樣進行填充之後,再進行貼圖。

       3、背景填充顏色,在OnDrawItem進行按鈕背景自繪,然後再貼圖,果然達到了如圖2所示的效果圖。

       但是問題又來了,因為現在背景填充純色, 所以相對簡單,如果背景是一張圖片呢,就要將按鈕對應的區域的背景圖擷取下來,然後繪製按鈕背景,感覺太麻煩了。但是也是一種辦法。

       後來又想,既然是按鈕將背景擋上了,那讓按鈕透明不就可以將背景顏色露出來了麼。

       4、背景顏色填充,在dlg對話方塊裡添加了OnCtlColor訊息響應,將按鈕背景色去掉,再貼圖。

if (pWnd->GetDlgCtrlID() == IDC_BTN_PNGBUTTON)
{
pDC->SetBkMode(TRANSPARENT); 
return HBRUSH(GetStockObject(NULL_BRUSH));
}

     編譯執行,達到了效果。