Button-Icon aus dll -> Problem bei der Anzeigegröße

  • Moin,

    ich verwende in einem Skript .ico-Dateien als Button-Icons, klappt soweit. Packe ich nun die .ico's in eine .dll und greife auf diese zu, werden die Icons zwar im Button dargestellt, allerdings um einiges kleiner. Es handelt sich nicht um "multiple icons", sie liegen also auch nur in einer Größe vor.
    Gibt es eine Möglichkeit, auf die Icons in der dll zuzugreifen und gleichzeitig die "richtige" Größe zu behalten oder muss ich bei den .ico-Dateien bleiben?

    Zur Verdeutlichung hier ein Beispielskript, im Anhang Skript + Icon-datei + Icon-dll.

    Besten Dank im Voraus!

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 345, 307, 282, 145)
    $Button1 = GUICtrlCreateButton("Button1", 64, 80, 80, 80, BitOR($BS_ICON,$WS_GROUP))
    GUICtrlSetImage(-1, @WorkingDir&"\1.ico")
    $Button2 = GUICtrlCreateButton("Button2", 200, 80, 80, 80, BitOR($BS_ICON,$WS_GROUP))
    GUICtrlSetImage(-1, @WorkingDir&"\icons.dll", 1)
    $Label1 = GUICtrlCreateLabel("Aus .ico-Datei", 72, 48, 70, 17)
    $Label2 = GUICtrlCreateLabel("Aus .dll", 208, 48, 102, 17)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

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

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    WEnd

    [/autoit]

    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

  • wenn du statt einem Button ein "Icon"-Control benutzt, wird die größe korrekt angezeigt:

    [autoit]

    GUICtrlCreateIcon(@WorkingDir&"\icons.dll",1,64,170,72,72)

    [/autoit]

    die icon-controls können auch angeklickt werden, somit erreichst du die gleiche funktionalität wie mit einem button...

    grüße,
    r4lf

  • Moin,

    das ist merkwürdig, habe kein Passwort eingestellt und kann es auch noch immer ohne Probleme öffnen. Habe es spaßeshalber nochmal neu gepackt und hochgeladen.
    Die Lösung von r4lf ist ideal, vielen Dank!

    mfG

  • Hallo dimmuwinter,

    du kannst auch eine _GUIImageList nehmen:

    [autoit]

    ;#AutoIt3Wrapper_au3check_parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
    #include <GUIConstantsEx.au3>
    #include <GuiButton.au3>
    #include <GuiImageList.au3>

    [/autoit][autoit][/autoit][autoit]

    Opt("MustDeclareVars", 1)

    [/autoit][autoit][/autoit][autoit]

    _Main()

    [/autoit][autoit][/autoit][autoit]

    Func _Main()
    Local $sBMPNormal = @ScriptDIR & "\Icons\dsFirst_NORMAL.BMP"
    Local $sBMPHot = @ScriptDir & "\Icons\dsFirst_mouseover.bmp"
    Local $sBMPPress = @ScriptDir & "\Icons\dsFirst_mousedown.bmp"
    Local $sBMPImage = @ScriptDir&"\icons.dll"
    Local $btn1, $btn2, $btn3, $btn4, $msg
    Local $hImagebtn1, $hImagebtn2, $hImagebtn3 ,$hImagebtn4

    [/autoit][autoit][/autoit][autoit]

    ;Caveat: Minimum Operating Systems: Windows XP.

    [/autoit][autoit][/autoit][autoit]

    ;Image list with multiple images will only show the images
    ;other than the 1st image when Themes are used.

    [/autoit][autoit][/autoit][autoit]

    Local $hGUI = GUICreate("Button Imagelists - Minimum OS: Windows XP",400,300)

    [/autoit][autoit][/autoit][autoit]

    GUICtrlCreatePic(@WindowsDir & "\Web\Wallpaper\Windows XP.jpg", 0, 0, 400, 300)
    GUICtrlSetState(-1, $GUI_DISABLE)

    [/autoit][autoit][/autoit][autoit]

    ;multi state image Bitmap
    $btn1 = GUICtrlCreateButton("This Way", 30, 30, 90, 32)
    GUICtrlSetTip(-1, "Multi state bitmap imagelist")
    $hImagebtn1 = _GUIImageList_Create(24, 24, 3, 3)
    _GUIImageList_AddBitmap($hImagebtn1, $sBMPNormal);1 - Normal
    _GUIImageList_AddBitmap($hImagebtn1, $sBMPHot) ;2 - Hot
    _GUIImageList_AddBitmap($hImagebtn1, $sBMPPress) ;3 - Pressed
    _GUIImageList_AddBitmap($hImagebtn1, $sBMPPress);4 - Disabled
    _GUIImageList_AddBitmap($hImagebtn1, $sBMPNormal);5 - Defaulted
    _GUIImageList_AddBitmap($hImagebtn1, $sBMPNormal);6 - Stylus Hot (tablet computers only)
    _GUICtrlButton_SetImageList($btn1, $hImagebtn1)
    ;#cs
    ;single state image Bitmap
    $btn2 = GUICtrlCreateButton("This Way", 30, 70, 90, 32)
    GUICtrlSetBkColor(-1,$GUI_BKCOLOR_TRANSPARENT)
    GUICtrlSetTip(-1, "Single bitmap imagelist")
    $hImagebtn2 = _GUIImageList_Create(24, 24, 5, 3)
    _GUIImageList_AddBitmap($hImagebtn2, $sBMPNormal);1 - Normal
    _GUICtrlButton_SetImageList($btn2, $hImagebtn2)
    ;#ce
    ;single state image Icon
    $btn3 = GUICtrlCreateButton("Unlock", 30, 110, 90, 40)
    GUICtrlSetTip(-1, "Single icon imagelist")
    $hImagebtn3 = _GUIImageList_Create(32, 32, 5, 3)
    _GUIImageList_AddIcon($hImagebtn3, "msrating.dll", 10, True)
    _GUICtrlButton_SetImageList($btn3, $hImagebtn3)

    [/autoit][autoit][/autoit][autoit]

    ;single state image Bitmap with overlayed text
    $btn4 = GUICtrlCreateButton("Help", 30, 160, 80, 80)
    GUICtrlSetTip(-1, "Single bitmap imagelist with overlayed text")
    GUICtrlSetFont(-1, 14, 800, -1, "Comic Sans MS")
    $hImagebtn4 = _GUIImageList_Create(72, 72, 5, 3)
    _GUIImageList_AddIcon($hImagebtn4, $sBMPImage)
    _GUICtrlButton_SetImageList($btn4, $hImagebtn4, 4)

    [/autoit][autoit][/autoit][autoit]

    GUISetState()

    [/autoit][autoit][/autoit][autoit]

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    ; Case $btn1
    Case $btn2
    GUICtrlSetState($btn1, $GUI_DISABLE)
    Case $btn3
    GUICtrlSetState($btn1, $GUI_ENABLE)
    ; Case $btn4
    EndSwitch
    WEnd
    EndFunc ;==>_Main

    [/autoit][autoit][/autoit][autoit][/autoit]

    Um das Beispiel vollständig beurteilen zu können benötigst du ach noch Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    Edit: in deinem Skriptbeispiel benutzt d @Workingdir, dies funktioniert am Skriptanfang ach immer problemlos. Falls du jedoch

    [autoit]

    FileSetFolder;
    FileOpenDialog;
    FileSaveDialog

    [/autoit]

    in deinem Skript verwendest wird dadurch @WorkingDir verstellt nimm also besser @SkriptDir
    mfg autoBert