Jump to content

GDIPlus graphic arrows disappears after minimize-maximize...


Recommended Posts

I'ld like to easily add some arrows with different angles, sizes and colors, to a GUI.

In order to do this, AutoIT comes with a beautiful fuction called _GDIPlus_ArrowCapCreate: http://www.autoitscript.com/autoit3/docs/libfunctions/_GDIPlus_ArrowCapCreate.htm

Unfortunately, even the official example attached to this function has a problem: the arrows disappear if you minimize-maximize the window or anyhow cover-discover that arrows.

The problem is known and someone already provided some solutions in AutoIT for drawings different than arrows:

-

-

The problem (and solution) is also technically deeper described in this GDIPlus faq: http://www.bobpowell.net/picturebox.htm

I tried to understand something to implement the solution to the example of the _GDIPlus_ArrowCapCreate documentation (see link above) but failed, I always obtain graphic corruptions after I minimize-maximize the window or anyhow cover-discover that arrows...

Did anyone already succeded with arrows? is there an efficient solution? (without ending to the simple inefficient solution of cyclically/infinitely redrawing the arrows in the main loop)

Link to comment
Share on other sites

Register the GUI with $WM_PAINT notification and this is the respective Func

Func WM_PAINT($hWnd,$iMsg,$wParam,$lParam)
_WinAPI_RedrawWindow($hGui, 0, 0, $RDW_UPDATENOW)
;Your Code must lie in it
_WinAPI_RedrawWindow($hGui, 0, 0, $RDW_VALIDATE)
Return 'GUI_RUNDEFMSG'
EndFunc

My code:

PredictText: Predict Text of an Edit Control Like Scite. Remote Gmail: Execute your Scripts through Gmail. StringRegExp:Share and learn RegExp.

Run As System: A command line wrapper around PSEXEC.exe to execute your apps scripts as System (LSA). Database: An easier approach for _SQ_LITE beginners.

MathsEx: A UDF for Fractions and LCM, GCF/HCF. FloatingText: An UDF for make your text floating. Clipboard Extendor: A clipboard monitoring tool. 

Custom ScrollBar: Scroll Bar made with GDI+, user can use bitmaps instead. RestrictEdit_SRE: Restrict text in an Edit Control through a Regular Expression.

Link to comment
Share on other sites

PhoenixXL, I tried but nothing changed, the arrows still disappear. Here is my code:

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

_Main()

Func _Main()
    Local $hGUI, $hGraphic, $hPen, $hEndCap

    ; Create GUI
    $hGUI = GUICreate("GDI+", 400, 300)
    GUISetState()

  ; Create resources
    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hPen = _GDIPlus_PenCreate(0xFF000000, 2)
    $hEndCap = _GDIPlus_ArrowCapCreate(3, 6)
    _GDIPlus_PenSetCustomEndCap($hPen, $hEndCap)

 GUIRegisterMsg(0x000F, "WM_PAINT") ;$WM_PAINT

 ; Draw arrows
    _GDIPlus_GraphicsDrawLine($hGraphic, 10, 120, 390, 120, $hPen)
    _GDIPlus_PenSetWidth($hPen, 4)
    _GDIPlus_GraphicsDrawLine($hGraphic, 10, 150, 390, 150, $hPen)
    _GDIPlus_PenSetWidth($hPen, 6)
    _GDIPlus_GraphicsDrawLine($hGraphic, 10, 180, 390, 180, $hPen)

    ; Loop until user exits
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    ; Clean up resources
    _GDIPlus_ArrowCapDispose($hEndCap)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
EndFunc   ;==>_Main

Func WM_PAINT($hGui,$iMsg,$wParam,$lParam)
 _WinAPI_RedrawWindow($hGui, 0, 0, $RDW_UPDATENOW)
 ;Your Code must lie in it
 _WinAPI_RedrawWindow($hGui, 0, 0, $RDW_VALIDATE)
 Return 'GUI_RUNDEFMSG'
EndFunc
Edited by Imbuter2000
Link to comment
Share on other sites

Try this:

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

Global $hGUI, $hGraphic, $hPen, $hEndCap

_Main()

Func _Main()
    ; Create GUI
    $hGUI = GUICreate("GDI+", 400, 300)
    GUISetState()

  ; Create resources
    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hPen = _GDIPlus_PenCreate(0xFF000000, 2)
    $hEndCap = _GDIPlus_ArrowCapCreate(3, 6)
    _GDIPlus_PenSetCustomEndCap($hPen, $hEndCap)

    PAINT()
    GUIRegisterMsg(0x000F, "Paint") ;$WM_PAINT


    ; Loop until user exits
    Do
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
            Case $GUI_EVENT_RESTORE
                PAINT()
        EndSwitch
    Until False

    ; Clean up resources
    _GDIPlus_ArrowCapDispose($hEndCap)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
EndFunc   ;==>_Main

Func  PAINT()
    _GDIPlus_GraphicsClear($hGraphic, 0xFFF0F0F0)
    _GDIPlus_GraphicsDrawLine($hGraphic, 10, 120, 390, 120, $hPen)
    _GDIPlus_PenSetWidth($hPen, 4)
    _GDIPlus_GraphicsDrawLine($hGraphic, 10, 150, 390, 150, $hPen)
    _GDIPlus_PenSetWidth($hPen, 6)
    _GDIPlus_GraphicsDrawLine($hGraphic, 10, 180, 390, 180, $hPen)
    Return 'GUI_RUNDEFMSG'
EndFunc

Br,

UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
Share on other sites

This should be the Func you missed out to place your code there

Func WM_PAINT($hGui,$iMsg,$wParam,$lParam)
_WinAPI_RedrawWindow($hGui, 0, 0, $RDW_UPDATENOW)
;Your Code must lie in it

_GDIPlus_GraphicsDrawLine($hGraphic, 10, 120, 390, 120, $hPen)
_GDIPlus_PenSetWidth($hPen, 4)
_GDIPlus_GraphicsDrawLine($hGraphic, 10, 150, 390, 150, $hPen)
_GDIPlus_PenSetWidth($hPen, 6)
_GDIPlus_GraphicsDrawLine($hGraphic, 10, 180, 390, 180, $hPen)

;End of your code
_WinAPI_RedrawWindow($hGui, 0, 0, $RDW_VALIDATE)
Return 'GUI_RUNDEFMSG'

EDIT: Make your vars $hGraphic, $hPen Global then it would work

Regards

Phoenix XL :)

Edited by PhoenixXL

My code:

PredictText: Predict Text of an Edit Control Like Scite. Remote Gmail: Execute your Scripts through Gmail. StringRegExp:Share and learn RegExp.

Run As System: A command line wrapper around PSEXEC.exe to execute your apps scripts as System (LSA). Database: An easier approach for _SQ_LITE beginners.

MathsEx: A UDF for Fractions and LCM, GCF/HCF. FloatingText: An UDF for make your text floating. Clipboard Extendor: A clipboard monitoring tool. 

Custom ScrollBar: Scroll Bar made with GDI+, user can use bitmaps instead. RestrictEdit_SRE: Restrict text in an Edit Control through a Regular Expression.

Link to comment
Share on other sites

This should be the code

#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <GDIPlus.au3>
Global $hGraphic, $hPen
_Main()

Func _Main()
Local $hGUI, $hEndCap

; Create GUI
$hGUI = GUICreate("GDI+", 400, 300)
GUISetState()

; Create resources
_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
$hPen = _GDIPlus_PenCreate(0xFF000000, 2)
$hEndCap = _GDIPlus_ArrowCapCreate(3, 6)
_GDIPlus_PenSetCustomEndCap($hPen, $hEndCap)

GUIRegisterMsg(0x000F, "WM_PAINT") ;$WM_PAINT

; Draw arrows
_GDIPlus_GraphicsDrawLine($hGraphic, 10, 120, 390, 120, $hPen)
_GDIPlus_PenSetWidth($hPen, 4)
_GDIPlus_GraphicsDrawLine($hGraphic, 10, 150, 390, 150, $hPen)
_GDIPlus_PenSetWidth($hPen, 6)
_GDIPlus_GraphicsDrawLine($hGraphic, 10, 180, 390, 180, $hPen)

; Loop until user exits
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

; Clean up resources
_GDIPlus_ArrowCapDispose($hEndCap)
_GDIPlus_PenDispose($hPen)
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_Shutdown()
EndFunc ;==>_Main

Func WM_PAINT($hGui,$iMsg,$wParam,$lParam)
_WinAPI_RedrawWindow($hGui, 0, 0, $RDW_UPDATENOW)
;Your Code must lie in it

_GDIPlus_GraphicsDrawLine($hGraphic, 10, 120, 390, 120, $hPen)
_GDIPlus_PenSetWidth($hPen, 4)
_GDIPlus_GraphicsDrawLine($hGraphic, 10, 150, 390, 150, $hPen)
_GDIPlus_PenSetWidth($hPen, 6)
_GDIPlus_GraphicsDrawLine($hGraphic, 10, 180, 390, 180, $hPen)

;End of your code
_WinAPI_RedrawWindow($hGui, 0, 0, $RDW_VALIDATE)
Return 'GUI_RUNDEFMSG'
EndFunc

Edited by PhoenixXL

My code:

PredictText: Predict Text of an Edit Control Like Scite. Remote Gmail: Execute your Scripts through Gmail. StringRegExp:Share and learn RegExp.

Run As System: A command line wrapper around PSEXEC.exe to execute your apps scripts as System (LSA). Database: An easier approach for _SQ_LITE beginners.

MathsEx: A UDF for Fractions and LCM, GCF/HCF. FloatingText: An UDF for make your text floating. Clipboard Extendor: A clipboard monitoring tool. 

Custom ScrollBar: Scroll Bar made with GDI+, user can use bitmaps instead. RestrictEdit_SRE: Restrict text in an Edit Control through a Regular Expression.

Link to comment
Share on other sites

This method works on my xp.

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

Global $hBMPBuff, $hGraphicGUI

_Main()


Func _Main()
    Local $hGUI, $hEndCap, $hGraphic
    $hGUI = GUICreate("GDI+", 400, 300, -1, -1, BitOR($WS_MAXIMIZEBOX, $WS_MINIMIZEBOX))
    GUISetState()

    _GDIPlus_Startup()

    $hGraphicGUI = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBMPBuff = _GDIPlus_BitmapCreateFromGraphics(400, 300, $hGraphicGUI) ; Create bitmap the same size as the graphics of the GUI.
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hBMPBuff) ; Create graphics for bitmap, $hBMPBuff. (where the graphics is like the canvas of the bitmap)

    $hPen = _GDIPlus_PenCreate(0xFFFF0000, 2) ; Hex colour format 0xAARRGGBB - Alpha (transparency), Red, Green, Blue.
    $hEndCap = _GDIPlus_ArrowCapCreate(3, 6)
    _GDIPlus_PenSetCustomEndCap($hPen, $hEndCap)

    ; Draw arrows to bitmap
    _GDIPlus_GraphicsDrawLine($hGraphic, 10, 120, 390, 120, $hPen)
    _GDIPlus_PenSetWidth($hPen, 4)
    _GDIPlus_GraphicsDrawLine($hGraphic, 10, 150, 390, 150, $hPen)
    _GDIPlus_PenSetWidth($hPen, 6)
    _GDIPlus_GraphicsDrawLine($hGraphic, 10, 180, 390, 180, $hPen)

    _GDIPlus_GraphicsDrawImage($hGraphicGUI, $hBMPBuff, 0, 0) ; Draw bitmap to GUI (graphics).
    ; Loop until user exits

    GUIRegisterMsg(0x000F, "WM_PAINT") ;$WM_PAINT

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    ; Clean up resources
    _GDIPlus_ArrowCapDispose($hEndCap)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_GraphicsDispose($hGraphicGUI)
    _WinAPI_DeleteObject($hBMPBuff)

    _GDIPlus_Shutdown()
EndFunc   ;==>_Main

Func WM_PAINT($hGUI, $iMsg, $wParam, $lParam)
    _GDIPlus_GraphicsDrawImage($hGraphicGUI, $hBMPBuff, 0, 0)
    _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_VALIDATE)
    Return 'GUI_RUNDEFMSG'
EndFunc   ;==>WM_PAINT
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...