Пишу на С, чистый WinAPI.
Непонятные траблы при запихивании картнок в subitem :((
Поставлен выбор всей строки. Если картинку(bitmap) открываю с маской, то при выборе строки синяя подсветка выбора на месте картинки прерывается. Именно на месте прозрачной части картинки. Видимая часть картинки нормально выводится и комбинируется с подсветкой выбора.
Если картинку открываем(запихиваем в ImageList) без маски. А просто прозрачную, когда прозрачный цвет заменяется цветом фона, то это тоже не кузяво, т.к. при выборе строки видна и прозрачная часть картинки.
Что делать уже не знаю :(((
Здравствуйте Michael Yashin, Вы писали:
MY>Пишу на С, чистый WinAPI.
MY>Непонятные траблы при запихивании картнок в subitem
(
MY>Поставлен выбор всей строки. Если картинку(bitmap) открываю с маской, то при выборе строки синяя подсветка выбора на месте картинки прерывается. Именно на месте прозрачной части картинки. Видимая часть картинки нормально выводится и комбинируется с подсветкой выбора.
Насколько я понимаю, то это нормальное поведение.
MY>Если картинку открываем(запихиваем в ImageList) без маски. А просто прозрачную, когда прозрачный цвет заменяется цветом фона, то это тоже не кузяво, т.к. при выборе строки видна и прозрачная часть картинки.
MY>Что делать уже не знаю
((
Это глюки imagelist. Довольно дерьмовая штука. Это ещё что, imagelist тулбара меня вообще задолбал. Не хотел видеть прозрачную часть при hot и cold imagelist-ах.
Собсна речь не об этом.
Дело в том, что для корректной работы надо запихивать в лист иконки. Иначе прозрачность он вообще не понимает.
Если надо, то код преобразования битмапы в иконку, довольно запутаный, но разобраться можно:
HICON GetIcon(CSize size, CWnd * pWnd)
{
CBitmap tBitmap;
RGBQUAD rgbMask={255,255,255,0};//цвет маски
CDC * pDC;
if(pWnd == NULL)
pWnd = AfxGetMainWnd();
pDC = pWnd->GetWindowDC();
CDC dcMem;
CSize nodeBitmapSize;//размер исходной битмапины
tBitmap.CreateCompatibleBitmap(pDC,size.cx,size.cy);
dcMem.CreateCompatibleDC(pDC);
CRect rect(0, 0, size.cx,size.cy);
CPen pen(1,1,RGB(0,255,0));
CBitmap * oldBitmap = dcMem.SelectObject(&tBitmap);
nodeBitmapSize = pNode->pSBView()->GetNodePicture()->GetDimensions();
pWnd->pSBView()->GetNodePicture()->DrawStretch(&dcMem,CPoint(0,0), size);//рисуем битмапину
..
//---Converting to HICON -----------------------------------------------------------
HICON hIcon;
unsigned char * arBitmap=(unsigned char *)malloc(size.cx*size.cy*3*3);
unsigned char * arAndMask=(unsigned char *)malloc(size.cx*size.cy*3*3);
::ZeroMemory(arBitmap,size.cx*size.cy*3*3);
::ZeroMemory(arAndMask,size.cx*size.cy*3*3);
BITMAP bmpStruct;
tBitmap.GetBitmap(&bmpStruct);
long pixelBG=0;
long bBPP=(bmpStruct.bmBitsPixel/8);
long bBytesInLine=(int)(ceil((double)size.cx*bBPP/4)*4);
tBitmap.GetBitmapBits( bBytesInLine*size.cy,arBitmap);
for (int i=0;i<bBPP;i++)
{
pixelBG=pixelBG << 8;
pixelBG+=0xFF;
}
//creating and mask for icon
for(int y=0;y<size.cy;y++)
{
for(int x=0;x<size.cx;x++)
{
long tPixel=0;
for (int i=0;i<bBPP;i++) tPixel+=arBitmap[y*size.cx*bBPP+x*bBPP+i] << (i*8);
if (tPixel==pixelBG) arAndMask[(y<<2)+(x >> 3)]+=1<<(7-(x % 8));
}
}
//здесь я опустил код но смысл в том, что в dcMem нарисовалась наша битмапина
tBitmap.GetBitmapBits(bBytesInLine*size.cy,arBitmap);
dcMem.SelectObject(oldBitmap);
dcMem.DeleteDC();
pWnd->ReleaseDC(pDC);
hIcon=::CreateIcon(SB_GET_APP()->m_hInstance,size.cx,size.cy, bmpStruct.bmPlanes, bmpStruct.bmBitsPixel,(const unsigned char *)arAndMask, (const unsigned char *)arBitmap);
free(arBitmap);
free(arAndMask);
//----------------------------------------------------------------------------------
return hIcon;
}
Здесь у меня два раза рисуется битмапина, во-второй раз она просто сглаженная рисуется. Это сделано потому как у меня битмапины ресайзятся для вставки в тулбар.
В обсчем, если вопросы будут, то спрашивай.