Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   Работа с иконками + WinAPI (http://forum.oszone.net/showthread.php?t=140058)

Yashied 14-05-2009 04:19 1117878

Работа с иконками + WinAPI
 
Доброй ночи. Подскажите пожалуйста, кто имел с этим дело. Я пытаюсь создать с помощью функции CreateIconIndirect() новою иконку, при этом Bitmap я беру из одной (Back) иконки, а маску из другой (Front). Обе иконки 32x32x32bpp. По идеи должна получится иконка Back "обрезанная" по маске из иконки Front. Но этого не происходит. Результирующая иконка эквивалентна иконке Back, т.е. маска из иконки Front вообще не воспринимается. В чем здесь может быть дело? Подозреваю, что я что-то упустил, но ... что?

Спасибо.

Код:

#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



Время: 11:01.

Время: 11:01.
© OSzone.net 2001-