1. 程式人生 > >vs2010 MFC設定控制元件背景透明

vs2010 MFC設定控制元件背景透明

通常要設定控制元件背景色透明,原因是在對話方塊背景中使用了圖片。對於這種情況,在vs2010中應當呼叫SetBackgroundImage函式來實現背景圖片的顯示。

BOOL CMFCDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // 設定此對話方塊的圖示。當應用程式主視窗不是對話方塊時,框架將自動
    //  執行此操作
    SetIcon(m_hIcon, TRUE);         // 設定大圖示
    SetIcon(m_hIcon, FALSE);        // 設定小圖示

    // 設定背景圖片
    CDialogEx::SetBackgroundImage
(IDB_BITMAP1); return TRUE; // 除非將焦點設定到控制元件,否則返回 TRUE }

因為vs2010中對話方塊是派生CDialogEx的,所以可以使用該函式來完成對應功能。呼叫後,靜態控制元件的背景自動就透明瞭,不需要再次進行設定,而對於radio button和check button就需要通過程式碼控制背景圖片中對應區域繪製一遍來達到背景透明的效果。

HBRUSH CMFCDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialogEx::OnCtlColor
(pDC, pWnd, nCtlColor); //這種情況除非背景是純色才行 /* if(nCtlColor == CTLCOLOR_BTN) { pDC->SetBkMode(TRANSPARENT); hbr = (HBRUSH) ::GetStockObject(NULL_BRUSH); } */ //沒辦法,搞一個萬能的。很奇怪,在背景是圖片的情況下,nCtlColor都不等於CTLCOLOR_BTN了,但經過斷點可以肯定, //每個控制元件都會進入這個訊息 UINT id = pWnd->GetDlgCtrlID(); if
(id == IDC_RADIO1 || id == IDC_CHECK1) { pDC->SetBkMode(TRANSPARENT); CRect rc; pWnd->GetWindowRect(&rc); ScreenToClient(&rc); CDC* dc = GetDC(); pDC->BitBlt(0,0,rc.Width(),rc.Height(),dc,rc.left,rc.top,SRCCOPY); //把父視窗背景圖片先畫到按鈕上 ReleaseDC(dc); hbr = (HBRUSH) ::GetStockObject(NULL_BRUSH); } return hbr; }

以上就是基本過程。效果如下:
這裡寫圖片描述