您的位置:首页 > 其它

设置窗口的背景图片

2010-10-11 12:31 225 查看
网上设置背景图片有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函数,会缩放图片

会出现图片失真

这个问题现在还没有很好的解决方法。。。

如果有网友有好的解决方法,帮忙分享下,谢谢了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: