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消息,只是MFCclass 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);

}