2011-11-09 58 views
3

我在CDialog中有以下代碼。此代碼在Windows 7上完美工作,但在Windows XP SP3上其顏色始終爲黑色。Windows XP上的真彩CImageList

UINT color_flags = CWindowDC(this).GetDeviceCaps(BITSPIXEL); 

switch (color_flags) 
{ 
case 4 : color_flags = ILC_COLOR4; break; 
case 8 : color_flags = ILC_COLOR8; break; 
case 16 : color_flags = ILC_COLOR16; break; 
case 24 : color_flags = ILC_COLOR24; break; 
case 32 : color_flags = ILC_COLOR24; break; 
default : color_flags = ILC_COLOR24; 
}; 

CImageList imgage_list; 
imgage_list.Create(16, 16, color_flags, 0, 10); 
imgage_list.SetImageCount(number_of_bitmaps); 

CDC * pDC = this->GetDC(); 
CDC memDC; 
CRect memRect(0, 0, 16, 16); 
CObject * pObj = 0; 
COLORREF my_color = RGB(255,0,0); 
CBitmap * bitmap = 0; 
memDC.CreateCompatibleDC(pDC); 

for (int i = 0; i < number_of_bitmaps; ++i) 
{ 
    bitmap = new CBitmap; 
    bitmap->CreateCompatibleBitmap(pDC, 16, 16); 
    pObj = memDC.SelectObject(bitmap); 
    memDC.FillSolidRect(memRect, my_color); 
    imgage_list.Replace(i, bitmap, 0); 
    memDC.SelectObject(pObj); 
    delete bitmap; 
} 

memDC.DeleteDC(); 
this->ReleaseDC(pDC); 

我啓用了視覺樣式,如MSDN所示。我使用這個CImageList對象作爲CListCtrl::SetImageList成員函數的參數。

你有什麼想法嗎?

非常感謝您的幫助。

+0

只看代碼看起來沒問題,您可以驗證CImageList替換成員:如果返回不正確,則返回零。這是我調試的開始... – Sunscreen

+0

@防曬:如果我用CImage寫出CBitmap,顏色是正確的。如果我從資源填充CImageList,則列表是正確的。所以我完全困惑。 :( – Naszta

+0

在Windows XP中,您是否正在加載通用控件6或5.0?您是否正確包含了清單? – sarat

回答

1

最後,修正和工作代碼:

CImageList imgage_list; // class member 
imgage_list.Create(16, 16, ILC_COLOR24, number_of_bitmaps, 0); 

CDC * pDC = this->GetDC(); 
CDC memDC; 
COLORREF my_color = RGB(255,0,0); 
memDC.CreateCompatibleDC(pDC); 
CBitmap bitmap; 

bitmap->CreateCompatibleBitmap(pDC, 16*number_of_bitmaps, 16); 
CObject * pObj = memDC.SelectObject(&bitmap); 

int k = 0; 
for (int i = 0; i < number_of_bitmaps; ++i) 
{ 
    // fill list control, so i is used 
    // my_color is changing on every loop step 

    memDC.FillSolidRect(k, 0, k+16, 16, my_color); 
    k += 16; 
} 
memDC.SelectObject(pObj); 
imgage_list.Add(&bitmap, RGB(0,0,0)); 

memDC.DeleteDC(); 
this->ReleaseDC(pDC); 

非常感謝您的幫助,再次。

+0

如果您可以在此答案中發佈更正的代碼,那麼我們可以自己查看問題出在哪裏,這將非常有用。即使有這個解釋,我也很難看到它。 –

+0

@Mark Ransom:好的。 – Naszta

1

您尚未初始化您的memDC尚未正確響應。你做的SelectObject前選擇位圖到它,請執行下列操作:

memDC.CreateCompatibleDC(pDC); 
+0

非常感謝您的幫助,我很遺憾,但是我忘記了這裏的代碼,但是我並沒有忘記真實的代碼,我更新了這篇文章 – Naszta

0
  1. GdiObject * pObj,而不是CObject的
  2. 我認爲你需要調用替換(前選擇位圖出來MEM的DC )是這樣的:

    memDC.SelectObject(pObj); 
    imgage_list.Replace(i, bitmap, 0); 
    
+0

我將在星期五進行檢查 – Naszta

+0

我沒有非常感謝 – Naszta

0

據我所知,你的情況的位圖沒有正確顯示在Windows XP了。

雖然線程談到位圖在Windows 7中顯示不正確,這與您正在尋找的內容相反,但線索可能在那裏..不確定,只是試圖幫助。

Bitmaps dont show up properly in Windows 7

+0

我沒有幫助,非常感謝。 – Naszta

0

我有問題,當我的位圖添加到圖像列表時,總是會顯示黑色。

我終於明白了我自己。這是我的代碼的精簡版本。

// get device context 
CDC* pDC = GetDC(); 

// create image list 
imageList.Create(cx, cy, ILC_COLOR24, 1, 1); 

// Create offscreen device context 
CDC memDC; 
memDC.CreateCompatibleDC(pDC); 

// Create new bitmap of size cx by cy 
CBitmap newBmp; 
newBmp.CreateCompatibleBitmap(pDC, cx, cy); 

// Select new bitmap in memory for drawing 
CBitmap* pOldBmp = memDC.SelectObject(&newBmp); 

// do drawing here... 
// e.g. memDC.FillSolidRect(0, 0, cx, cy, RGB(255,0,0)); 

/* 
IMPORTANT: 
Deselect new bitmap before adding to image list, 
otherwise you'll potentially end up with a black icon 
*/ 
memDC.SelectObject(pOldBmp); 

// add bitmap to image list 
imageList.Add(&bitmap, (CBitmap*)NULL); 

// cleanup 
memDC.DeleteDC(); 
ReleaseDC(pDC); 

希望它有助於某人。