1.之前在網上看到亂七八糟寫給對話框添加背景圖檔的,然後實作對話框上的子控件透明的例子,很多都行不通,特意把具體實作寫到部落格上,給有需要的新手或者老手參考下。
VideoSetDlg.h
class CVideoSetDlg : public CDialogEx
{
public:
HBRUSH OnCtlColor(CDC* pDC,CWnd* pWnd,UINT nCtlColor);
protected:
//複寫初始化對話框函數
virtual BOOL OnInitDialog();
private:
CImage m_imgBackGround;//背景圖檔,圖檔格式為png格式
CBrush m_bkBrush;
};
VideoSetDlg.cpp
BEGIN_MESSAGE_MAP(CVideoSetDlg,CDialogEx)
ON_WM_CTLCOLOR()//需要加上,消息映射
END_MESSAGE_MAP
BOOL CVideoSetDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
CString strPngPath("background.png");
m_imgBackGround.Load(strPngPath);
CBitmap bmpTmp;
bmpTmp.Attach(m_imgBackGround.Detach());
m_bkBrush.CreatePatternBrush(&bmpTmp);
//美化對畫框外觀【圓角對話框】,可不要。
CRgn rgnTmp;
RECT rc;
GetClientRect(&rc);
rgnTmp.CreateRoundRectRgn(rc.left + 5,rc.top + 5,rc.right - rc.left,rc.bottom - rc.top,5,5);
SetWindowRgn(rgnTmp,TRUE);
return TRUE;
}
HBRUSH CVideoSetDlg::OnCtlColor(CDC* pDC,CWnd* pWnd,UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC,pWnd,nCtlColor);
UINT id = pWnd->GetDlgCtrlID();
if (id == IDC_XXX ){
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);
return (HBRUSH)::GetStockObject(NULL_BRUSH);
}
if (this == pWnd){
return m_bkBrush;
}
}
2.OnEraseBkgnd格式
//聲明
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
//在消息映射中添加
ON_WM_ERASEBKGND()
//實作
BOOL CTest::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}