Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)? / 25 сообщений из 25, страница 1 из 1
29.03.2011, 17:19
    #37188428
wisekat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
Работаем с native API image list, есть примерно такой код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
Public Type IMAGELISTDRAWPARAMS
    cbSize As Long
    himl As Long
    i As Long
    hdcDst As Long
    x As Long
    y As Long
    cx As Long
    cy As Long
    xBitmap As Long '        // x offest from the upperleft of bitmap
    yBitmap As Long '        // y offset from the upperleft of bitmap
    rgbBk As Long
    rgbFg As Long
    fStyle As Long
    dwRop As Long
    fState As Long
    Frame As Long
    crEffect As Long
End Type
' image list states (fState field in IMAGELISTDRAWPARAMS)
Public Const ILS_ALPHA As Long = &H8&
Public Declare Function ImageList_DrawIndirect Lib "COMCTL32.DLL" (pimldp As IMAGELISTDRAWPARAMS) As Long

Public Sub DrawImageAlpha( _
        ByVal vKey As Variant, _
        ByVal hdc As Long, _
        ByVal xPixels As Integer, _
        ByVal yPixels As Integer, _
        ByVal btAlpha As Byte _
    )
Dim idp As IMAGELISTDRAWPARAMS
Dim iImgIndex As Long

   iImgIndex = flItemIndex(vKey)

   idp.cbSize = Len(idp)
   idp.himl = m_hIml
   idp.hdcDst = hdc
   idp.x = xPixels
   idp.y = yPixels
   idp.i = iImgIndex
   idp.fState = ILS_ALPHA
   idp.Frame = btAlpha
   
   ImageList_DrawIndirect idp
End Sub

В Vista/Win7 рисует иконку полупрозрачной без проблем, а вот в WinXP - какой-то серо-бурый прямоугольник вместо иконки. Что надо поправить чтобы этот же подход работал в WinXP? Или может есть ещё идеи как эффективно нарисовать иконку из стандартного image list полупрозрачной на заданном DC?
...
Рейтинг: 0 / 0
29.03.2011, 17:26
    #37188454
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
gdi+ надо использовать, примеры поищи
...
Рейтинг: 0 / 0
29.03.2011, 18:03
    #37188561
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
Зачем для этого стандартный? У нет ни единого преимущества перед апишным.
...
Рейтинг: 0 / 0
30.03.2011, 10:56
    #37189598
wisekat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
Под "стандартным" я имел не визуальный ImageList control, поставляемый в составе MS Commont Controls (MSCOMCTL6.OCX), а стандартный WinAPI image list, создаваемый такой функцией:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
HIMAGELIST ImageList_Create(
    int cx,
    int cy,
    UINT flags,
    int cInitial,
    int cGrow
);

(пускай и из classic VB6)

GDI+ однозначно не катит, т.к. есть большой проект, в котором всё построено на API image list, и надо решить задачу в пределах выбранной технологии, т.е. чисто нейтивными API-функциями.
...
Рейтинг: 0 / 0
30.03.2011, 11:31
    #37189725
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
Ну тогда включаем голову хотя бы на минимальных оборотах .
...
Рейтинг: 0 / 0
30.03.2011, 14:53
    #37190326
wisekat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
Antonariy , прежде чем обвинять оппонента в безысходной тупости, посмотрите хотя бы на это .

Вы что думаете, я поиск не использовал как первое средство помощи страждущим? Как видите, я даже спецпосты на других форумах и ресурсах для девелоперов создавал.

Если у Вас есть готовое решение а не флуд типа "поди поищи" - тогда пишите, а так нечего мусорить на форуме.

Если кому кажется, что я задачу сформулировал некорректно, вот альтернативная формулировка: надо нарисовать иконку, которая хранится в Windows API image list, как прозрачную с заданной степенью прозрачности. Речь идёт не о том, чтобы 32-битные иконки с альфа-каналом выводить, а чтобы вообще ко всей иконке применить эффект прозрачности. Посмотрите на приаттаченный скриншот. Всё работает "чики-пики" в Windows 7, но не в XPюше - смотрите как одна и та же иконка фотоаппарата с разной степенью прозрачности выводится, а у неё ещё и свой альфа-канал по краям изображения есть.
...
Рейтинг: 0 / 0
30.03.2011, 16:18
    #37190587
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
Речь идёт не о том, чтобы 32-битные иконки с альфа-каналом выводить, а чтобы вообще ко всей иконке применить эффект прозрачности.Теперь понятно.
GDI+
...
Рейтинг: 0 / 0
30.03.2011, 16:23
    #37190609
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
Хотя не очень. Как это выглядит в XP? Пример неправильной отрисовки можете выложить?
...
Рейтинг: 0 / 0
30.03.2011, 16:30
    #37190631
wisekat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
Пожалуйста:
...
Рейтинг: 0 / 0
30.03.2011, 16:51
    #37190692
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
Примерчик бы еще.
...
Рейтинг: 0 / 0
30.03.2011, 16:55
    #37190705
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
Хотя не надо. Этот пример у меня под XP работает.
...
Рейтинг: 0 / 0
31.03.2011, 18:08
    #37193030
wisekat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
Antonariy, Вы снова невнимательны.

В указанном Вами примере используются эффекты типа cut и selected, но это не то же самое что нарисовать икону с заданной прозрачностью от 0 до 255.

Да и если бы Вы в код заглянули, то увидели бы, что сам автор Steve McMahon закомментарил неработающие строки:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
      
      ' saturate (only ever seems to result in unsaturated image?)
      idp.y = idp.y + (m_cIml.IconSizeY +  4 )
      idp.fState = ILS_SATURATE
      idp.Frame = - 128 
      ImageList_DrawIndirect idp
            
      ' glow (does not appear to work)
      'idp.x = idp.x + (m_cIml.IconSizeX + 2)
      'idp.fState = ILS_GLOW
      'idp.crEffect = &HFFFFFF
      'ImageList_DrawIndirect idp
      
      ' shadow (does not appear to work)
      'idp.x = idp.x + (m_cIml.IconSizeX + 2)
      'idp.fState = ILS_SHADOW
      'idp.crEffect = &HFF0000
      'ImageList_DrawIndirect idp
      
      ' alpha (does not appear to work)
      'idp.x = idp.x + (m_cIml.IconSizeX + 2)
      'idp.fState = ILS_ALPHA
      'idp.Frame = 128
      'ImageList_DrawIndirect idp

Нам как раз эффект ILS_ALPHA нужен...
...
Рейтинг: 0 / 0
31.03.2011, 22:27
    #37193351
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
Каюсь, реально невнимателен, код формы не посмотрел и показалось, что картинки полупрозрачные.
Остается GDI+

авторGDI+ однозначно не катит, т.к. есть большой проект, в котором всё построено на API image list, и надо решить задачу в пределах выбранной технологии, т.е. чисто нейтивными API-функциями.GDI+ это тоже native api. ImageList можно оставить в качестве хранилища рисунков.
...
Рейтинг: 0 / 0
01.04.2011, 11:39
    #37193912
wisekat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
Хорошо, я готов использовать GDI+ (gdiplus.dll) как API-функции через Declare в VB, но как их применить для моей конкретной задачи? Ещё раз напоминаю: мне надо нарисовать на форме или любом другом API DC заданную иконку из image list с заданным уровнем прозрачности.

Пример, который Вы дали (alpha.zip), делает прозрачной целую форму (целый заданный hwnd), и делает это посредством превращения её сначала в т.н. "многослойное" окно (layered window):

Код: plaintext
Call SetWindowLong(Me.hwnd, GWL_EXSTYLE, lOldLong Or WS_EX_LAYERED)

, а потом через вызов UpdateLayeredWindow с флагом ULW_ALPHA делает ВСЁ окно полупрозрачным:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Sub SetAlpha(Optional Alpha As Byte =  255 )
    With BF
        .AlphaFormat = AC_SRC_ALPHA
        .BlendFlags =  0 
        .BlendOp = AC_SRC_OVER
        .SourceConstantAlpha = Alpha
    End With
    Call UpdateLayeredWindow(Me.hwnd, Me.hdc, PAD, SZ, hCDC, PAS,  0 , BF, ULW_ALPHA)
End Sub

Может, я чего-то не понимаю? Как это применить к выводу конкретного изображения? Уже обыскал весь Интернет. Если знаете - подскажите хотя бы функцию(и), которыми это делается.
...
Рейтинг: 0 / 0
01.04.2011, 12:04
    #37193982
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
Рисовать можно в любом DC, все необходимые функции в примере.
Во вложении оригинальный пример.
...
Рейтинг: 0 / 0
01.04.2011, 12:12
    #37194011
wisekat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
Если уж говорить про GDI+, вот сейчас нашёл ещё такой пример . Вроде делает то, что нужно (см. раздел "Transparency"), но конечно там такие классы наворочены как friendly "обёртки", что без пол-литра сразу не разберёшься как это вытянуть как отдельную функциональность и потом к image list привязать. Насколько я понял из беглого просмотра кода, там такие преобразования через специальную матрицу делаются.
...
Рейтинг: 0 / 0
01.04.2011, 12:34
    #37194072
wisekat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
В MSDN конечно документация по GDI+ native API совсем скудная. Еслик ому надо - вот здесь нашёл поприличней доку:

GDI+ Flat API Reference
...
Рейтинг: 0 / 0
01.04.2011, 12:37
    #37194080
wisekat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
Antonariy , Ваш пример xaser.rar хорош, и показывает подход как нарисовать с помощью GdipDrawImageRect картинку на форме. Однако он сразу перестаёт работать как отключаем превращение формы в layered window.

Чтобы Вы напрасно не тратили время, лучше выложите (или дайте ссылку) на пример, в котором делается то, что мне надо, с помощью GDI+.
...
Рейтинг: 0 / 0
01.04.2011, 12:45
    #37194104
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
wisekatЕсли уж говорить про GDI+, вот сейчас нашёл ещё такой пример .Мощный пример, со своим я так и не смог вывести картинку в PictureBox. Но в нем действительно много лишнего.
wisekatНасколько я понял из беглого просмотра кода, там такие преобразования через специальную матрицу делаются. Нет там матриц, есть байтовый массив.

Вытащить функционал не сложно в пошаговом режиме. Вся суть в процедуре cGDIpRenderer.RenderImageClassToDC.
...
Рейтинг: 0 / 0
01.04.2011, 12:47
    #37194118
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
wisekat Antonariy , Ваш пример xaser.rar хорош, и показывает подход как нарисовать с помощью GdipDrawImageRect картинку на форме. Однако он сразу перестаёт работать как отключаем превращение формы в layered window.

Чтобы Вы напрасно не тратили время, лучше выложите (или дайте ссылку) на пример, в котором делается то, что мне надо, с помощью GDI+.У меня был только этот пример (к тому же он глючит — IDE через какое-то время после остановки проекта вылетает), ваш лучше, он стоит того, чтобы разобрать его на кусочки.
...
Рейтинг: 0 / 0
01.04.2011, 16:43
    #37194721
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
wisekat,

всё же приложили бы минимальный тестовый проект и (особенно) данные, чтобы было что щупать. Вполне вероятно, что AlphaBlend() (родная для Win98 и выше) справится.

Документация по GDI+ Flat API читается специфическим образом: смотрится для flat API-шки в таблице соответствия объектный аналог и читается описание к нему.
...
Рейтинг: 0 / 0
04.04.2011, 12:32
    #37197727
wisekat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
Бенедикту и всем :)

При независимых раскопках вопроса нашёл вот такую потрясную статью на RSDN:

Прозрачность - это просто

Автор тоже клонит к AlphaBlend.

Пока попробую сам что-то подобное в проекте сварганить - и затем отпишусь о результатах. Главное, чтобы это сработало с любым типом иконки из image list, а не только с 32-битным каналом.
...
Рейтинг: 0 / 0
04.04.2011, 15:16
    #37198226
wisekat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
Изучил вот статью про прозрачность на RSDN + решил воспользоваться советом Бенедикта и попробовать сделать всё на AlphaBlend.

Статья кончено была хороша, но что в ней не понравилось - это то, что автор начал с image list, а закончил выводом классических битмапов через AlphaBlend. А вот промежуточного и самого главного звена - как перейти от иконы из image list к нужному битмапу там и нет...

Хотя автор всё-таки даёт общий теоретический совет: сделайте из необходимого изображения 32-битный битмап и маску с помощью функции CreateDIBSection, а затем используйте всё это хозяйство в AlphaBlend. Даже примерный код даёт:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
void CTranspBitmapsDoc::CreateDIB()
{
	BITMAPINFO bmi;
	BITMAP bm;
	int sx, sy;

	HDC tempDC = GetDC( 0 );
	m_fgBmp.GetBitmap(&bm);
	sx = bm.bmWidth;
	sy = bm.bmHeight;
	bmi.bmiHeader.biSize = sizeof bmi.bmiHeader;
	bmi.bmiHeader.biWidth = sx;
	bmi.bmiHeader.biHeight = sy;
	bmi.bmiHeader.biPlanes =  1 ;
	bmi.bmiHeader.biBitCount =  32 ;
	bmi.bmiHeader.biCompression = BI_RGB;
	bmi.bmiHeader.biSizeImage =  0 ;
	RGBQUAD *buffer, pixel;
	RGBTRIPLE *t1, *t2;
	HBITMAP hDIB = CreateDIBSection(tempDC, &bmi, DIB_RGB_COLORS, 
									(void**)&buffer,  0 ,  0 );
	bmi.bmiHeader.biBitCount= 24 ;
	bmi.bmiHeader.biClrUsed= 0 ;
	int widthBytes = sx* 3  + (sx* 3 )% 4 ;
	char* bits1 = new char[widthBytes*sy];
	char* bits2 = new char[widthBytes*sy];
	GetDIBits(tempDC, m_fgBmp,  0 , sy, bits1, &bmi, DIB_RGB_COLORS);		
	GetDIBits(tempDC, m_bgBmp,  0 , sy, bits2, &bmi, DIB_RGB_COLORS);		
	for (int i= 0 ; i<sy; i++) 
	{
		t1 = (RGBTRIPLE*)(bits1+widthBytes*i);
		t2 = (RGBTRIPLE*)(bits2+widthBytes*i);
		for (int j= 0 ; j<sx; j++)
		{
			if(isWhite(t1))
			{
				BYTE alpha=isWhite(t2)? 0 : 255 -intensity(t2)/ 2 ;
				pixel.rgbBlue  = alpha?t2->rgbtBlue/ 2 : 0 ;
				pixel.rgbGreen = alpha?t2->rgbtGreen/ 2 : 0 ;
				pixel.rgbRed   = alpha?t2->rgbtRed/ 2 : 0 ;
				pixel.rgbReserved = alpha;
			}
			else
			{
				pixel.rgbBlue  = t1->rgbtBlue;
				pixel.rgbGreen = t1->rgbtGreen;
				pixel.rgbRed   = t1->rgbtRed;
				pixel.rgbReserved =  255 ;
			}
			*buffer++ = pixel;
			t1++; t2++;
		}
	}
	m_alphaBmp.Attach(hDIB);
	ReleaseDC( 0 , tempDC);
	delete[] bits1;
	delete[] bits2;
}


Но функция всё равно работает с оригиналом-битмапом, в котором пикселы какого-то определённого цвета принимаются за прозрачный.

*************************************

Ладно, как я вывернулся, и нутром чую что это правильно, хотя надо всё же доказать математически. Нужная икона из image list рисуется полупрозрачной вот так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
Dim hdcAlphaBlend As Long
Dim hbmpImageTemp As Long
Dim hbmpAlphaBlendOld As Long

' Prepare temp drawing surface
hdcAlphaBlend = CreateCompatibleDC(hdc)
hbmpImageTemp = CreateCompatibleBitmap(hdc, m_lImageWidth, m_lImageHeight)
hbmpAlphaBlendOld = SelectObject(hdcAlphaBlend, hbmpImageTemp)

' First copy the real part of hdc we will draw to
BitBlt hdcAlphaBlend,  0 ,  0 , m_lImageWidth, m_lImageHeight, _
   hdc, xPixels, yPixels, SRCCOPY
   
' Put the icon into the temp drawing surface
ImageList_Draw _
    m_hIml, _
    iImgIndex, _
    hdcAlphaBlend, _
     0 , _
     0 , _
    ILD_TRANSPARENT

' Blending the icon with global transparent effect onto the dest surface
Dim Blendfunc As BLENDFUNCTION
Blendfunc.BlendOp = AC_SRC_OVER
Blendfunc.SourceConstantAlpha = btAlpha
Dim lBF As Long
CopyMemory lBF, Blendfunc,  4 

AlphaBlend hdc, xPixels, yPixels, m_lImageWidth, m_lImageHeight, _
   hdcAlphaBlend,  0 ,  0 , m_lImageWidth, m_lImageHeight, lBF

 
' Cleanup code
SelectObject hdcAlphaBlend, hbmpAlphaBlendOld
DeleteObject hbmpImageTemp
DeleteDC hdcAlphaBlend

Я всё думал как правильно "прикрутить" AlphaBlend к тому, что я имею. Придумал вот как: я сначала копирую во временный буфер изображение с экрана, затем вывожу на него иконку, у которой есть своя маска полупрозрачности, а затем через AlphaBlend накладываю всё это "временное" хозяйство на исходный участок на экране, но уже применяя общий заданный уровень прозрачности при этой операции.

Надо конечно доказать чисто математически что получается то же самое как если бы сделать вывод полупрозрачным на нужный DC учитывая полупрозрачные пиксели иконки. Разницу уловили? Вместо создания спец-32-битного-битмапа с маской и его выводом напрямую через AlphaBlend я рисую в копии реального экрана, а затем уже вывожу эту копию полупрозрачной.

Я предполагаю, что операция полупрозрачного вывода является транзитивной, т.е. независимо от того, в каком порядке её применили, получаем один и тот же результат. По крайней мере, я это не опроверг путём попиксельного анализа скриншотов в Photoshop. Я взял и тупо сравнил характерные пиксели, полученные моим методом, и через "стандартный" ILS_ALPHA в ImageList_DrawIndirect. Результат совпадает в обоих случаях. Я сравнивал 3 категории пикселей: из области где в иконке былая полная прозрачность, из полупрозрачной области (в скриншотах выше это края фотоаппарата), и из области непрозрачных пикселей иконки. Результат: всё сошлось один-в-один по RGB показателям и точным координатам пикселей.

Прошу знающих людей отписаться по данному решению и хотя бы даже подтвердить что я всё делаю правильно чтобы мне было спокойней на душе. Как будет время - постараюсь найти математику и строго всё доказать сам для полного успокоения моей души.

И ещё. Предложенный метод будет работать в Win9x начиная с 98-й, а WinNT - с 2000-й Винды. И даже есть такая информация, что будет работать шустро, т.к. внутри Винда может использовать DirectX при работе AlphaBlend. И ещё добавлю, что метод получается универсальным - он будет действовать даже для 8-б 16- и 24-битных иконок, которые про понятие прозрачности и не слыхали :)
...
Рейтинг: 0 / 0
03.05.2011, 15:30
    #37243892
Dignat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
Столкнулся с такое же проблемой. Решение нашел тут
http://www.codeproject.com/KB/miscctrl/AlphaImageImagelist.aspx

Нужен манифест
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
      version="1.0.0.0"
      processorArchitecture="X86"
      name="My.App.Name"
      type="win32"
/>
<description>Description of my app.</description>
<dependency>
      <dependentAssembly>
            <assemblyIdentity
                  type="win32"
                  name="Microsoft.Windows.Common-Controls"
                  version="6.0.0.0"
                  processorArchitecture="X86"
                  publicKeyToken="6595b64144ccf1df"
                  language="*"
            />
      </dependentAssembly>
</dependency>
</assembly>

код примерно такой

Код: plaintext
1.
2.
list = ImageList_Create(width, height, ILC_COLOR32  or  ILC_MASK,  1 ,  1 );
ImageList_AddIcon(list, ico);

В данной иконке картинка имеет глубину 32 бита, а маска - 8 бит. А она в свою очередь была программно конвертирована из png.
...
Рейтинг: 0 / 0
03.05.2011, 15:33
    #37243897
Dignat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)?
В манифесте надо только не забыть поменять имя программы My.App.Name на свое.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как нарисовать иконку из стандартного image list полупрозрачной (ImageList_DrawIndirect)? / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]