Gdiplus und string

  • Hi,

    Wie kann man die GDIPplusObjecte neu zeichnen lassen,
    da immer wen man das fenster teilweise auserhalb des desktop schiebt,
    die gdi sachen verschwinden.
    Auserdem würd ich noch gern wissen wie man mehrere bilder zu einem
    object zusammen fasst, das diese auch gleichzeitig gezeichnet werden und nicht
    nacheinander.

    Zu String. ich hab das Problem ich habe den String "100 - 30" und von diesem
    String will ich das Ergebnis (also 70). Habs scho mit int probiert, jedoch erfolg los.

    Wenn jemand weis wies geht wäre ich sehr dankbar darüber.


  • Zu String. ich hab das Problem ich habe den String "100 - 30" und von diesem
    String will ich das Ergebnis (also 70). Habs scho mit int probiert, jedoch erfolg los.


    Kannst so machen:

    [autoit]

    $i = "100 - 30"
    $ergebnis = Execute($i)
    MsgBox(0,"",$ergebnis)

    [/autoit]

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Zitat

    Zu String. ich hab das Problem ich habe den String "100 - 30" und von diesem
    String will ich das Ergebnis (also 70). Habs scho mit int probiert, jedoch erfolg los.


    Es gibt die Funktion Execute() die das für dich erledigen könnte, allerdings sollte man immer beachten, dass es so sehr einfach für den Benutzer ist Code in das Programm einzuschleusen.

    Zitat

    Wie kann man die GDIPplusObjecte neu zeichnen lassen,


    _GDIPlus_GraphicsClear() und dann alles neu zeichnen ;).

    Zitat

    da immer wen man das fenster teilweise auserhalb des desktop schiebt,
    die gdi sachen verschwinden.


    In diesem Fall empfehle ich dir die WM_PAINT Nachricht des Fensters zu registrieren.

    [autoit]

    GUIRegisterMsg($WM_PAINT, "_ReDraw")

    [/autoit]


    In der Funktion _ReDraw (oder wie auch immer du diese Funktion nennen willst) musst du nun den Code platzieren der den gesamten Inhalt der Grafik neu zeichnet.

    Zitat

    Auserdem würd ich noch gern wissen wie man mehrere bilder zu einem
    object zusammen fasst, das diese auch gleichzeitig gezeichnet werden und nicht
    nacheinander.


    Ich verstehe nicht ganz was du willst... Hast du vor so etwas wie einen Backbuffer zu benutzen? Also eine Bitmap die mit dem ganzen visuellen Zeugs vollgezeichnet wird, das du nachher auf der GUI haben willst, die du nach Abschluss der Zeichenoperationen auf die GUI zeichnest? Selbst falls du etwas anderes meinst, würde ich dir empfehlen einen Backbuffer zu benutzen. Erstens weil dadurch ein "flackern" während des Zeichnens verhindert wird, zweitens weil du dann in der Funktion _ReDraw nur die alte Bitmap auf die Grapfik der GUI zeichnen musst ohne alles andere neu zu malen.

  • Das ist eigentlich relativ simpel. Als erstes brauchst du einen Ort wo die Zeichnungen gespeichert werden, ohne dass der Benutzer etwas davon sieht. Also eine Bitmap im Arbeitsspeicher.
    Die erstellst du so:

    [autoit]

    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphics) ;$iWidth=Breite der GUI, $iHeight=Höhe der GUI, $hGraphics=Handle zumGraphics-Object

    [/autoit]


    Damit du auch in diese Bitmap zeichnen kannst, benötigst du ein Graphics-Object, dass mit der Bitmap verbunden ist. Das bekommst du so:

    [autoit]

    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

    [/autoit]

    Sobald du diese beiden Objekte erzeugt hast, zeichnest du alles was nachher in die GUI kommen soll in die Bitmap hinein (einfach $hBuffer anstatt $hGraphics bei allen Zeichenoperationen verwenden). Nachdem du alles dort hinein gezeichnet hast, muss das ganze ja auf die GUI, da kommt die Funktion _GDIPlus_GraphicsDrawImageRect ins Spiel:

    [autoit]

    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $iWidht, $iHeight)

    [/autoit]

    Diese Funktion zeichnet einfach die Bitmap auf die GUI. Diese Funktion musst du jedesmal aufrufen, wenn du etwas am Inhalt der Bitmap geändert hast, und das auf der GUI sehen möchtest. Außerdem kommt die Funktion in der selben Form auch in die _ReDraw Funktion die ich in meinem letzten Post angesprochen hatte. Dadurch wird die Bitmap immer dann neu auf die GUI gemalt wenn das Fenster eine WM_PAINT Nachricht erhält (also wenn das Fenster verdeckt wurde).

    Du kannst dir zusätzlich noch das GDI+ Tutorial von Ubuntu anschauen. Einfach mal die Suchfunktion benutzen.