更改背景常有两种加载方法,从位图资源中加载背景和直接选择bmp文件。对于文档视图结构和基于对话框的应用程序都对应着相应的WINDOWS消息WM_ERASEBKGND,对该消息进行映射就可以用于背景的修改。只要在OnEraseBkgnd()函数中加上相应的代码,就可以得到满意的效果。
(1):直接从位图资源中加载背景。其方法如下:
BOOL CMyDlg::OnEraseBkgnd(CDC* pDC)
{
CBitmap bitmap;
CRect client;
CDC dc;
GetClientRect(&client);
BITMAP hb;
bitmap.LoadBitmap(IDB_BITMAP1);//IDB_BITMAP1为资源中背景位图资源的ID号
dc.CreateCompatibleDC(pDC);
dc.SelectObject(&bitmap);
bitmap.GetObject(sizeof(hb),&hb);
pDC->StretchBlt(0,0,client.right-client.left,client.bottom-client.top,
&dc,
0,0,hb.bmWidth,hb.bmHeight,SRCCOPY);
return TRUE;
}
(2):从BMP文件中加载背景。其方法如下:调用OnCustomBk()函数.
void CMyDlg::OnCustomBk()
//该函数用于打开背景文件,并读入内存
{
// TODO: Add your control notification handler code here
CString sfilter="(*.bmp)|*.bmp|";
CFileDialog openfile(TRUE,0,0,OFN_FILEMUSTEXIST,(LPCTSTR)sfilter,this);
CFile file;
CString strPathName;
if(openfile.DoModal()!=IDOK)
return;
zxbj=TRUE;
strPathName=openfile.GetFileName();
HBITMAP hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),
strPathName,IMAGE_BITMAP,0,0,
LR_CREATEDIBSECTION|LR_LOADFROMFILE|LR_DEFAULTSIZE);
ASSERT(hBitmap!=NULL);
if(m_pbmp)
{
m_pbmp->DeleteObject();
delete m_pbmp;
m_pbmp=NULL;
}
m_pbmp=new CBitmap();
m_pbmp->Attach(hBitmap);
RedrawWindow(NULL,NULL,RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASE|RDW_ERASENOW);
}
RedrawWindow()自动调用OnEraseBkgnd()函数。