ghetek Posted June 5, 2010 Share Posted June 5, 2010 (edited) Hey guys, I am trying to create a resizeable graph on a GUI. This works but there must be a better way, right? Any help would be greatly appreciated. expandcollapse popup#include <GuiConstantsEx.au3> #include <WindowsConstants.au3> #include <GDIPlus.au3> #include <WinAPI.au3> Opt('MustDeclareVars', 1) Global $hGUI, $sGUI_Title = 'Test Resizer', $hGraphic, $hPen, _ $sGUI_Width = 600, $sGUI_Height = 600, _ $hGUI = GUICreate($sGUI_Title, $sGUI_Width, $sGUI_Height, -1, -1, $WS_SIZEBOX + $WS_SYSMENU) _GDIPlus_Startup() GUISetState() _DrawGraph() While 1 Switch GUIGetMsg() Case $GUI_EVENT_RESIZED $sGUI_Width = _WinAPI_GetWindowWidth($hGUI) $sGUI_Height = _WinAPI_GetWindowHeight($hGUI) ConsoleWrite('RESIZE Width:' & $sGUI_Width & ' Height:' & $sGUI_Height & @CRLF) _DrawGraph($sGUI_Width, $sGUI_Height) Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd _GDIPlus_Shutdown() Func _DrawGraph($width = $sGUI_Width, $height = $sGUI_Height) $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI) $hPen = _GDIPlus_PenCreate() ;Draw graph $width = $width - 50 ; just some padding $height = $height - 90 ; just some padding _GDIPlus_GraphicsDrawLine($hGraphic, 10, Int($height/2), $width + 10, Int($height/2), $hPen) _GDIPlus_GraphicsDrawLine($hGraphic, Int($width/2), 10, Int($width/2), $height + 10, $hPen) _GDIPlus_GraphicsDrawRect($hGraphic, 10, 10, $width, $height, $hPen) ; Clean up resources _GDIPlus_PenDispose($hPen) _GDIPlus_GraphicsDispose($hGraphic) EndFunc ;==>_DrawGraph Edited June 5, 2010 by ghetek Link to comment Share on other sites More sharing options...
Yoriz Posted June 5, 2010 Share Posted June 5, 2010 Hey, this might be a bit better. I added a repaint of the window. made the pen only created and destroyed once changed the $GUI_EVENT_RESIZED into a GUIRegisterMsg on resize made the resizing scale better and added a variable $fMaintainAspect that can be set true or false depending on how you prefere it. expandcollapse popup#include <GuiConstantsEx.au3> #include <WindowsConstants.au3> #include <GDIPlus.au3> Opt('MustDeclareVars', 1) Global $hGUI, $sGUI_Title = 'Test Resizer', $hGraphic, $hGraphicGUI, $hBMPBuff, $hPen, _ $sGUI_Width = 574, $sGUI_Height = 600, _ $hGUI = GUICreate($sGUI_Title, $sGUI_Width, $sGUI_Height, -1, -1, $WS_SIZEBOX + $WS_SYSMENU) GUISetState() _GDIPlus_Startup() $hPen = _GDIPlus_PenCreate() _DrawGraph() GUIRegisterMsg($WM_SIZE, "_DrawGraph") While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE _CleanUpGdi() Exit EndSwitch WEnd Func _CleanUpGdi() ; Clean up resources _GDIPlus_PenDispose($hPen) _GDIPlus_GraphicsDispose($hGraphicGUI) _WinAPI_DeleteObject($hBMPBuff) _GDIPlus_GraphicsDispose($hGraphic) _GDIPlus_Shutdown() EndFunc ;==>_CleanUpGdi Func _DrawGraph() Local $fMaintainAspect = True _GDIPlus_GraphicsDispose($hGraphic) _GDIPlus_GraphicsDispose($hGraphicGUI) _WinAPI_DeleteObject($hBMPBuff) Local $iWinSIze = WinGetClientSize($hGUI) Local $iBorder = 10 Local $iWidth = Round($iWinSIze[0] - $iBorder * 2) Local $iHeight = Round($iWinSIze[1] - $iBorder * 2) If $fMaintainAspect Then If $iHeight < $iWidth Then $iWidth = $iHeight If $iWidth < $iHeight Then $iHeight = $iWidth EndIf ConsoleWrite('Width:' & $iWinSIze[0] & ' Height:' & $iWinSIze[1] & @CRLF) $hGraphicGUI = _GDIPlus_GraphicsCreateFromHWND($hGUI) $hBMPBuff = _GDIPlus_BitmapCreateFromGraphics($iWidth + $iBorder * 2, $iHeight + $iBorder * 2, $hGraphicGUI) $hGraphic = _GDIPlus_ImageGetGraphicsContext($hBMPBuff) ;Draw graph _GDIPlus_GraphicsDrawLine($hGraphic, $iBorder, $iBorder + $iHeight / 2, $iBorder + $iWidth, $iBorder + $iHeight / 2, $hPen) _GDIPlus_GraphicsDrawLine($hGraphic, $iBorder + $iWidth / 2, $iBorder, $iBorder + $iWidth / 2, $iBorder + $iHeight, $hPen) _GDIPlus_GraphicsDrawRect($hGraphic, $iBorder, $iBorder, $iWidth, $iHeight, $hPen) GUIRegisterMsg($WM_PAINT, "MY_PAINT") _GDIPlus_GraphicsDrawImage($hGraphicGUI, $hBMPBuff, 0, 0) _WinAPI_RedrawWindow($hGUI, "", "", BitOR($RDW_INVALIDATE, $RDW_UPDATENOW, $RDW_FRAME)) Return $GUI_RUNDEFMSG EndFunc ;==>_DrawGraph Func MY_PAINT($hWnd, $msg, $wParam, $lParam) _GDIPlus_GraphicsDrawImage($hGraphicGUI, $hBMPBuff, 0, 0) Return $GUI_RUNDEFMSG EndFunc ;==>MY_PAINT GDIPlusDispose - A modified version of GDIPlus that auto disposes of its own objects before shutdown of the Dll using the same function Syntax as the original.EzMySql UDF - Use MySql Databases with autoit with syntax similar to SQLite UDF. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now