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类。




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值