GUICtrlCreatePic erstellt seltsame Artefakte/Bildfehler

  • Hallo.
    Wie auf dem Bild unten zu sehen ist, erzeugt GUICtrlCreatePic() einige unschöne "Artefakte" auf den Pics. Ich habe es bisher nicht geschafft den Ursprung dieser Bildfehler auszumachen. Der Code ist soweit ich das sagen kann korrekt. Die Bilder auf meiner Festplatte weisen keinerlei Fehler auf.

    Um dieses Problem zu beheben, habe ich bereits versucht, das Bild per GDI+ einzulesen, resizen und neu abzuspeichern. Hat auch wunderbar geklappt - Das Bild wird in der richtigen Größe erstellt. Ohne Bildfehler! (siehe Bild nr 2)

    Komisch ist auch, dass die Bildfehler nur in den, mit einer For-Next-Schleife, erstellten Bildern auftreten. Ich benutze das gleiche Bild für einen Hover effekt ( siehe Bild, aufgehellte Fläche ) und in diesem treten keine Fehler auf.

    Die Artefakte sind für jede Auflösung anders. manchmal ist es nur ein winziger punkt und manchmal zieht sich ein Strich durch das komplette Pic. (Im bild unten ist der Fehler immer ein Strich am rechten Rand des pics.)
    Das ist zum Mäusemelken

    Hier mal ein Ausschnitt aus dem Code:

    Spoiler anzeigen
    [autoit]


    Dim $hGrid[6][7]
    Local $aPos = WinGetPos($hGUI), $sx, $sy, $ix = 0, $iy = 0, $x, $y, $w = ($aPos[2] / 7), $h = ($aPos[3] / 6)
    _ImageResize(@ScriptDir & "\IMG\day.jpg", @ScriptDir & "\IMG\Res\day.jpg", $w, $h)
    $start = _MonthsFirst2Weekday($sDate, $date, 1)
    For $i = 0 To 41
    GUICtrlCreatePic(@ScriptDir & "\IMG\Res\day.jpg", $x, $y, 0, 0)
    GUICtrlSetState(-1,$GUI_DISABLE)
    $hGrid[$iy][$ix] = _DrawStringLable($hGUI,"",22,$x,$y,$w,$h,0x000000,"Arial",Bitor(0x01,0x0200))
    ;Func _DrawStringLable($hWnd, $sText, $iSize = 16, $x = 20, $y = 20, $w = -1, $h = -1, $iColor = 0x000000, $sFont = "Arial", $sStyle=Default, $sSyleEx=Default$iDbg = 0)
    GUICtrlSetOnEvent($hGrid[$iy][$ix], "_Switch2DayView")

    [/autoit]

    Woran kann das liegen?

    Gruß, SEuBo


    Edit: Für nuts hier noch mal extra die komplette Funktion

    Spoiler anzeigen
    [autoit]

    Func _CreateGrid($hGUI, $sDate)
    $hLast = GUISwitch($hGUI)
    Dim $hGrid[6][7]
    Local $aPos = WinGetPos($hGUI), $sx, $sy, $ix = 0, $iy = 0, $x, $y, $w = ($aPos[2] / 7), $h = ($aPos[3] / 6)
    _ImageResize(@ScriptDir & "\IMG\day.jpg", @ScriptDir & "\IMG\Res\day.jpg", $w, $h)
    $start = _MonthsFirst2Weekday($sDate, $date, 1)
    For $i = 0 To 41
    GUICtrlCreatePic(@ScriptDir & "\IMG\Res\day.jpg", $x, $y, 0, 0)
    GUICtrlSetState(-1,$GUI_DISABLE)
    $hGrid[$iy][$ix] = _DrawStringLable($hGUI,"",22,$x,$y,$w,$h,0x000000,"Arial",Bitor(0x01,0x0200))
    ;Func _DrawStringLable($hWnd, $sText, $iSize = 16, $x = 20, $y = 20, $w = -1, $h = -1, $iColor = 0x000000, $sFont = "Arial", $iDbg = 0)
    GUICtrlSetOnEvent($hGrid[$iy][$ix], "_Switch2DayView")
    If $i <= 8 And $ix = $start - 1 Then
    $hGridDate[$iy][$ix] = StringFormat("%02i", 01)
    Local $sx = $ix
    EndIf
    $x += $w
    $ix += 1
    If $x + $w > $aPos[2] Then
    $x = 0
    $y += $h
    $ix = 0
    $iy += 1
    EndIf
    Next
    Local $ix = $sx + 1, $iy = 0, $day = 1

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

    $aSplit = StringSplit($sDate, ".")
    For $i = $ix To _DateDaysInMonth($aSplit[3], $aSplit[2]) + $ix - 2
    If $ix + 1 > UBound($hGridDate, 2) Then
    $ix = 0
    $iy += 1
    EndIf
    $day += 1
    $hGridDate[$iy][$ix] = StringFormat("%02i", $day)
    $ix += 1

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

    Next
    GUICtrlSetData($date, _NowCalcDate())
    GUISwitch($hLast)
    Return $hGrid
    EndFunc ;==>_CreateGrid

    [/autoit]

    EDIT2: Script angehängt. Wenn auch ungern :(

  • Hi, wieso gibst du den Pics als Größenparameter für Höhe und Breite jeweils 0 an?
    Sollten da nicht die richtigen Werte rein? Resize ist auch unnötig, das macht doch guictrlcreatepic automatisch?!

  • 0 gebe ich an, weil dann die Größenwerte der ursprünglichen Datei übernommen werden.
    Zitat aus der Hilfe: "Soll das Bild die Größe der Originaldatei haben, setzt man width=height=0."

    Default ist, so wie das nach einigen versuchen festgestellt habe 150x150.
    Das Resizen über GDI+ war wie gesagt nur ein Versuch, die Bildfehler loszuwerden. Natürlich geht es auch wenn ich die Größe direkt in GUICtrlCreatePic angebe. Das Resultat bleibt allerdings das selbe.

  • Und wieso muss GUICtrlCreatePic() mit scheinbar konstanten Werten in die For ... Next Schleife?

    Sind sie nicht, hielt es allderdings für irrelevant die ganze Schleife zu posten, da der Code korrekt ist. Die Positionen stimmen und die größen stimmen. nur die Bildfehler machen mir zu schaffen. Ich hab mal im ersten Post die komplette For-Next Schleife gepostet.

  • hast du die Größenparameter mal angepasst?

  • Zitat

    Besser wäre was lauffähiges mit den entsprechenden Bildern.


    Ich brauche leider die einzelnen Bilder. Siehe Bild unten. Tage die im aktuellen Monat nicht vorkommen sollen ausgegraut werden. Wenn ich ein Bild für das komplette Grid erstelle, müsste ich ja zig varianten erstellen. Außerdem würde ich das gerne dynamisch auf 5 oder 6 Zeilen ändern können. Im Beispiel unten wäre dann ja eine Zeile frei, die ich , wenn der Code weiterentwickelt ist, gerne rauscshneiden möchte, um eine schönere Optik zu bekommen.

    hast du die Größenparameter mal angepasst?

    Hier der angepasste Code:

    Spoiler anzeigen
    [autoit]

    Dim $hGrid[6][7]
    Local $aPos = WinGetPos($hGUI), $sx, $sy, $ix = 0, $iy = 0, $x, $y, $w = ($aPos[2] / 7), $h = ($aPos[3] / 6)
    ;~ _ImageResize(@ScriptDir & "\IMG\day.jpg", @ScriptDir & "\IMG\Res\day.jpg", $w, $h)
    $start = _MonthsFirst2Weekday($sDate, $date, 1)
    For $i = 0 To 41
    GUICtrlCreatePic(@ScriptDir & "\IMG\day.jpg", $x, $y, $w, $h)
    GUICtrlSetState(-1,$GUI_DISABLE)
    $hGrid[$iy][$ix] = _DrawStringLable($hGUI,"",22,$x,$y,$w,$h,0x000000,"Arial",Bitor(0x01,0x0200))
    ;Func _DrawStringLable($hWnd, $sText, $iSize = 16, $x = 20, $y = 20, $w = -1, $h = -1, $iColor = 0x000000, $sFont = "Arial", $iDbg = 0)
    GUICtrlSetOnEvent($hGrid[$iy][$ix], "_Switch2DayView")

    [/autoit]

    Und hier das was dabei rauskommt: (siehe Bild unten)


    Edit: ich glaube ich hab grade eine Idee wie ich das lösen kann
    Nope, das war nix...

  • Bist du dir überhaupt sicher, daß das Problem von guictrlcreatepic kommt und nicht von _DrawStringLabel()?
    Setz mal testweise zwischen die einzelnen Zeilen Debugmessageboxen....


  • Ich brauche leider die einzelnen Bilder. Siehe Bild unten. Tage die im aktuellen Monat nicht vorkommen sollen ausgegraut werden. Wenn ich ein Bild für das komplette Grid erstelle, müsste ich ja zig varianten erstellen. Außerdem würde ich das gerne dynamisch auf 5 oder 6 Zeilen ändern können. Im Beispiel unten wäre dann ja eine Zeile frei, die ich , wenn der Code weiterentwickelt ist, gerne rauscshneiden möchte, um eine schönere Optik zu bekommen.


    Das Konzept ist schon klar, nur ein lauffähiges Skript und die benötigten Bilder im Anhang wäre für Tester, die sich gerade keinen Reim auf das Problem machen können (so wie ich), vorteilhaft.

  • Bist du dir überhaupt sicher, daß das Problem von guictrlcreatepic kommt und nicht von _DrawStringLabel()?

    Jap, 2000% ig!
    Denn die Fehler treten auch auf wenn,
    - ich die Texte nicht per Lable sondern per GDI+ auf die Bilder zeichne
    - ich garkeine Texte auf die Bilder mache (siehe screenshot)

    Zitat

    Das Konzept ist schon klar, nur ein lauffähiges Skript und die benötigten Bilder im Anhang wäre für Tester, die sich gerade keinen Reim auf das Problem machen können (so wie ich), vorteilhaft.


    Würde ich leider ungern, da das ganze ja für den uIT gedacht ist :S
    Wenns nicht anders geht lad ichs aber gleich mal hoch...

  • Wollt halt mal sehen wie weit ich gehen kann. Das Script ist jetzt im ersten Post. Noch ist es ja nur GUI, da denk ich mal dass es noch legitim sein dürfte.

    PS: Ich weiß dass ihr Probleme haben werdet da durchzublicken - dabei versuch ich ja schon das ganze so übersichtlich wie möglich zu halten

  • Zitat

    ich garkeine Texte auf die Bilder mache (siehe screenshot)


    Hmmm, ich habe deine "day.jpg" mehrfach in eine Gui eingesetzt, jedesmal ohne diese Artefakte. WIN XP.
    Aber ehrlich gesagt verstehe ich das Scriptstück sowieso nicht richtig, da wie schon angesprochen das Pic ja 41x auf dieselbe Stelle gezeichnet wird.
    Was mir auch aufgefallen ist, mach mal Sicherheitshalber Integer aus $w und $h in der LOCAL-Zeile, kann sein daß bei der Berechnung (Rundung) Fehler auftreten


  • Aber ehrlich gesagt verstehe ich das Scriptstück sowieso nicht richtig, da wie schon angesprochen das Pic ja 41x auf dieselbe Stelle gezeichnet wird.


    Ich poste nicht jedesmal die komplette For-Next-Schleife wenn ich nur 2 Zeilen ändern muss. Aber ich erkläre mal die vorgehensweise:
    BSP: GUI ist 700 pixel breit, 300 pixel hoch. -> $w = 100 , $h = 50
    Es wird nun das erste Bild bei x: 0, y:0 erstellt. Danach gibts ein $x += $w. Das zweite pic wird dann bei x: 100 , y: 0 erstellt. Solange bis das 7te Bild gezeichnet wurde. Dann wird x wieder auf 0 gesetzt, und $y += $h. Sprich, es zeichnet wieder 7 Bilder in der nächsten Zeile. Habe ja jetzt das komplette Script angehangen (erster Post).


    Was mir auch aufgefallen ist, mach mal Sicherheitshalber Integer aus $w und $h in der LOCAL-Zeile, kann sein daß bei der Berechnung (Rundung) Fehler auftreten


    Habe es jetzt als Int() sowie als Floor() und als Round() probiert. Jeweils für die Version mit Größenangaben in GUICtrlCreatePic und für die Version mit vorherigem resize via GDI+.

    Ich habe übrigens Vista (32 Bit). Und es liegt definitiv nicht an meinem Rechner, da bei meiner Freundin (auch Vista, aber 64Bit) das selbe Problem auftritt. Zur Not müsste ich mal an einen XP rechner. Nur davon haben wir keinen *g*


  • P.S. Das ganze Skript wollte ich doch gar nicht, nur ein lauffähiges Beispiel mit dem Problem zum Spielen.

    Hehe, ich wollte das grade mal erstellen - aber ich schaff es nicht den Fehler zu rekonstruieren. Wenn ich daraus ein neues Skript mache, gibts keinerlei Bildfehler. Langsam weiß ich echt nicht mehr wo der Fehler liegt .... -.-

  • ahhh, mit der "vollständigen" Funktion sind nun alle Klarheiten entgültig beseitigt :thumbup:
    Wie gesagt, läuft bei mir einwandfrei...

    Zitat

    aber ich schaff es nicht den Fehler zu rekonstruieren. Wenn ich daraus ein neues Skript mache, gibts keinerlei Bildfehler

    Was lernen wir daraus...mach ein neues script und der Fehler verschwindet :rofl:

  • :thumbup:

    Ich werd mich jetzt mal zu nem kollegen begeben, und schauen was bei ihm aufm XP rechner passiert..

    Update:

    Habe es jetzt auf 2 XP-Rechnern getestet. Läuft Fehlerfrei. Der Fehler muss also bei Vista liegen, heißt ich kann wahrscheinlich nichts gegen machen.
    Ich stell den Thread mal auf gelöst, auch wenn mein Problem weiterhin besteht.