GDI+ Problem

  • Moin :)
    Ich bin kompletter Neuling auf dem Gebiet GDI+. Ich will in meinem GUI ein Bild darstellen, indem nur ein (evtl. auch 2) gefülltes Rechteck ist.

    Dabei sind mir 2 Möglichkeiten in den Sinn gekommen:

    Zitat

    Grafik erstellen mit _GDIPlus_GraphicsCreateFromHWND und dann das Rechteck zeichnen mit _GDIPlus_GraphicsFillRect
    => Nach dem Minimieren und wieder maximieren ist das Rechteck weg

    Zitat

    Eine Bitmapdatei auf meinem Computer laden (bzw. vorher erstellen), dort das Rechteck zeichnen und mit GUICtrlCreatePic ausgeben.
    => Wie mach ich das Rechteck?

    Gibts da noch andere Möglichkeiten?
    Lg
    Carsten

  • Du kannst 2 Wege gehen:
    --Mit GDI(Plus) in ein Bitmap zeichnen und mit _SetBimap aus er Resources.au3 arbeiten
    --oder mit GDI(plus) zeichnen und WM_PAINT nutzen.

  • Zitat

    --Mit GDI(Plus) in ein Bitmap zeichnen und mit _SetBimap aus er Resources.au3 arbeiten


    nur wie? xD

    Zitat

    --oder mit GDI(plus) zeichnen und WM_PAINT nutzen.


    mit zeichnen meinst du so, wie ichs in Möglichkeit 1 gemacht hab? Ok, und was bewirkt WM_PAINT?

  • danke erstmal bis hierher. Mein nächstes Problem ist allerdings, dass ich das Rechteck zufällig erstelle (also größe und position). Das Bild soll sich aber beim minimieren und maximieren nicht verändern. Wie bekomm ich das am besten hin? Des Weiteren werden beim verschieben über den Rand des Desktops hinaus weitere Rechtecke erstellt.

    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    Global $testGraph
    _GDIPlus_Startup()
    test()
    Func test()
    Local $testOK, $testWin
    $testWin = GUICreate("Test", 309, 164, 303, 235)
    GUIRegisterMsg(0xF,"MY_PAINT")
    GUISetState(@SW_SHOW, $testWin)
    $testGraph = _GDIPlus_GraphicsCreateFromHWND($testWin)
    _GDIPlus_GraphicsFillRect($testGraph, Random(0, 100), Random(0, 100), Random(100, 300), Random(100, 230))
    Sleep(10000)
    EndFunc
    Func MY_PAINT($hWnd, $Msg, $wParam, $lParam)
    _GDIPlus_GraphicsFillRect($testGraph, Random(0, 100), Random(0, 100), Random(100, 300), Random(100, 230))
    Return $GUI_RUNDEFMSG
    EndFunc
    _GDIPlus_Shutdown()

    [/autoit]
  • die Größe musst du am Anfang speichern und im WM_PAINT dann die gespeicherte Größe verwenden ...

  • es soll später mal ne captcha funktion werden. Da ich da viele Striche etc. generiere, wird mit dem "an den Anfang schreiben" doch etwas umständlich oder? Wie meintest du das mit dem "--Mit GDI(Plus) in ein Bitmap zeichnen und mit _SetBimap aus er Resources.au3 arbeiten " eig.?

  • so etwa:

    Spoiler anzeigen
    [autoit]

    $Width = 100
    $Height = 100
    $IMAGE = GUICtrlCreatePic("",10,31,$Width, $Height)

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

    ;erstellen
    $hGraph = _GDIPlus_GraphicsCreateFromHWND(GUICtrlGetHandle($IMAGE)
    $hBMP = _GDIPlus_BitmapCreateFromGraphics($Width,$Height,$hGraph)
    _GDIPlus_GraphicsDispose($hGraph)
    $hGraph = _GDIPlus_ImageGetGraphicsContext($hBMP)

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

    ; zeichnen ...

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

    ; setzen
    $hBitmap_GDI = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage) ; nicht löschen, wird im Bild verwendet
    _SetBitmapToCtrl($IMAGE, $hBitmap_GDI)

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

    ; aufräumen
    _GDIPlus_GraphicsDispose($hGraph
    _GDIPlus_BitmapDispose($hBMP)

    [/autoit]


    http://www.autoitscript.com/forum/index.php?s=&showtopic=70664&view=findpost&p=517699