Darstellungsprobleme mit GDI+ und skalierbarer GUI

  • Hi Leute.

    habe da ein kleines Problem....

    Wenn ich bei einer skalierbaren GUI die Größe ändere, dann verschwindet das von GDI+ gezeichnete Bild.
    Habe mal ein quick and dirty Beispiel eingefügt. Kann man das irgendwie korrigieren?


    [autoit]


    #include <GDIPlus.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <ScreenCapture.au3>

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

    Opt("GUIOnEventMode", 1)
    $hGUI = GUICreate("test", 500, 500,-1,-1, $WS_SIZEBOX)
    GUISetState()

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

    GUISetOnEvent ($GUI_EVENT_CLOSE, "_Exit", $hGUI)
    GUIRegisterMsg ($WM_SIZE, "WM_SIZE")

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

    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND ($hGUI)
    $hBitmap = _ScreenCapture_Capture("", 0, 0, 500, 500)
    $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
    _GDIPlus_GraphicsDrawImageRect ($hGraphic, $hImage, 0, 0, 500, 500)

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

    While (1)
    Sleep (1000)
    WEnd

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

    Func WM_SIZE()
    _GDIPlus_GraphicsDrawImageRect ($hGraphic, $hImage, 0, 0, 500, 500)
    EndFunc

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

    Func _Exit()
    _GDIPlus_Shutdown ()
    Exit
    EndFunc

    [/autoit]


    ...achja... ich sollte noch erwähnen, dass das Bild während der Skalierung den Inhalt ändert, daher habe ich WM_SIZE() mit eingebaut. Hier im Beispiel ändert sich das Bild inhaltlich nicht weiter. ...da es ja nur ein Beispiel ist...

    ich bin ein Raspberry Pi, Arduino und ATMega-Fan :D

    Nicht vergessen:
    41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

    :thumbup:


    lg
    SBond

    2 Mal editiert, zuletzt von SBond (8. März 2013 um 00:04)

  • Teste mal dies:

    Spoiler anzeigen
    [autoit]


    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ScreenCapture.au3>

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

    Opt("GUIOnEventMode", 1)
    Global $iW = 500, $iH = 500
    $hGUI = GUICreate("test", $iW, $iH,-1,-1, $WS_SIZEBOX)
    GUISetState()

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

    GUISetOnEvent ($GUI_EVENT_CLOSE, "_Exit", $hGUI)
    GUIRegisterMsg ($WM_SIZE, "WM_SIZE")

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

    _GDIPlus_Startup()
    $hHBitmap = _ScreenCapture_Capture("", 0, 0, $iW, $iH)
    $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hHBitmap)

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

    Global Const $iYCaption = _WinAPI_GetSystemMetrics($SM_CYSIZE), $iYFixedFrame = _WinAPI_GetSystemMetrics(8) ;8 = $SM_CYFIXEDFRAME
    $iDHeight = $iYCaption + $iYFixedFrame

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

    GUIRegisterMsg($WM_ERASEBKGND, "WM_ERASEBKGND")
    _WinAPI_RedrawWindow($hGUI)

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

    While (1)
    Sleep (1000)
    WEnd

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

    Func WM_SIZE()
    Local $aWidth = WinGetClientSize($hGUI)
    $iW = $aWidth[0]
    $iH = $aWidth[1] + $iDHeight
    Return "GUI_RUNDEFMSG"
    EndFunc

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

    Func WM_ERASEBKGND($hWnd, $Msg, $wParam, $lParam)
    #forceref $hWnd, $Msg, $lParam
    Local $hGraphicsTemp = _GDIPlus_GraphicsCreateFromHDC($wParam)
    DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "handle", $hGraphicsTemp, "int", 1)
    _GDIPlus_GraphicsDrawImageRect($hGraphicsTemp, $hBitmap, 0, 0, $iW, $iH)
    _GDIPlus_GraphicsDispose($hGraphicsTemp)
    Return True
    EndFunc ;==>_WM_ERASEBKGND

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

    Func _Exit()
    GUIRegisterMsg($WM_ERASEBKGND, "")
    _GDIPlus_GraphicsDispose($hBitmap)
    _WinAPI_DeleteObject($hHBitmap)
    _GDIPlus_Shutdown ()
    GUIDelete()
    Exit
    EndFunc

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • super, das ist perfekt


    ...vielen Dank :D

    ich bin ein Raspberry Pi, Arduino und ATMega-Fan :D

    Nicht vergessen:
    41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

    :thumbup:


    lg
    SBond

  • jap, habe es vergessen :D

    ich bin ein Raspberry Pi, Arduino und ATMega-Fan :D

    Nicht vergessen:
    41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

    :thumbup:


    lg
    SBond