GDIPlus verschwindet

  • Hi,

    ich habe folgendes Problem:

    um es einfach zu sagen ich zeichne auf eine gui eine tabelle (gui ist ohne ramen also $WS_POPUP), wenn ich dieses fenster dann verschiebe (via winmove und der maus position) und es einmal in einen bereich des bildschirms gerät, der leer ist, also zb -100, -100 dann verschwindet das zuvor mit gdiplus gezeichnete an den stellen die außerhalb des bereichs waren.. wie kann ich das verhindern?

    lg Phil-IT

    Einmal editiert, zuletzt von philipp (9. September 2014 um 14:31)

  • Danke UEZ für die antwort, ich habe eine andere, einfachere lösung gefunden, und zwar hab ich den knotenpunkt also weswegen das eigentlich passieren kann behoben: das verschieben! ich habe es mit so vielen bedingungsschleifen ausgestattet, dass es garnicht mehr nach 'außen' kommen kann :D :D

  • Ehrlich gesagt ist das viel zu umständlich. Kannst du uwar so lachen aber halt unnötig ^^

    Verschieb einfach die gdi aufrufe die du da machst in ne funktion und ruf diese in der hauptschleife stãndig auf. Fallst du das nicht mehr ändern möchtest kannst du's so lassen, weißt es aber fûr's nãchste mal :)

  • Mal abgesehen davon dass dieser Effekt auch auftritt wenn ein anderes Fenster deines überdeckt, empfehle ich dir UEZs (der!!!! GDI+ Meister) Tipp zu Herzen zu nehmen und wenn du nicht weißt wie du das machen könntest kannst du ja nachfragen, dafür ist ein Forum ja da.

    • Offizieller Beitrag

    Man benutzt dazu am besten einen BackBuffer. Man zeichnet in diesen Buffer und bei WM_PAINT zeichnet man den Buffer auf die GUI.
    Hier mal ein kleines Beispiel dazu:

    Spoiler anzeigen
    [autoit]


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

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

    _GDIPlus_Startup()
    Global $iSize = 30, $iGuiSize = 600
    $hGUI = GUICreate('GDI+', $iGuiSize, $iGuiSize)
    GUISetState()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iGuiSize, $iGuiSize, $hGraphic)
    $hGraphicBuff = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    For $y = 0 To Int($iGuiSize / $iSize) - 1
    For $x = 0 To Int($iGuiSize / $iSize) - 1
    _GDIPlus_GraphicsDrawRect($hGraphicBuff, $x * $iSize, $y * $iSize, $iSize, $iSize)
    Next
    Next
    _GDIPlus_GraphicsDrawImage($hGraphic, $hBitmap, 0, 0)

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

    GUIRegisterMsg($WM_PAINT, 'WM_PAINT')

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

    Do
    Until GUIGetMsg() = -3

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

    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hGraphicBuff)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()

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

    Func WM_PAINT($hWnd, $Msg, $wParam, $lParam)
    _GDIPlus_GraphicsDrawImage($hGraphic, $hBitmap, 0, 0)
    EndFunc ;==>WM_PAINT

    [/autoit]
  • danke für die coolen antworten!! eigentlich wollte ich es aber wirklich genau so wie ich es jetzt hab!! und das eigentlich erst danach aber das hat jetzt optimal gepasst! aber nochmal mit dem zeichnen:

    @Make-Grafik: würde das nicht extrem viel ram benötigen? ich kenn mich damit nicht wirklich aus aber ich denke mir immer wenn man ewig viel zeichnen lässt dann würde das extrem viel speicher brauchen ?( klärt mich auf wenn ich falsch liege:D

    @CentuCore: nein da tritt der effekt komischer weise nicht bei mir auf :huh:

    Oscar : danke für dein beispiel ich hätte es anders glaube ich nicht verstanden und ich werde es mir morgen gleich einmal zu herzen nehmen :thumbup: