Что нового

Прозрачность иконки над контролом Graphic

Webarion

Осваивающий
Сообщения
143
Репутация
24
Привет, облазил много, но что-то не нашел подходящего решения. Есть динамические иконки, которые могут браться как из файлов иконок .ico, так и из ресурса файла или программы .exe. Но при добавлении иконок, не получается создать прозрачность, там, где она должна быть. В данном примере, нужно, чтобы вокруг треугольника не было квадрата. Нужны примеры, как это сделать.

Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Local $binArrowIcon = '0x00000100010010100000010020006804000016000000280000001000000020000000010020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF000000FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF000000FF000000FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF000000FF000000FF000000FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF000000FF000000FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF000000FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFAC41FFFFAC41FFFFAC41FFFFAC41FFFFAC41FDFFAC41FCFFAC41FC7FAC41FC3FAC41FC7FAC41FCFFAC41FDFFAC41FFFFAC41FFFFAC41FFFFAC41FFFFAC41'
Global $sArrowIcon = @TempDir & 'arrow.png'
$hFile = FileOpen($sArrowIcon, 16 + 2)
FileWrite($hFile, $binArrowIcon)
FileClose($hFile)

$Form1 = GUICreate("Form1", 317, 150, 192, 124)

$Graphic1 = GUICtrlCreateGraphic(8, 8, 297, 129)
GUICtrlSetBkColor(-1, 0x99B4D1)

$Icon1 = GUICtrlCreateIcon($sArrowIcon, -1, 136, 56, 16, 16)
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit

    EndSwitch
WEnd
 
Автор
W

Webarion

Осваивающий
Сообщения
143
Репутация
24
Удалось это победить:
использовал Icons.au3: http://autoit-script.ru/index.php?topic=49.0
Код:
#include <Icons.au3>

	GUICreate('', 200, 100)

	$Graphic1 = GUICtrlCreateGraphic(8, 8, 180, 80)
	GUICtrlSetBkColor(-1, 0x99B4D1)

	$Pic = GUICtrlCreatePic('', 50, 30, 16, 16)
	$hIcon = _Icons_Icon_Extract(@SystemDir & '\shell32.dll', 144, 16, 16)
	$hBitmap = _Icons_Bitmap_CreateFromIcon($hIcon)
	_SetHImage($Pic, $hBitmap)
	_WinAPI_DeleteObject($hBitmap)
	_WinAPI_DestroyIcon($hIcon)

	GUISetState()

	Do
	Until GUIGetMsg() = -3

	GUIDelete()

Но есть небольшая неприятность, некоторые иконки размером 16x16 не отображаются, $hBitmap из UDF возвращается нулевым, при этом иконка существует, там что-то с альфа каналом. Но если размер иконки сделать например 17x17, то всё прекрасно отображается(иконка берётся большего размера и уменьшается до 17)

Здесь _Icons_Bitmap_IsAlpha возвращает 0

Код:
Func _Icons_Bitmap_IsAlpha($hBitmap)
	Local $Ret, $tBits
	$Ret = DllCall('gdi32.dll', 'int', 'GetBitmapBits', 'ptr', $hBitmap, 'long', 0, 'ptr', 0)
	If (@error) Or ($Ret[0] = 0) Then
		Return SetError(1, 0, 0)
	EndIf
	$Lenght = $Ret[0] / 4
	$tBits = DllStructCreate('dword[' & $Lenght & ']')
	$Ret = DllCall('gdi32.dll', 'int', 'GetBitmapBits', 'ptr', $hBitmap, 'long', $Ret[0], 'ptr', DllStructGetPtr($tBits))
	If (@error) Or ($Ret[0] = 0) Then
		Return SetError(1, 0, 0)
	EndIf
	For $i = 1 To $Lenght
		If BitAND(DllStructGetData($tBits, 1, $i), 0xFF000000) Then
			Return 1
		EndIf
	Next
	Return 0
EndFunc   ;==>_Icons_Bitmap_IsAlpha


А последующая функция так же отдаёт $hBitmap = 0:

Код:
If Not _Icons_Bitmap_IsAlpha($hBitmap) Then
		_GDIPlus_Startup()
		_WinAPI_DeleteObject($hBitmap)
		$Ret = DllCall($ghGDIPDll, 'int', 'GdipCreateBitmapFromHICON', 'ptr', $hIcon, 'ptr*', 0)
		If (Not @error) And ($Ret[0] = 0) Then
			$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($Ret[2])
			_GDIPlus_ImageDispose($Ret[2])
		Else
			$hBitmap = 0 ; - этот ноль отдаётся на некоторых иконках 16x16 при этом иконка существует
		EndIf
		_GDIPlus_Shutdown()
	EndIf
	Return $hBitmap
 
Верх