Доброй ночи. Подскажите пожалуйста, кто имел с этим дело. Я пытаюсь создать с помощью функции
CreateIconIndirect() новою иконку, при этом
Bitmap я беру из одной (Back) иконки, а маску из другой (Front). Обе иконки
32x32x32bpp. По идеи должна получится иконка
Back "обрезанная" по маске из иконки
Front. Но этого не происходит. Результирующая иконка эквивалентна иконке
Back, т.е. маска из иконки
Front вообще не воспринимается. В чем здесь может быть дело? Подозреваю, что я что-то упустил, но ... что?
Спасибо.
Код:
![Выделить весь код](images/misc/selectcode.png)
#Include <WinAPI.au3>
local $Form, $sBackInfo, $sFrontInfo, $hBackIcon, $hFrontIcon, $hResultIcon
$Form = GUICreate('', 100, 100)
GUISetState()
; Получаем иконки
$hBackIcon = _WinAPI_PrivateExtractIcon('shell32.dll', 0, 32, 32)
$hFrontIcon = _WinAPI_PrivateExtractIcon('shell32.dll', 28, 32, 32)
; Получаем информацию о иконках
$sBackInfo = DllStructCreate('int fIcon;dword xHotspot;dword yHotspot;ptr hbmMask;ptr hbmColor')
DllCall('user32.dll', 'int', 'GetIconInfo', 'hwnd', $hBackIcon, 'ptr', DllStructGetPtr($sBackInfo))
$sFrontInfo = DllStructCreate('int fIcon;dword xHotspot;dword yHotspot;ptr hbmMask;ptr hbmColor')
DllCall('user32.dll', 'int', 'GetIconInfo', 'hwnd', $hFrontIcon, 'ptr', DllStructGetPtr($sFrontInfo))
; Задаем иконке Back маску из иконки Front
DllStructSetData($sBackInfo, 'hbmMask', DllStructGetData($sFrontInfo, 'hbmMask'))
;DllStructSetData($sBackInfo, 'hbmColor', DllStructGetData($sFrontInfo, 'hbmColor'))
; Создаем новую иконку на основе структуры $sBackInfo с измененной информацией
$hResultIcon = _WinAPI_CreateIconIndirect($sBackInfo)
; Выводим результат (???)
_WinAPI_DrawIcon(_WinAPI_GetDC($Form), 34, 34, $hResultIcon)
do
until GUIGetMsg() = -3
#Region Additional Function (На нижеследующие функции можно не обращать внимание)
func _WinAPI_CreateIconIndirect($tICONINFO)
local $Ret = DllCall('user32.dll', 'int', 'CreateIconIndirect', 'ptr', DllStructGetPtr($tICONINFO))
if (@error) or ($Ret[0] = 0) or ($Ret[0] = Ptr(0)) then
return SetError(1, 0, 0)
endif
return SetError(0, 0, $Ret[0])
endfunc; _WinAPI_CreateIconIndirect
func _WinAPI_PrivateExtractIcon($sIcon, $iIndex, $iWidth, $iHeight)
local $hIcon, $tIcon = DllStructCreate('hwnd'), $tID = DllStructCreate('hwnd')
local $Ret = DllCall('user32.dll', 'int', 'PrivateExtractIcons', 'str', $sIcon, 'int', $iIndex, 'int', $iWidth, 'int', $iHeight, 'ptr', DllStructGetPtr($tIcon), 'ptr', DllStructGetPtr($tID), 'int', 1, 'int', 0)
if (@error) or ($Ret[0] = 0)then
return SetError(1, 0, 0)
endif
$hIcon = DllStructGetData($tIcon, 1)
if ($hIcon = Ptr(0)) or (not IsPtr($hIcon)) then
return SetError(1, 0, 0)
endif
return SetError(0, 0, $hIcon)
endfunc; _WinAPI_PrivateExtractIcon
#EndRegion Additional Function