1、新建一个基于对话框的应用程序;
2、以CListBox为基类派生一个CListBmp类;
3、在对话框添加一个(List Box)列表框控件,为控件添加一个CListBmp类的成员变量m_list,向工程导入一个位图资源;
4、在CListBmp添加一个WM_PAINT消息处理函数,在OnPaint()方法绘制列表框控件的背景位图;
void CListBmp::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CRect rect;
GetClientRect(&rect); //获得列表框区域
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);//装载位图资源
CDC mendc;
mendc.CreateCompatibleDC(&dc); //创建兼容DC
mendc.SelectObject(&bitmap); //选入位图对象
dc.BitBlt(0,0,rect.Width(),rect.Height(),&mendc,0,0,SRCCOPY);//绘制背景
//BitBlt是按1:1的比例加载位图,也可以调用StretchBlt,可以使位图在拉伸,缩放
//以适应窗口
bitmap.DeleteObject();
ReleaseDC(&mendc);
// Do not call CListBox::OnPaint() for painting messages
}
void CListBmp::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CRect rect;
GetClientRect(&rect); //获得列表框区域
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);//装载位图资源
BITMAP bmp;
bitmap.GetBitmap(&bmp); //把位图的宽度高度等信息填充结构体
CDC mendc;
mendc.CreateCompatibleDC(&dc); //创建兼容DC
mendc.SelectObject(&bitmap); //选入位图对象
//dc.BitBlt(0,0,rect.Width(),rect.Height(),&mendc,0,0,SRCCOPY);//绘制背景
//BitBlt是按1:1的比例加载位图,也可以调用StretchBlt,可以使位图在拉伸,缩放
//以适应窗口
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&mendc,
0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
bitmap.DeleteObject();
ReleaseDC(&mendc);
// Do not call CListBox::OnPaint() for painting messages
}
typedef struct tagBITMAP { /* bm */ int bmType; int bmWidth; int bmHeight; int bmWidthBytes; BYTE bmPlanes; BYTE bmBitsPixel; LPVOID bmBits; } BITMAP;
另外一种实现的方法:
为什么在class wizard中找不到对话框的WM_ERASEBKGND消息,是不是对话框没有这个消息”?其实对话框也是窗口,它也有WM_ERASEBKGND消息,只是MFC的class wizard使用的dialog过滤器将其过滤掉了
在ClassWizard的Classinfo标签下面Class Name选择控件所属的Dlg,在Message filter下面选择windows
现在就可以为Dlg添加WM_ERASEBKGND消息
在OnEraseBkgnd里面添加代码如下
BOOL CSettingDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CRect rect;
//GetDlgItem(IDC_LIST1)->GetWindowRect(&rect);
//上面这个和m_list.GetWindowRect(&rect);的执行效果是一样的
m_list.GetWindowRect(&rect);
ScreenToClient(rect);
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
BITMAP bmp;
bitmap.GetBitmap(&bmp);
CDC mendc;
mendc.CreateCompatibleDC(pDC);
mendc.SelectObject(&bitmap);
pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&mendc,0,0,SRCCOPY);
//pDC->StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&mendc,
// 0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
bitmap.DeleteObject();
ReleaseDC(&mendc);
return TRUE;
//return CDialog::OnEraseBkgnd(pDC);
}