ListView c картинками
От: Michael Yashin Россия  
Дата: 16.11.01 14:45
Оценка:
Пишу на С, чистый WinAPI.
Непонятные траблы при запихивании картнок в subitem :((

Поставлен выбор всей строки. Если картинку(bitmap) открываю с маской, то при выборе строки синяя подсветка выбора на месте картинки прерывается. Именно на месте прозрачной части картинки. Видимая часть картинки нормально выводится и комбинируется с подсветкой выбора.

Если картинку открываем(запихиваем в ImageList) без маски. А просто прозрачную, когда прозрачный цвет заменяется цветом фона, то это тоже не кузяво, т.к. при выборе строки видна и прозрачная часть картинки.

Что делать уже не знаю :(((
Re: ListView c картинками
От: Alex Fedotov США  
Дата: 16.11.01 17:21
Оценка:
Здравствуйте Michael Yashin, Вы писали:

MY>Пишу на С, чистый WinAPI.

MY>Непонятные траблы при запихивании картнок в subitem :((

MY>Поставлен выбор всей строки. Если картинку(bitmap) открываю с маской, то при выборе строки синяя подсветка выбора на месте картинки прерывается. Именно на месте прозрачной части картинки. Видимая часть картинки нормально выводится и комбинируется с подсветкой выбора.


Это нормальное поведение ListView. Если нужно как-то по другому, можно воспользоваться CustomDraw и там уж рисовать как заблагорассудится.
-- Alex Fedotov
Re[2]: ListView c картинками
От: Michael Yashin Россия  
Дата: 17.11.01 13:31
Оценка:
Здравствуйте Alex Fedotov, Вы писали:

MY>>Пишу на С, чистый WinAPI.

MY>>Непонятные траблы при запихивании картнок в subitem :((

AF>Это нормальное поведение ListView. Если нужно как-то по другому, можно воспользоваться CustomDraw и там уж рисовать как заблагорассудится.


А в какой момент нужно рисовать?
Чтобы подсветка выбора наносилась после. Или мне нужно узнавать каким-то образом цвет выбора(кстати, это можно сделать? MSDN под рукой нет) и потом уже от жтого плясать?
Re[3]: ListView c картинками
От: Alex Fedotov США  
Дата: 17.11.01 18:29
Оценка:
Здравствуйте Michael Yashin, Вы писали:

MY>Здравствуйте Alex Fedotov, Вы писали:


MY>>>Пишу на С, чистый WinAPI.

MY>>>Непонятные траблы при запихивании картнок в subitem :((

AF>>Это нормальное поведение ListView. Если нужно как-то по другому, можно воспользоваться CustomDraw и там уж рисовать как заблагорассудится.


MY>А в какой момент нужно рисовать?

MY>Чтобы подсветка выбора наносилась после. Или мне нужно узнавать каким-то образом цвет выбора(кстати, это можно сделать? MSDN под рукой нет) и потом уже от жтого плясать?

Я думаю, проще всего рисовать на CDDS_ITEMPOSTPAINT и просто перерисовывать картинку, которую уже нарисовал ListView. Цвет выбора определяется как GetSysColor(COLOR_HIGHLIGHT).
-- Alex Fedotov
Re: ListView c картинками
От: PSP Беларусь  
Дата: 19.11.01 15:52
Оценка:
Здравствуйте 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;
}


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

В обсчем, если вопросы будут, то спрашивай.
Всегда Ваш, PSP.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.