我們先根據背景圖檔的添加方式來進行分類:
方法一:在擦除視窗背景處實作,即程式響應WM_ERASEBKGND消息。
BOOL CDialog_Prop1::OnEraseBkgnd(CDC* pDC)
{
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP2);
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);
dcCompatible.SelectObject(&bitmap);
CRect rect;
GetClientRect(&rect);
BITMAP bmp;
bitmap.GetBitmap(&bmp);
pDC->SetStretchBltMode(HALFTONE);//設定指定裝置環境中的位圖拉伸模式,消除圖檔失真
pDC->SetBrushOrg(0,0);
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
DeleteObject(bitmap);
return true;
//return CDialogEx::OnEraseBkgnd(pDC);
}
方法二:在OnPaint函數中用CDC的StretchBlt方法繪制适用視窗大小的位圖
void CDialog_Prop2::OnPaint()
{
CPaintDC dc(this); // device context for painting
//加載位圖
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP2);
CDC comdc;
comdc.CreateCompatibleDC(&dc);
comdc.SelectObject(&bitmap);
//生成BITMAP
BITMAP bit;
bitmap.GetBitmap(&bit);
//客戶區域
CRect rect;
GetClientRect(rect);
dc.SetStretchBltMode(HALFTONE);
dc.SetBrushOrg(0,0);
//用客戶區的DC繪制所生成的BITMAP,并适應為視窗大小
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&comdc,0,0,bit.bmWidth,bit.bmHeight,SRCCOPY);
}
方法三:在OnPaint中用CImage類加載圖檔
CRect rc;
GetWindowRect(&rc);
CImage mImage;
if(mImage.Load(_T("Image.jpg")) == S_OK)
{
//這裡讓圖檔繪制區域和視窗大小一緻
mImage.Draw(GetDC()->GetSafeHdc(), CRect(0,0,rc.Width(),rc.Height()));
}
方法四:用CDialog的OnCtlColor()消息處理背景畫刷
1).首先定義畫刷成員變量
CBrush m_brush;
2).在OnInitDialog()函數中建立背景畫刷
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1); //IDB_BITMAP1是圖檔資源ID
m_brush.CreatePatternBrush(&bitmap);
3).在OnCtlColor中傳回剛剛建立的背景畫刷
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
return (HBRUSH)m_brush;
下面講述一下在背景圖檔中相關控件透明的操作處理
例如Static控件,在OnCtlColor函數中進行處理
if(nCtlColor == CTLCOLOR_STATIC )
{
pDC->SetBkMode(TRANSPARENT);//設定背景透明
pDC->SetTextColor(RGB(255,255,0));//設定字型為黃色
return (HBRUSH)::GetStockObject(NULL_BRUSH);
}
或者針對某個特定的控件進行處理:
if (pWnd->GetDlgCtrlID() == IDC_STATIC_TEXT)
{
pDC->SetBkMode(TRANSPARENT);//設定背景透明
pDC->SetTextColor(RGB(255,255,0));//設定字型為黃色
return (HBRUSH)::GetStockObject(NULL_BRUSH);
}
而上述方式不能用于改變Button控件,要想修改Button控件需要自己編寫一個繼承自CButton類的按鈕類,并重寫DrawItem虛函數
或者采用網絡上封裝的按鈕類,例如CButtonST類。