从www.vckbase.com上下载了一个给clistbox添加位图背景的程序,把它用在了我自己的一个程序中。在我的程序中我是在一个弹出对话框中添加了一个clistbox控件,然后改为CMyListBox m_lstHost;然后在OnInitDialog() 中用下面语句来填充背景位图。
这些语句是不是有资源泄漏呀?我反复的点击鼠标让对话框弹出,结果在弹出10来次后,这个列表框控件的背景就变成黑色了?请求指教!!
CMyListBox在http://www.vckbase.com/vckbase/vckbase14/上定义
OnInitDialog()函数。
m_lstHost.GetClientRect(&m_ListBoxRect);
m_lstHost.m_bmp.LoadBitmap(IDB_BKCLIENT);HBITMAP htempbmp;
m_hbListBox = (HBITMAP )m_lstHost.m_bmp.Detach();
htempbmp = GetSizeBITMAP(m_hbListBox , m_ListBoxRect.right,m_ListBoxRect.bottom);
m_lstHost.m_bmp.Attach(htempbmp); GetSizeBITMAP函数如下:
HBITMAP GetSizeBITMAP(HBITMAP hBitmap, int w, int h)
{
CDC sourceDC, destDC;
sourceDC.CreateCompatibleDC( NULL );
destDC.CreateCompatibleDC( NULL );
BITMAP bm;
::GetObject( hBitmap, sizeof( bm ), &bm );
HDC hdc = GetDC(NULL);//CClientDC(NULL);
HBITMAP hbmResult = ::CreateCompatibleBitmap(hdc, w, h);
HBITMAP hbmOldSource = (HBITMAP)::SelectObject( sourceDC.m_hDC, hBitmap );
HBITMAP hbmOldDest = (HBITMAP)::SelectObject( destDC.m_hDC, hbmResult );
destDC.BitBlt(0, 0, w, h, &sourceDC, 0, 0, SRCCOPY );
::SelectObject( sourceDC.m_hDC, hbmOldSource );
::SelectObject( destDC.m_hDC, hbmOldDest ); if(hdc) ReleaseDC(NULL, hdc);
if(sourceDC) ReleaseDC(NULL, sourceDC);
if(destDC) ReleaseDC(NULL, destDC); return hbmResult;
}