1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. JStaxton

Beiträge von JStaxton

  • Per POST daten an eine Website schicken (2 Parameter) und Internetseite danach aufrufen

    • JStaxton
    • 4. Januar 2010 um 18:21

    Guten Abend,

    Vielen Dank für eure Hilfestellungen!
    Ich habe alles viel zu kompliziert gemacht, und dazu wahrscheinlich auch noch umständlich erklärt! Was ich suchte - un nun durch eure Hinweise gefunden habe - war:

    [autoit]

    ShellExecute("https://www.meineseite.com/cgi-bin/webscr?Name1=A&Name2=B")

    [/autoit]

    Ich danke euch für eure Zeit!


    JStaxton

  • Per POST daten an eine Website schicken (2 Parameter) und Internetseite danach aufrufen

    • JStaxton
    • 4. Januar 2010 um 00:27

    Guten Abend allerseits,

    nach ein paar Versuchen mit der <INETv2.au3 > von GTASpider oder der <WinHTTP.au3> stecke ich immer noch fest. Ich hoffe Ihr könnt mir helfen eine Internetseite aufzurufen, an die ich zuvor noch 2 Parameter per POST geschickt habe.
    Was ich machen möchte ich eigentlich simpel: Ich habe eine Homepage. Auf dieser Hompage wird folgender "Button" eingebunden:

    Spoiler anzeigen
    PHP
    <form action="https://www.paypal.com/cgi-bin/webscr" method="post">
    <input type="hidden" name="cmd" value="_s-xclick">
    <input type="hidden" name="hosted_button_id" value="10670629">
    <input type="image" src="https://www.paypal.com/de_DE/DE/i/btn/btn_donateCC_LG.gif" border="0" name="submit" alt="Jetzt einfach, schnell und sicher online bezahlen – mit PayPal.">
    <img alt="" border="0" src="https://www.paypal.com/de_DE/i/scr/pixel.gif" width="1" height="1">
    </form>

    nun möchte ich diesen Button - mit den verstecken Feldern und den darin enhaltenen Daten - per AutoIt aus meinem Skript heraus aufrufen, ohne vorher auf der Homepage zu sein.

    Ich dachte zunächst einfach an

    Spoiler anzeigen
    [autoit]

    #include <INETv2.au3>
    $aSource = _INetGetSourcePost("https://www.paypal.com/cgi-bin/webscr/","cmd=_s-xclick&hosted_button_id=10670629")

    [/autoit]

    aber das schlägt fehl (Error 2)
    Auch der 2. Weg über die <WinHTTP.au3> führte zu keinem Ergebnis, da ich nicht weiß, was ich bei einer HTTPS-Verbindung beachten muss.


    Wie kann ich den Button nachahmen und die Seite aufrufen?


    Vielen Dank für eure Zeit
    JStaxton

  • GDI+ Problem: Grafik erst erstellen, dann in Hauptgrafik einfügen. (Viele kleine PNG-Bilder zu Grp zusammenfassen, dann einfügen)

    • JStaxton
    • 30. November 2009 um 18:16

    Hallo Leute,

    Ich bedanke mich für eure Hilfe! Toll!
    Das testscript sieht super aus! Auch mit transparenten PNGs!

    Jetzt werde ich versuchen das in das Hauptscript einzuarbeiten. Wenn es da keine größeren Probleme gibt, dann close ich das hier...


    VIELEN DANK @ Progandy & UEZ & Ahnungslos
    JStaxton

    edit: es scheint alles wunderbar zu funktionieren! Hab jetzt unterfunctionen, die eben schon Bilder vorbereiten in die "BackBuffer". Beim Redraw-können so dann ganze gruppen auf einmal gezeichnet werden, klasse... Warum der Aufwand? man merkt bei vielen Bildern schon einen Geschwindigkeitsunterschied!

  • GDI+ Problem: Grafik erst erstellen, dann in Hauptgrafik einfügen. (Viele kleine PNG-Bilder zu Grp zusammenfassen, dann einfügen)

    • JStaxton
    • 30. November 2009 um 07:57

    hallo progandy und liebe community,

    ich habe versucht deinen Ansatz umzusetzen, bin aber gescheitert (fürs erste). Kannst du mir noch mal helfen?
    So sieht mein derzeitiger Testcode aus:

    Spoiler anzeigen
    [autoit]

    #include-once
    #include <GuiConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    ;~ #include <MouseSetOnEvent_UDF.au3>

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

    Opt("GUIOnEventMode", 1) ; Wechsle in den OnEvent Modus
    Opt('PixelCoordMode' ,0 ) ; 0 = relative coords to the defined window

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

    _GDIPlus_Startup()
    Global $hWnd_SC = GUICreate('GUI', 500, 500, -1, -1); $WS_CLIPCHILDREN;
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exitMain")

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

    $hGraphicsGUI = _GDIPlus_GraphicsCreateFromHWnd($hWnd_SC)
    $hBmpBackBuffer = _GDIPlus_BitmapCreateFromGraphics(500, 500, $hGraphicsGUI)
    $hGraphicsBackBuffer = _GDIPlus_ImageGetGraphicsContext($hBmpBackBuffer)

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

    ; Vorzeichnen:
    _GDIPlus_GraphicsDrawRect($hGraphicsBackBuffer, 10, 10, 100, 100)

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

    ; Auf GUI:
    _GDIPlus_GraphicsDrawImage($hGraphicsGUI, $hGraphicsBackBuffer, 0, 0)
    GUISetState()
    ;~ SetGui()
    While True
    Sleep(1000)
    WEnd

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

    Func _exitMain()
    ;~ _CollectGarbage()
    ; Aufräumen
    _GDIPlus_GraphicsDispose($hGraphicsGUI)
    _GDIPlus_GraphicsDispose($hGraphicsBackBuffer)
    _GDIPlus_BitmapDispose($hBmpBackBuffer)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==> _exitMain

    [/autoit]

    Ich sehe das Rechteck nicht, das gezeichnet werden sollte...


    Gruß
    JStaxton

  • GDI+ Problem: Grafik erst erstellen, dann in Hauptgrafik einfügen. (Viele kleine PNG-Bilder zu Grp zusammenfassen, dann einfügen)

    • JStaxton
    • 29. November 2009 um 14:57

    sobald ich Bitmap benutze, verliere ich dann nicht die Transparenz?

    Die übereinandergelegten Bilder sind immer noch teilweise transpartent und sollen den hintergrund durcherkennen lassen...

    Ich werd das mal ausprobieren.
    Vielen Dank für deine Antwort Progandy

    ps.: ich hab noch eine Frage: wenn ich ein Array voller GDIImageLoadFromFile erstelle, wie nutze ich dann den Befehl dispose?

  • GDI+ Problem: Grafik erst erstellen, dann in Hauptgrafik einfügen. (Viele kleine PNG-Bilder zu Grp zusammenfassen, dann einfügen)

    • JStaxton
    • 29. November 2009 um 13:01

    Guten Tag,

    Ich habe folgendes Problem:
    meine Popup-GUI besteht aus vielen PNG-Dateien. Wenn ich jetzt ein $WM_PAINT-Ereignis auslöse, dann werden sämtliche png's einzeln neu gezeichnet. Und das dauert lange! (also ein paar ms zu viel für mich)

    Dabei ist es gar nicht nötig alles neu übereinander zu legen.
    Ich möchte einzelne Bild(PNG)-Gruppen, schon vorher übereinanderlegen lassen, und dann bei Bedarf ($WM_PAINT) nur das komplette Gruppenbild einfügen.
    Geht das?

    Hier mal ein ganz kleines bisschen Code, ich hoffe das hilft... (Skript nicht ganz lauffähig, aber ich denke was ich möchte wird klar)

    Spoiler anzeigen
    [autoit]

    #include-once
    #include <GuiConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>

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

    _GDIPlus_Startup()
    ; Set accelerators
    Global $SC_Width = 600
    Global $SC_Height = 526
    Global $SC_Titlebar_Height = 26
    Global $hWnd_SC = GUICreate('GUI', $SC_Width, $SC_Height, -1, -1,$WS_POPUP); $WS_CLIPCHILDREN;
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exitMain")

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

    ;~ Global $hWnd_Chips = GUICreate("", 169, 68, 0, 0, $WS_POPUP, $WS_EX_LAYERED + $WS_EX_MDICHILD, $hWnd_SC)
    ;~ GUISetState(@SW_SHOW)

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

    ;~ WinWait('GUI')
    Global $Lbl_Title = GUICtrlCreateLabel('', 0, 0, $SC_Width, $SC_Titlebar_Height, -1, $GUI_WS_EX_PARENTDRAG )
    Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd_SC)

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

    ; these Controls are invisible, but have correct position for user interaction
    Global $SC_Btn_Dim = 16

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

    Global $XClose = GUICtrlCreateLabel('',$SC_Width- $SC_Btn_Dim, 0, $SC_Btn_Dim, $SC_Btn_Dim)
    GUICtrlSetOnEvent($XClose, "_exitMain")
    GUICtrlSetState ( $XClose, $GUI_ONTOP )

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

    ;these Controls have no dimension, only for functions fired by Hotkeys;
    Global $Lbl_Redraw_GUI = GUICtrlCreateLabel('',0,0,0,0)
    GUICtrlSetOnEvent($Lbl_Redraw_GUI, "_Redraw_GUI")

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

    Dim $Arr_AccelKeys[2][2]=[ _
    ['{SPACE}', $Lbl_Redraw_GUI], _
    ["!q", $XClose] _
    ]
    GUISetAccelerators($Arr_AccelKeys,$hWnd_SC)

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

    GUISetState()
    GUIRegisterMsg($WM_PAINT, "_Redraw_GUI")

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

    While True
    Sleep(1000)
    WEnd

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

    Func _Redraw_GUI()
    _WinAPI_RedrawWindow ($hWnd_SC, 0, 0, $RDW_UPDATENOW)
    _GDIPlus_GraphicsDrawImageRect ($hGraphic, $hImg_Pic, 3, 26, 600, 500) ; Bild
    _GDIPlus_GraphicsDrawImage ($hGraphic, $hImg_MinBG, 3, 429) ; IconHintergrund

    ;Diese Bilder hier möchte ich in eine Gruppe fassen, damit ich nur einen Befehl habe: _GDIPlus_GraphicsDrawImage ( $hGraphic, hImg_Icon, 10, 440)
    local $SC_Icon_Dim=10
    _GDIPlus_GraphicsDrawImageRectRect ($hGraphic, $hImg_Icon1, 0, 0, $SC_Icon_Dim, $SC_Icon_Dim, 10, 0*($SC_Icon_Dim+10)+440 , $SC_Icon_Dim, $SC_Icon_Dim) ; FooterIcon
    _GDIPlus_GraphicsDrawImageRectRect ($hGraphic, $hImg_Icon2, 0, 0, $SC_Icon_Dim, $SC_Icon_Dim, 10, 1*($SC_Icon_Dim+10)+440 , $SC_Icon_Dim, $SC_Icon_Dim) ; FooterIcon
    _GDIPlus_GraphicsDrawImageRectRect ($hGraphic, $hImg_Icon3, 0, 0, $SC_Icon_Dim, $SC_Icon_Dim, 10, 2*($SC_Icon_Dim+10)+440 , $SC_Icon_Dim, $SC_Icon_Dim) ; FooterIcon
    _GDIPlus_GraphicsDrawImageRectRect ($hGraphic, $hImg_Icon4, 0, 0, $SC_Icon_Dim, $SC_Icon_Dim, 10, 3*($SC_Icon_Dim+10)+440 , $SC_Icon_Dim, $SC_Icon_Dim) ; FooterIcon

    ; Hier folgen Viele weitere Bilder


    Return $GUI_RUNDEFMSG
    EndFunc


    Func _exitMain()
    ;~ _CollectGarbage()
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==> _exitMain

    [/autoit]

    Ich bedanke mich
    JStaxton

  • GUI nur teilweise neu zeichnen bei $WM_PAINT-Ereignis (bei Popup-GUI mit benutzerdefinierter Funktion)

    • JStaxton
    • 28. November 2009 um 10:32

    Ich benutze WinXP 32bit
    das "flackern" triit auf wenn ständig neu gezeichnet werden muss, weil zum Beispiel ein fremdes Fenster, das teilw. über der GUI lag, "weggezogen" wird...

  • GUI nur teilweise neu zeichnen bei $WM_PAINT-Ereignis (bei Popup-GUI mit benutzerdefinierter Funktion)

    • JStaxton
    • 28. November 2009 um 10:23

    Guten Tag,

    wie im Titel beschrieben möchte ich bei Auftreten des $WM_PAINT-Ereignisses die GUI nur teilweise neu zeichnen, da mir das Neuzeichnen aller Elemente zu lange dauert und unnötiges Flickern auslöst...
    Ich habe das in einem kleinen Beipsiel versucht zu erklären (siehe Anhang).

    Hier trotzdem nochmal der Quellcode:

    Spoiler anzeigen
    [autoit]

    #include-once
    #include <GuiConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    #include <WinAPI.au3>

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

    Opt("GUIOnEventMode", 1) ; Wechsle in den OnEvent Modus

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

    $h_Wnd = GUICreate('GUI', 800, 600, -1, -1,$WS_POPUP );
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exitMain")

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

    $Lbl_Title = GUICtrlCreateLabel('', 0, 0, 800, 25, -1, $GUI_WS_EX_PARENTDRAG)
    GUICtrlSetState ( $Lbl_Title, $GUI_ONTOP )
    _GDIPlus_Startup()

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

    $hFormat = _GDIPlus_StringFormatCreate ()
    $hFamily = _GDIPlus_FontFamilyCreate ("Arial")
    $hBrush = _GDIPlus_BrushCreateSolid (0xFFFFFFFF)
    $hFont = _GDIPlus_FontCreate ($hFamily, 12, 0,2)

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($h_Wnd)
    $hImg_Title = _GDIPlus_ImageLoadFromFile("Title.png")

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

    GUISetState()
    _Redraw_GUI()
    GUIRegisterMsg($WM_PAINT, "_Redraw_GUI")

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

    While True
    Sleep(1000)
    WEnd

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

    Func _exitMain()
    _CollectGarbage()
    _GDIPlus_Shutdown()
    Exit
    EndFunc

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

    Func _Redraw_GUI()
    _WinAPI_RedrawWindow($h_Wnd, 0, 0, $RDW_UPDATENOW)

    _GDIPlus_GraphicsDrawImageRectRect($hGraphic, $hImg_Title, 0,0,_GDIPlus_ImageGetWidth($hImg_Title)-1,_GDIPlus_ImageGetHeight($hImg_Title),0,0,800,25)

    $hBrush = _GDIPlus_BrushCreateSolid (0xFFFFFFFF)
    $tLayout = _GDIPlus_RectFCreate ( 20, 8, 450, 18)
    _GDIPlus_GraphicsDrawStringEx ($hGraphic, "This is my Title - Exit with {ESC}", $hFont, $tLayout, $hFormat, $hBrush)

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

    _GDIPlus_GraphicsDrawImageRectRect($hGraphic, $hImg_Title, 0,0,_GDIPlus_ImageGetWidth($hImg_Title)-1,_GDIPlus_ImageGetHeight($hImg_Title),100,200,100,100)
    $tLayout = _GDIPlus_RectFCreate ( 105, 205, 90, 30)
    _GDIPlus_GraphicsDrawStringEx ($hGraphic, "This is GUIpart 1", $hFont, $tLayout, $hFormat, $hBrush)

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



    _GDIPlus_GraphicsDrawImageRectRect($hGraphic, $hImg_Title, 0,0,_GDIPlus_ImageGetWidth($hImg_Title)-1,_GDIPlus_ImageGetHeight($hImg_Title),600,200,100,100)
    $tLayout = _GDIPlus_RectFCreate ( 605, 205, 90, 30)
    _GDIPlus_GraphicsDrawStringEx ($hGraphic, "This is GUIpart 2", $hFont, $tLayout, $hFormat, $hBrush)

    $hBrush = _GDIPlus_BrushCreateSolid (0xFF000000)
    $tLayout = _GDIPlus_RectFCreate ( 200, 405, 400, 100)
    _GDIPlus_GraphicsDrawStringEx ($hGraphic, "When parts of the GUI are hidden by other Windows and this GUI is activated again, how can I optimize the _RedrawGUI() to only redraw the previous hidden parts?"&@lf&@lf& _
    "Try Moving the GUI party out of the desktop, and then moving back. You will see the flicker/delay when redraw occurs...I want to minimize that.", $hFont, $tLayout, $hFormat, $hBrush)

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


    _WinAPI_RedrawWindow($h_Wnd, 0, 0, $RDW_VALIDATE)
    Return $GUI_RUNDEFMSG
    EndFunc

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

    Func _CollectGarbage()
    _GDIPlus_StringFormatDispose($hFormat)
    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_FontDispose($hFont)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_ImageDispose($hImg_Title)
    Endfunc

    [/autoit]

    Für einen Hinweis wäre ich dankbar

    Grüße
    JStaxton

    Dateien

    ForumGUIpartyREDRAW.zip 1,59 kB – 248 Downloads
  • GUISetState(@SW_MINIMIZE) schließt die ganze GUI - Popup-GUI

    • JStaxton
    • 24. November 2009 um 00:50

    Guten Abend liebe AutoIt-Community,

    ich habe vor, eine GUI mit Hilfe von PNG's zu erstellen und bin ganz am Anfang. Da ist auch schon das erste Phänomen:
    Wenn ich die Funktion "Minimize()" aufrufe, dann minimiert die GUI zunächst, verschwindet dann aber komplett! Könnt ihr mir einen Tip geben woran das liegt?

    Ich habe den Code und die Dateien im Anhang platziert, aber vielleicht sehr ihr es auch schon so.

    Spoiler anzeigen
    [autoit]

    #include-once
    #include <GuiConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <StaticConstants.au3>
    #include <GDIPlus.au3>
    #include <WinAPI.au3>
    #include '_MouseHover.au3'

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

    #Region Options
    Opt('MustDeclareVars', 1) ; 1 = Variables must be pre-declared
    Opt('PixelCoordMode' ,0 ) ; 0 = relative coords to the defined window
    Opt("GUIOnEventMode", 1) ; Wechsle in den OnEvent Modus
    #EndRegion

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

    #Region Dim Variablen
    Global Const $SC_Width_Init = 800
    Global Const $SC_Height_Init = 566
    Global Const $SC_Width_Max = 1920
    Global Const $SC_Height_Max = 1200

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

    Global Const $SC_Titlebar_Height =29
    Global Const $SC_Footer_Height =26
    Global Const $SC_Frame_Thickness = 3
    Global Const $SC_Btn_Dim = 17

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

    Global $SC_Width = $SC_Width_Init
    Global $SC_Height = $SC_Height_Init

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

    Global $int_Minimize=6
    Global $int_Maximize=12
    Global $int_XClose=0
    #EndRegion

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

    #Region GUI-Erstellung
    _GDIPlus_Startup()
    Global $h_SC = GUICreate('GUI', $SC_Width, $SC_Height, -1, -1,BitOR($WS_CLIPSIBLINGS,$WS_POPUP));, $WS_POPUP+$WS_EX_WINDOWEDGE) ;
    GUISetOnEvent($GUI_EVENT_CLOSE, "Terminate")
    GUIRegisterMsg($WM_PAINT, "Redraw_GUI")

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

    Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($h_SC)

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

    Global $hImg_Title = _GDIPlus_ImageLoadFromFile("Title.png")
    Global Const $hImg_Title_Width = _GDIPlus_ImageGetWidth ($hImg_Title)/2
    Global $hImg_TitleTint = _GDIPlus_ImageLoadFromFile("header_black_tint.png")
    Global Const $SC_Tint_Width = _GDIPlus_ImageGetWidth ($hImg_TitleTint)
    Global Const $SC_Tint_Height = _GDIPlus_ImageGetHeight ($hImg_TitleTint)
    ;~ Global $TitleTint = GUICtrlCreateLabel('',) ; falls etwas passieren soll bei hover über Tint

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

    Global $hImg_Btn = _GDIPlus_ImageLoadFromFile("but.png") ;enthält die PNG-Abschnitte für die Knöpfe, auch die Hover-Bilder

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

    Global $Minimize = GUICtrlCreateLabel('',$SC_Width-3*$SC_Btn_Dim-2*$SC_Frame_Thickness,2*$SC_Frame_Thickness,$SC_Btn_Dim,$SC_Btn_Dim,Default,$WS_EX_TRANSPARENT)
    GUICtrlSetOnEvent($Minimize, "Minimize")
    Global $Maximize = GUICtrlCreateLabel('',$SC_Width-2*$SC_Btn_Dim-2*$SC_Frame_Thickness,2*$SC_Frame_Thickness,$SC_Btn_Dim,$SC_Btn_Dim,Default,$WS_EX_TRANSPARENT)
    Global $XClose = GUICtrlCreateLabel('',$SC_Width-$SC_Btn_Dim-2*$SC_Frame_Thickness,2*$SC_Frame_Thickness,$SC_Btn_Dim,$SC_Btn_Dim,Default,$WS_EX_TRANSPARENT)
    GUICtrlSetOnEvent($XClose, "Terminate")

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

    Global $Title = GUICtrlCreatePic('', 0, 0, $SC_Width, $SC_Titlebar_Height, BitOR($SS_NOTIFY, $WS_CLIPCHILDREN, $WS_GROUP, $WS_CLIPSIBLINGS), BitOR($GUI_WS_EX_PARENTDRAG, $WS_EX_LAYERED))

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

    Global $Pic = GUICtrlCreatePic("Table_Carpet.jpg", $SC_Frame_Thickness, $SC_Titlebar_Height, $SC_Width-2*$SC_Frame_Thickness, $SC_Height-$SC_Titlebar_Height-$SC_Footer_Height, BitOR($SS_NOTIFY, $WS_CLIPCHILDREN, $WS_GROUP, $WS_CLIPSIBLINGS), $WS_EX_LAYERED)

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

    Global $Footer = GUICtrlCreatePic('footer-bg.jpg', 0, $SC_Height-$SC_Footer_Height, $SC_Width, $SC_Footer_Height, BitOR($SS_NOTIFY, $WS_CLIPCHILDREN, $WS_GROUP, $WS_CLIPSIBLINGS), $WS_EX_LAYERED)

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

    ;Ab hier wird der Rahmen erstellt: Das sind einfach Label deren Bk-Color gesetzt wird... geht vllt eleganter
    Global $Frame_left = GUICtrlCreateLabel('', 0, $SC_Titlebar_Height, $SC_Frame_Thickness, $SC_Height)
    Global $Frame_right = GUICtrlCreateLabel('', $SC_Width-$SC_Frame_Thickness, $SC_Titlebar_Height, $SC_Frame_Thickness, $SC_Height)
    Global $Frame_bottom = GUICtrlCreateLabel('', 0, $SC_Height-$SC_Frame_Thickness, $SC_Width, $SC_Frame_Thickness)
    GUISetState()
    local $color = PixelGetColor ( 1, $SC_Titlebar_Height-1, $h_SC)
    GUICtrlSetBkColor($Frame_left, $color)
    GUICtrlSetBkColor($Frame_right, $color)
    GUICtrlSetBkColor($Frame_bottom, $color)

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

    #EndRegion ;GUI-Erstellung Ende

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

    #Region Hover-Registrierung
    ;Knöpfe für die Hover-Überwachung registrieren... siehe #include '_MouseHover.au3'
    _HoverAddCtrl($Minimize)
    _HoverAddCtrl($Maximize)
    _HoverAddCtrl($XClose)
    AdlibEnable("_ProcessHover", 5)
    #EndRegion

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

    #Region Hauptschleife
    While 1
    Sleep(1000) ; Häng rum
    WEnd

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

    #EndRegion ;Ende Hauptprogramm

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

    Func Minimize()

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

    GUISetState(@SW_MINIMIZE)

    EndFunc

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

    Func Terminate()
    ;~ msgbox(0,"","Wird beendet")
    _GDIPlus_ShutDown ()
    Exit

    EndFunc

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

    Func Redraw_GUI()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($h_SC)
    _WinAPI_RedrawWindow($h_SC, 0, 0, $RDW_UPDATENOW)
    _GDIPlus_GraphicsDrawImageRectRect($hGraphic, $hImg_Title, 0, 0,$hImg_Title_Width-1, $SC_Titlebar_Height,0,0,$SC_Width,$SC_Titlebar_Height)
    ;~ _GDIPlus_GraphicsDrawImage($hGraphic, $hImage1, 0, 0)
    _GDIPlus_GraphicsDrawImageRectRect($hGraphic, $hImg_TitleTint, 0, 0,$SC_Tint_Width,$SC_Tint_Height,$SC_Width-$SC_Tint_Width-$SC_Frame_Thickness,$SC_Frame_Thickness,$SC_Tint_Width,$SC_Tint_Height)

    _GDIPlus_GraphicsDrawImageRectRect($hGraphic, $hImg_Btn, $int_Minimize*$SC_Btn_Dim, 0,$SC_Btn_Dim,$SC_Btn_Dim,$SC_Width-3*$SC_Btn_Dim-2*$SC_Frame_Thickness,2*$SC_Frame_Thickness,$SC_Btn_Dim,$SC_Btn_Dim)
    _GDIPlus_GraphicsDrawImageRectRect($hGraphic, $hImg_Btn, $int_Maximize*$SC_Btn_Dim, 0,$SC_Btn_Dim,$SC_Btn_Dim,$SC_Width-2*$SC_Btn_Dim-2*$SC_Frame_Thickness,2*$SC_Frame_Thickness,$SC_Btn_Dim,$SC_Btn_Dim)
    _GDIPlus_GraphicsDrawImageRectRect($hGraphic, $hImg_Btn, $int_XClose*$SC_Btn_Dim, 0,$SC_Btn_Dim,$SC_Btn_Dim,$SC_Width-$SC_Btn_Dim-2*$SC_Frame_Thickness,2*$SC_Frame_Thickness,$SC_Btn_Dim,$SC_Btn_Dim)
    ;~ _GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage1, 17, 0,17,17)
    _WinAPI_RedrawWindow($h_SC, 0, 0, $RDW_VALIDATE)
    Return $GUI_RUNDEFMSG
    EndFunc

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

    Func _HoverFound($ControlID)
    Switch $ControlID
    Case $Minimize
    $int_Minimize=$int_Minimize+1
    Redraw_GUI()
    Case $Maximize
    $int_Maximize=$int_Maximize+1
    Redraw_GUI()
    Case $XClose
    $int_XClose=$int_XClose+1
    Redraw_GUI()
    EndSwitch
    EndFunc

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

    Func _HoverLost($ControlID)
    Switch $ControlID
    Case $Minimize
    $int_Minimize=$int_Minimize-1
    Redraw_GUI()
    Case $Maximize
    $int_Maximize=$int_Maximize-1
    Redraw_GUI()
    Case $XClose
    $int_XClose=$int_XClose-1
    Redraw_GUI()
    EndSwitch
    EndFunc

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

    Func _ProcessHover()
    $ControlID = _HoverCheck()
    If IsArray($ControlID) Then
    If $ControlID[0] = "AcquiredHover" Then
    _HoverFound($ControlID[1])
    Else
    _HoverLost($ControlID[1])
    EndIf
    EndIf
    EndFunc

    [/autoit]

    Der Code rund um GDI+ muss noch sauber gemacht werden, ich glaube da sind so einige Handler die nicht befreit werden...


    Ich bedanke mich für eure Hilfe
    JStaxton

    Dateien

    StretchPNGTitle.zip 7,1 kB – 252 Downloads
  • GUI: gestreckte PNG als Buttons (Popup-Style)

    • JStaxton
    • 22. November 2009 um 17:53

    Hallo liebe Community,

    Wie im edit beschrieben scheint es mit dem Move-Befehl jetzt zu klappen!
    Trotzdem frage ich mich ob das eine gute Lösung ist, oder einfach "von-hinten-durch-die-Brust-ins-Auge".


    Danke für euer Interesse! (Man sieht ja, dass Leute das File heruntergeladen haben)
    JStaxton

  • GUI: gestreckte PNG als Buttons (Popup-Style)

    • JStaxton
    • 22. November 2009 um 14:03

    Hallo AutoIt-Community,

    Wieder einmal habe ich eine Frage zum Theme Darstellung von Bildern.
    Ich versuche eine GUI aus PNG-Bildern und Jpg's zusammenzustellen.

    Jetzt das Problem, auf das ich gestoßen bin:
    Wenn ich versuche ein PNG zu laden, einen Teil zu extrahieren, dann zu strecken, um es dann darzustellen, dann scheitere ich jedesmal.

    Um die "geskinnte" GUI umzusetzten stütze ich mich auf das tolle Beispiel von Greenhorn!
    Hier der Quellcode meines Bsp:

    Spoiler anzeigen
    [autoit]

    #include-once
    #include <GuiConstantsEx.au3>
    #include <Array.au3>
    #include <INet.au3>
    #include <Constants.au3>
    #include <WindowsConstants.au3>
    #include <StaticConstants.au3>
    #include <GDIPlus.au3>
    #include <WinAPI.au3>
    #include <Zip.au3>

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

    Opt('MustDeclareVars', 1) ; 1 = Variables must be pre-declared

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

    Global $SC_Width = 800
    Global $SC_Height = 566
    Global $SC_Titlebar_Height =26
    Global $SC_Footer_Height =26
    _GDIPlus_Startup()

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

    Global $h_SC = GUICreate('', $SC_Width, 566, -1, -1, $WS_POPUP)
    Global $Title = GUICtrlCreatePic('', 0, 0, $SC_Width, $SC_Titlebar_Height, BitOR($SS_NOTIFY, $WS_CLIPCHILDREN, $WS_GROUP, $WS_CLIPSIBLINGS), BitOR($WS_EX_LAYERED, $GUI_WS_EX_PARENTDRAG))

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

    ;==================
    ;Hier soll nun das Bild in die Titelzeile hinein
    ;Dabei soll das Bild gestreckt werden auf die Gesamtbreite der GUI.
    ;allerdings soll zur Skalierung nur ein Teil des PNG genommen werden
    _GUICtrlStatic_SetPictureFrame('Title.png', $Title) ;<======= hier habe ich die Probleme

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

    ;Ab hier weiter das Beispiel von Greenhorn
    Global $WndMin = GUICtrlCreatePic('min0.bmp', $SC_Width-26-43, 0, 26, 17, BitOR($SS_NOTIFY, $WS_GROUP, $WS_CLIPSIBLINGS))
    GUICtrlSetState(-1, $GUI_ONTOP)
    GUICtrlSetTip(-1, 'Minimieren')

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

    Global $WndClose = GUICtrlCreatePic('close0.bmp', $SC_Width-43, 0, 43, 17, BitOR($SS_NOTIFY, $WS_GROUP, $WS_CLIPSIBLINGS))
    GUICtrlSetState(-1, $GUI_ONTOP)
    GUICtrlSetTip(-1, 'Schliessen')

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

    Global $btnBeenden = GUICtrlCreatePic('BtnStpD.bmp', $SC_Width-80, $SC_Height-27, 80, 27, BitOR($SS_NOTIFY, $WS_GROUP, $WS_CLIPSIBLINGS))
    GUICtrlSetState(-1, $GUI_ONTOP)
    GUICtrlSetTip(-1, 'Programm beenden')

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

    GUISetState()

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

    While 1

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

    Switch GUIGetMsg()

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

    Case $WndClose
    Exit
    Case $btnBeenden
    Exit
    EndSwitch

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

    _PicButtonFromFile($h_SC, $WndMin, 'min0.bmp', 'min1.bmp', 'min2.bmp', 'Minimize')
    _PicButtonFromFile($h_SC, $WndClose, 'close0.bmp', 'close1.bmp', 'close2.bmp', 'Terminate')
    _PicButtonFromFile($h_SC, $btnBeenden, 'BtnStpD.bmp', 'BtnStpH.bmp', 'BtnStpH.bmp', 'Terminate')

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

    WEnd

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

    Func Minimize()

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

    GUISetState(@SW_MINIMIZE)

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

    EndFunc

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

    Func Terminate()
    _GDIPlus_ShutDown ()
    Exit

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

    EndFunc

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

    Func _PicButtonFromFile($myhWnd, $controlID, $defaultPic, $onHooverPic, $onClickPic, $Function = '', $parameters = '')

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

    Local $resFunc, $cMsg
    If $onClickPic = '' Or $onClickPic = -1 Then $onClickPic = $onHooverPic
    $cMsg = GUIGetCursorInfo($myhWnd)
    If $cMsg[4] = $controlID Then
    GUICtrlSetImage($controlID, $onHooverPic)
    $cMsg = GUIGetCursorInfo($myhWnd)
    While $cMsg[4] = $controlID
    If GUIGetMsg() = $controlID Then
    GUICtrlSetImage($controlID, $onClickPic)
    $resFunc = Execute($Function & '(' & $parameters & ')') ; auf klick Funktion ausführen.
    EndIf
    Sleep(10)
    $cMsg = GUIGetCursorInfo($myhWnd)
    WEnd
    GUICtrlSetImage($controlID, $defaultPic)
    Return $resFunc
    EndIf

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

    EndFunc ;==>_PicButtonFromFile

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

    Func _GUICtrlStatic_SetPictureFrame($File, $CtrlId)
    ;~ msgbox(0,"",$File)
    local $h_Image = _GDIPlus_ImageLoadFromFile($File)
    local $hScrDC = _WinAPI_GetDC(0)
    local $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
    local $iWidth = _GDIPlus_ImageGetWidth ($h_Image)/2
    ;Es soll nur ein Teil des PNG genommen werden zum Strecken/Darstellen; Hier der Einfachheit halber die Hälfte

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

    local $iHeight = _GDIPlus_ImageGetHeight ($h_Image)
    local $h_Bitmap = _GDIPlus_BitmapCloneArea($h_Image, 0, 0, $iWidth, $iHeight)
    $h_Bitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($h_Bitmap)

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

    _GDIPlus_ImageDispose ($h_Image)

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

    GUICtrlSetImage($CtrlId, "")
    _SetBitmapToCtrl($CtrlId, $h_Bitmap)
    _WinAPI_DeleteObject ($h_Bitmap)

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

    ; Das hier scheint nicht zu funktionieren :( das ist mein momentaner Ansatz zum Skalieren des Bildes
    ControlMove (WinGetTitle( $h_SC), "", $CtrlId, Default, Default, $SC_Width, $SC_Height)

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

    EndFunc

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

    Func _SetBitmapToCtrl($CtrlId, $hBitmap) ; <== Diese Funktion habe ich aus einem anderen Bsp. kopiert. Sie hilft beim übertragen des PNG-Images in das Control
    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]

    ; set SS_BITMAP style to control
    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 _WinAPI_DeleteObject($oldBmp[0])
    Return 1
    EndFunc

    [/autoit]

    Kann mir jemand Hilfestellung geben?
    Danke im Voraus sagt

    JStaxton

    Edit1: Hallo, ich habe gerede festgestellt, dass man der GUI einen Namen geben muss! Sonst findet die Funktion WinGetTitle( $h_SC) kein Fenster! So scheint es zu funktionieren.

  • PNG teilweise darstellen - nicht ganze Bilder

    • JStaxton
    • 5. Oktober 2009 um 09:41

    Hallo zusammen!

    Danke für den Hinweis. Wieder einmal hab ich den Wald vor lauter Bäumen nicht gesehen!
    Der Befehl

    [autoit]

    _GDIPlus_BitmapCloneArea($hBmp, $iLeft, $iTop, $iWidth, $iHeight[, $iFormat = 0x00021808])

    [/autoit]

    macht genau das was ich brauche. Diesen habe ich in meine Funtion eingebaut und schon ging es (nach ein wenig Rumprobieren)

    Ich bedanke mich für die schnelle und kompetente Hilfe
    JStaxton

  • PNG teilweise darstellen - nicht ganze Bilder

    • JStaxton
    • 4. Oktober 2009 um 21:33

    Guten Abend allerseits,

    ich bin in einer Sackgasse gelandet. Ich suche einen Ausweg mit dessen Hilfe ich per AutoIt PNG's teilweise darstellen kann.
    Ich habe momentan 2 Bildcontatiner:
    1. Bild: PNG als ganzes Hintergrundbild
    2. Bild: kleines Bild auf dem 1. Bild, dass ein PNG-Bild teilweise darstellt (einen Ausschnitt aus der ganzen Bild-Datei)

    Leider hab ich keine Idee, wie man das angehen könnte.
    Könnt ihr mir weiterhelfen?

    Zur Info:
    Mein derzeitiger Ansatz zum darstellen der ganzen PNG-Bilder ist ein angepasstes Beispiel und sieht ungefähr folgendermaßen aus:

    Spoiler anzeigen
    [autoit]


    ; Dies ist (wahrscheinlich) noch kein lauffähiger Quellcode, er soll nur zur Veranschaulichung dienen
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Constants.au3>
    #include <StaticConstants.au3>
    #include <GDIPlus.au3>
    #include <WinAPI.au3>

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

    $Pfad_Bild1 = "C:\hintergrund.png" ;füllendes Hintergrundbild hier 800x600px
    $Pfad_Bild2 = "C:\ausschnitt.png" ;dieses Bild ist z.B. 100x100pixel groß, dargestellt werden aber immer nur 40x40 pixel

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

    $Handle_Bild1 = GUICtrlCreatePic("", 0, 0,800,600, BitOR($SS_NOTIFY, $WS_CLIPCHILDREN, $WS_CLIPSIBLINGS), $WS_EX_LAYERED)
    $Handle_Bild2 = GUICtrlCreatePic("",20 , 20, 40, 40)

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

    _GUICtrlStatic_SetPicture($Pfad_Bild1, $Handle_Bild1)
    _GUICtrlStatic_SetPicture($Pfad_Bild2, $Handle_Bild2) ; <-- GENAU hier fehlt mir die Inspiration, wie bekomme ich nur einen Ausschnitt dagestellt?

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

    ;diese beiden Funktionen habe ich größtenteils einem Beispiel entnommen, dass ich mal gefunden habe.

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

    FUnc _GUICtrlStatic_SetPicture($File, $CtrlId)
    local $h_Image = _GDIPlus_ImageLoadFromFile($File)
    local $hScrDC = _WinAPI_GetDC(0)
    local $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
    local $h_Bitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($h_Image)
    _GDIPlus_ImageDispose ($h_Image)
    GUICtrlSetImage($CtrlId, "")
    _SetBitmapToCtrl($CtrlId, $h_Bitmap)
    _WinAPI_DeleteObject ($h_Bitmap)
    EndFUnc

    [/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]

    ; set SS_BITMAP style to control
    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 _WinAPI_DeleteObject($oldBmp[0])
    Return 1
    EndFunc

    [/autoit]

    Für Anregungen und Hilfestellungen wäre ich dankbar.
    Es grüßt

    JStaxton

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™