网上设置背景图片有2种方法:
第一种直接是在OnPaint中加入:
直接在CXXXDlg(要操作的对话框类)的CXXXDlg::OnPaint()函数中的if…else中的else{CDialog::OnPaint();}改成如下代码:注意CDialog::OnPaint();这句一定要去掉了
else
{
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bmpBackground;
bmpBackground.LoadBitmap(IDB_BEIJING);
//IDB_BITMAP为背景图片ID
BITMAP bitmap;
bmpBackground.GetBitmap(&bitmap);
CBitmap*pbmpOld=dcMem.SelectObject(&bmpBackground); dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,
bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
}
另外一种是添加消息:OnEraseBkgnd
BOOL CXXXDlg::OnEraseBkgnd(CDC* pDC)
{
//背景图片
//获得客户区尺寸
CRect rect;
GetClientRect(&rect);
//加载背景位图
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP2); //图片ID
//创建内存DC
CDC dc;
dc.CreateCompatibleDC(pDC);
//选择位图
CBitmap* pOldBitmap=dc.SelectObject(&bitmap);
BITMAP bmp;
bitmap.GetBitmap(&bmp);
//绘制位图
//pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY);
pDC->StretchBlt(0,0,rect.Width(), rect.Height(), &dc, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);
//pDC->BitBlt(int x, int y, int nWidth, int nHeight, CDC *pSrcDC, int xSrc, int ySrc, DWORD dwRop);
//pDC->StretchBlt(0,0,1024,758,&memdc,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
//恢复原有位图
dc.SelectObject(pOldBitmap);
return TRUE;
}
如果只用上面的任意一种方法会出现如下的问题:
1.假设有这样一个按钮,当窗口时最大化状态的时候,点击的时候是默认的窗口大小,当窗口大小是默认大小的时候,点击是最大化
2. 启动的时候,窗口时默认大小
这个时候会出现这样一个问题
如果:启动后,点击按钮,可以正确的显示背景图片,并且图片也自动的拉伸
如果:启动后,此时的窗口为默认大小,切换到其他一个程序(例如浏览器),在切换回来的时候,点击按钮就会出现背景显示的不正确了。
具体现象,自己测试下就能出来了
解决办法是:
添加OnSize事件:
void CTestMFC12Dlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
Invalidate();
}
另外还有一个问题是:
假设bmp图片大小比默认窗口大小要大的话
因为用的是StretchBlt函数,会缩放图片
会出现图片失真
这个问题现在还没有很好的解决方法。。。
如果有网友有好的解决方法,帮忙分享下,谢谢了