Icons mit GDI+ zeichnen...

  • Hallo,

    wie kann ich auf die GUI einen Icon + Schrift zeichnen? Im Moment sieht das so aus:

    Bild1:
    [Blockierte Grafik: http://deepsoftware.spacequadrat.de/Downloads/www.AutoIt.de/Bild2.jpg]

    So sollte das aussehen:

    Bild2:
    [Blockierte Grafik: http://deepsoftware.spacequadrat.de/Downloads/www.AutoIt.de/Bild1.jpg]

    Und noch eine Frage. Hier bei Bild2 sehen die Ränder folgendermaßen aus:

    [Blockierte Grafik: http://deepsoftware.spacequadrat.de/Downloads/www.AutoIt.de/Bild3.jpg]

    Wie bekommt man denn so was hin?

    Ach ja: Ich erwarte von niemandem, dass er einen fertigen Script postet. Es reichen mir auch Links bzw. einzelne Befehle ;) .

    Hier noch der Code:

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

    AutoIt Version: 3.3.0.0
    Author: Burak Keskin ©

    Script Function:
    Template AutoIt script.

    #ce ----------------------------------------------------------------------------

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

    ; Script Start - Add your code below here

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

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    Opt("WinTitleMatchMode", 4)
    Local $TrayPos = WinGetPos("classname=Shell_TrayWnd")
    Opt("WinTitleMatchMode", 1)

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

    Global $Width = 227
    Global $Height = 71

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

    $Form1 = GUICreate("Form1", $Width, $Height, _
    @DesktopWidth - $Width + 1 - 100, _
    @DesktopHeight - $TrayPos[3] - $Height + 1 - 100, _
    $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_WINDOWEDGE))
    WinSetOnTop($Form1, "", 1)

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

    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($Form1)
    $Bitmap = _GDIPlus_BitmapCreateFromGraphics($Width, $Height, $hGraphic) ;create bitmap
    $backbuffer = _GDIPlus_ImageGetGraphicsContext($Bitmap)
    ;~ _GDIPlus_GraphicsSetSmoothingMode($backbuffer, 2)
    $hBrush = _GDIPlus_BrushCreateSolid(0xFFFFFF00)
    _GDIPlus_GraphicsClear($backbuffer)

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

    ;Malt die Ränder auf die GUI
    $hPen = _GDIPlus_PenCreate(0xFF767676)
    _GDIPlus_GraphicsDrawLine($backbuffer, 0, 0, 227, 0, $hPen)
    _GDIPlus_GraphicsDrawLine($backbuffer, 0, 69, 227, 69, $hPen)
    _GDIPlus_GraphicsDrawLine($backbuffer, 0, 0, 0, 68, $hPen)
    _GDIPlus_GraphicsDrawLine($backbuffer, 225, 0, 225, 68, $hPen)

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

    ;~ ;Malt die Hintergrundfarben
    $Array = ColorGradient(0xFFFFFF, 0xE4E5F0, 68)

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

    For $i = 1 To 68
    $hPen = _GDIPlus_PenCreate("0xFF" & StringTrimLeft(Hex($Array[$i - 1]), 2))
    _GDIPlus_GraphicsDrawLine($backbuffer, 1, $i, 224, $i, $hPen)
    Next

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

    ;Malt die letzten Punkte
    ;~ $hPen = _GDIPlus_PenCreate(0xFF474747)
    ;~ _GDIPlus_GraphicsDrawLine($backbuffer, 0, 0, 1, 0, $hPen)
    ;~ _GDIPlus_GraphicsDrawLine($backbuffer, 0, 1, 0, 0, $hPen)

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

    ;Malt das Bild auf die GUI
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $Bitmap, 0, 0, $Width, $Height)

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

    $hBitmap_GDI = _GDIPlus_BitmapCreateHBITMAPFromBitmap($Bitmap)
    $capPic = GUICtrlCreatePic("", 0, 0, $Width, $Height)
    _SetBitmapToCtrl($capPic, $hBitmap_GDI)

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

    GuiRoundCorners($Form1, 0, 0, 2, 2)

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

    GUISetState(@SW_SHOW)

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

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

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

    EndSwitch
    WEnd

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

    Func Close()
    ;~ _GDIPlus_BrushDispose($hBrush)
    ;~ _GDIPlus_BitmapDispose($Bitmap)
    ;~ _GDIPlus_GraphicsDispose($backbuffer)
    ;~ _GDIPlus_GraphicsDispose($hGraphic)
    ;~ _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>Close

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

    Func ColorGradient($hInitialColor, $hFinalColor, $iReturnSize)
    $hInitialColor = Hex($hInitialColor, 6)
    $hFinalColor = Hex($hFinalColor, 6)

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

    Local $iRed1 = Dec(StringLeft($hInitialColor, 2))
    Local $iGreen1 = Dec(StringMid($hInitialColor, 3, 2))
    Local $iBlue1 = Dec(StringMid($hInitialColor, 5, 2))

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

    Local $iRed2 = Dec(StringLeft($hFinalColor, 2))
    Local $iGreen2 = Dec(StringMid($hFinalColor, 3, 2))
    Local $iBlue2 = Dec(StringMid($hFinalColor, 5, 2))

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

    Local $iPlusRed = ($iRed2 - $iRed1) / ($iReturnSize - 1)
    Local $iPlusBlue = ($iBlue2 - $iBlue1) / ($iReturnSize - 1)
    Local $iPlusGreen = ($iGreen2 - $iGreen1) / ($iReturnSize - 1)

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

    Dim $iColorArray[$iReturnSize]
    For $i = 0 To $iReturnSize - 1
    $iNowRed = Floor($iRed1 + ($iPlusRed * $i))
    $iNowBlue = Floor($iBlue1 + ($iPlusBlue * $i))
    $iNowGreen = Floor($iGreen1 + ($iPlusGreen * $i))
    $iColorArray[$i] = Dec(Hex($iNowRed, 2) & Hex($iNowGreen, 2) & Hex($iNowBlue, 2))
    Next
    Return ($iColorArray)
    EndFunc ;==>ColorGradient

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

    Func GuiRoundCorners($h_win, $i_x1, $i_y1, $i_x3, $i_y3)
    $pos = WinGetPos($h_win)
    $ret = DllCall("gdi32.dll", "long", "CreateRoundRectRgn", "long", $i_x1, "long", $i_y1, "long", $pos[2], "long", $pos[3], "long", $i_x3, "long", $i_y3)
    If $ret[0] Then
    $ret2 = DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $h_win, "long", $ret[0], "int", 1)
    If $ret2[0] Then
    Return 1
    Else
    Return 0
    EndIf
    Else
    Return 0
    EndIf
    EndFunc ;==>GuiRoundCorners

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

    Func _SetBitmapToCtrl($CtrlId, $hBitmap)
    Local Const $STM_SETIMAGE = 0x0172
    Local Const $IMAGE_BITMAP = 0
    Local Const $SS_BITMAP = 0xE
    Local Const $GWL_STYLE = -16

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

    Local $hWnd = GUICtrlGetHandle($CtrlId)
    If $hWnd = 0 Then Return SetError(1, 0, 0)

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

    Local $oldStyle = DllCall("user32.dll", "long", "GetWindowLong", "hwnd", $hWnd, "int", $GWL_STYLE)
    If @error Then Return SetError(2, 0, 0)
    DllCall("user32.dll", "long", "SetWindowLong", "hwnd", $hWnd, "int", $GWL_STYLE, "long", BitOR($oldStyle[0], $SS_BITMAP))
    If @error Then Return SetError(3, 0, 0)

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

    Local $oldBmp = DllCall("user32.dll", "hwnd", "SendMessage", "hwnd", $hWnd, "int", $STM_SETIMAGE, "int", $IMAGE_BITMAP, "int", $hBitmap)
    If @error Then Return SetError(4, 0, 0)
    If $oldBmp[0] <> 0 Then DllCall("GDI32.dll", "int", "DeleteObject", "int", $oldBmp[0])
    Return 1
    EndFunc ;==>_SetBitmapToCtrl

    [/autoit]
  • Hi,
    zu Bild 2, das ist relativ einfach, du zeichnest mit einer Farbe einen Rahmen und wandelst das Bild in z.B. ein komprimiertes JPG. Dann "glättet" dir der Komprimierungsalgorithmus das Bild automatisch, Antialiasing ist da meist kostenlos :thumbup: inbegriffen.

    Für Icons gibts eigene AutoIt-Befehle, such mal in der Hilfe nach _GuiImageList_XXXX, XXXX sind dann AddIcon, GetIcon usw. Damit ist das Iconhandling in Listen relativ geschmeidig zu managen.
    Weiterhin gibts noch die _WinAPI_XXXX, XXXX für DrawIcon usw.
    GuiCtrlCreateIcon uswusf :D

    Jede Menge Möglichkeiten, sogar mit Beispielscripten!