我们先根据背景图片的添加方式来进行分类:
方法一:在擦除窗口背景处实现,即程序响应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类。