2010-05-06 49 views
0

我寫了下面的代碼,它試圖將32x32位圖(通過MFC資源系統加載)並將其轉換爲16x16位圖,以便它們可以用作CListCtrl的大小CImageLists。但是,當我打開CListCtrl時,所有圖標都是黑色的(在小視圖和大視圖中)。在我開始調整大小之前,所有內容在大視圖中都能很好地工作。縮放CBitmap - 我做錯了什麼?

我在做什麼錯?

// Create the CImageLists 
if (!m_imageListL.Create(32,32,ILC_COLOR24, 1, 1)) 
{ 
    throw std::exception("Failed to create CImageList"); 
} 
if (!m_imageListS.Create(16,16,ILC_COLOR24, 1, 1)) 
{ 
    throw std::exception("Failed to create CImageList"); 
} 

// Fill the CImageLists with items loaded from ResourceIDs 
int i = 0; 
for (std::vector<UINT>::iterator it = vec.begin(); it != vec.end(); it++, i++) 
{ 
    CBitmap* bmpBig = new CBitmap(); 
    bmpBig->LoadBitmap(*it); 
    CDC bigDC; 
    bigDC.CreateCompatibleDC(m_itemList.GetDC()); 
    bigDC.SelectObject(bmpBig); 

    CBitmap* bmpSmall = new CBitmap(); 
    bmpSmall->CreateBitmap(16, 16, 1, 24, 0); 
    CDC smallDC; 
    smallDC.CreateCompatibleDC(&bigDC); 
    smallDC.SelectObject(bmpSmall); 
    smallDC.StretchBlt(0, 0, 32, 32, &bigDC, 0, 0, 16, 16, SRCCOPY); 

    m_imageListL.Add(bmpBig, RGB(0,0,0)); 
    m_imageListS.Add(bmpSmall, RGB(0,0,0)); 
} 

m_itemList.SetImageList(&m_imageListS, LVSIL_SMALL); 
m_itemList.SetImageList(&m_imageListL, LVSIL_NORMAL); 

回答

1

請務必取消使用後的CBitmaps:

// Select the objects 
CBitmap* ret1 = bigDC.SelectObject(bmpBig); 
CBitmap* ret2 = smallDC.SelectObject(bmpSmall); 
... 
// Do the painting 
... 
// Deselect 
bigDC.SelectObject(ret1); 
smallDC.SelectObject(ret2); 
1

需要爲bigDC創建compatibleDC。即首先獲得當前窗口的DC,並執行類似的操作

bigDC.CreateCompatibleDC(&myWindowHdc); 
+0

仍然得到同樣的問題,與行補充說:'bigDC.CreateCompatibleDC(的GetDC( ));' – Smashery 2010-05-06 07:55:58

+0

@Smashery - 你爲什麼不調試,看看哪個呼叫失敗 – SysAdmin 2010-05-06 08:41:57

+0

沒有呼叫失敗。它只是黑色。 – Smashery 2010-05-06 23:08:24

1

您正在將本地CBitmap對象的引用添加到列表中。一旦你不在循環中,該引用將不再有效。嘗試在堆上創建對象。

+0

不幸的是不能解決問題。 – Smashery 2010-05-06 08:11:02

+0

@smashery - 是..這是一個有效的問題。如果你已經修復了你的代碼,你可以更新最新的變化 – SysAdmin 2010-05-06 08:15:29

+0

@SysAdmin - 不用擔心。所做的更改。 – Smashery 2010-05-06 08:22:25

1

嘗試使用CreateCompatibleBitmap()而不是CreateBitmap() - 兩個位圖需要相同才能使BitBlt/StretchBlt工作。

另外,www.gdiwatch.com在調試類似問題時非常有用。它看起來放棄了,但下載的版本也可以與VS2008一起使用。

+0

謝謝!不幸的是,這也沒有奏效。 – Smashery 2010-05-06 23:07:10

0

你需要做出改變:

bmpSmall->CreateBitmap(16, 16, 1, 32, 0);