天天看點

MFC一一添加背景圖檔并讓控件實作透明的

我們先根據背景圖檔的添加方式來進行分類:

方法一:在擦除視窗背景處實作,即程式響應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類。