True Color CImageList в Windows XP - PullRequest
       18

True Color CImageList в Windows XP

3 голосов
/ 09 ноября 2011

У меня есть следующий код в CDialog.Этот код прекрасно работает в Windows 7, но его цвет всегда черный в Windows XP SP3.

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 функции-члена.

У вас есть идеи?

Большое спасибо за помощь.

Ответы [ 5 ]

1 голос
/ 23 ноября 2011

Окончательный, исправленный и рабочий код:

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);

Большое спасибо за помощь, снова.

1 голос
/ 10 ноября 2011

Вы еще не инициализировали memDC, поэтому он не отвечает должным образом. Прежде чем сделать SelectObject для выбора растрового изображения, сделайте следующее:

memDC.CreateCompatibleDC(pDC);
0 голосов
/ 17 января 2014

У меня была проблема с тем, что мое растровое изображение всегда отображалось черным при добавлении в список изображений.

Я наконец понял это сам. Вот урезанная версия моего кода.

// 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 );

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 21 ноября 2011

Я понимаю, что в вашем случае растровое изображение не отображается должным образом в Windows XP.

Хотя поток говорит о том, что растровые изображения не отображаются должным образом в Windows 7, что противоположно тому, что вы ищете, подсказка может быть там ... не уверен, просто пытаюсь помочь.

Битовые карты не отображаются должным образом в Windows 7 .

0 голосов
/ 15 ноября 2011
  1. GdiObject * pObj вместо CObject
  2. Я думаю, вам нужно выбрать битовый массив из памяти DC перед вызовом Replace () следующим образом:

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