WoodGrain Posted August 15, 2023 Posted August 15, 2023 Following on from my other post related to getting a title-less GUI with a 1px line, I'm wanting to color the line. I've attached a crude example of what i'm trying to explain/achieve. I have percentages (based on ranges in an array) I will be able to use to apply to the different colours that will define how wide they are (relative to the screen width). At this point, I'm considering creating multiple colored lines stacked horizontally next to each other using _GDIPlus_GraphicsDrawLine, but wanted to see if anyone else had a better way of achieveing this? Thanks!
Andreik Posted August 15, 2023 Posted August 15, 2023 I made the GUI 5px height just for convenience but you can make it 1px very easy. In the data array you just have to set percentages and color (AARRGGBB format) for that specific segment. expandcollapse popup#include <GDIPlus.au3> #include <WinAPISysWin.au3> $hGUI = GUICreate('', 800, 5, Default, Default, 0x80000000) ; WS_POPUP $idPic = GUICtrlCreatePic('', 0, 0, 800, 5) GuiSetState() Dim $aData[4][2] = [[30, 0xFF606C38], [20, 0xFFFFC300], [40, 0xFFEF233C], [10, 0xFF0D3B66]] CreateStackedBar($idPic, $aData) Do Until GUIGetMsg() = -3 ; GUI_EVENT_CLOSE Func CreateStackedBar($idCtrl, $aData) Local Const $STM_SETIMAGE = 0x0172, $IMAGE_BITMAP = 0 Local $hCtrl = GUICtrlGetHandle($idCtrl) Local $hParent = _WinAPI_GetParent($hCtrl) Local $aPos = ControlGetPos($hParent, '', $idCtrl) Local $iCurrent = 0, $iWidth = 0 _GDIPlus_Startup() Local $hBitmap = _GDIPlus_BitmapCreateFromScan0($aPos[2], $aPos[3]) Local $hGraphics = _GDIPlus_ImageGetGraphicsContext($hBitmap) Local $hBrush = _GDIPlus_BrushCreateSolid() For $Index = 0 To UBound($aData) - 1 $iWidth = $aData[$Index][0] * $aPos[2] / 100 _GDIPlus_BrushSetSolidColor($hBrush, $aData[$Index][1]) _GDIPlus_GraphicsFillRect($hGraphics, $iCurrent, 0, $iWidth, $aPos[3], $hBrush) $iCurrent += $iWidth Next Local $hHBITMAP = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap) _WinAPI_DeleteObject(GUICtrlSendMsg($idCtrl, $STM_SETIMAGE, $IMAGE_BITMAP, $hHBITMAP)) _WinAPI_DeleteObject($hHBITMAP) _GDIPlus_BrushDispose($hBrush) _GDIPlus_GraphicsDispose($hGraphics) _GDIPlus_BitmapDispose($hBitmap) _GDIPlus_Shutdown() EndFunc
Nine Posted August 15, 2023 Posted August 15, 2023 Another option that will give you the opportunity to identify which bar the user has clicked on. #include <GUIConstants.au3> Opt("MustDeclareVars", True) Local $aData = [[30, 0xFF0000, "Red"], [20, 0xFFFF00, "Yellow"], [40, 0x00FF00, "Green"], [10, 0x0000FF, "Blue"]] Local $aLab[UBound($aData)] Local $hGUI = GUICreate('', 800, 5, Default, Default, $WS_POPUP) Local $iStart = 0, $iWidth For $i = 0 To UBound($aLab) - 1 $iWidth = 800 * $aData[$i][0] / 100 $aLab[$i] = GUICtrlCreateLabel("", $iStart, 0, $iWidth, 5) GUICtrlSetBkColor(-1, $aData[$i][1]) $iStart += $iWidth Next GuiSetState() Local $iMsg While True $iMsg = GUIGetMsg() Switch $iMsg Case $GUI_EVENT_CLOSE ExitLoop Case $aLab[0] To $aLab[UBound($aLab) - 1] ConsoleWrite("You have click on the " & $aData[$iMsg - $aLab[0]][2] & " bar." & @CRLF) EndSwitch WEnd “They did not know it was impossible, so they did it” ― Mark Twain Spoiler Block all input without UAC Save/Retrieve Images to/from Text Monitor Management (VCP commands) Tool to search in text (au3) files Date Range Picker Virtual Desktop Manager Sudoku Game 2020 Overlapped Named Pipe IPC HotString 2.0 - Hot keys with string x64 Bitwise Operations Multi-keyboards HotKeySet Recursive Array Display Fast and simple WCD IPC Multiple Folders Selector Printer Manager GIF Animation (cached) Screen Scraping Multi-Threading Made Easy
WoodGrain Posted August 15, 2023 Author Posted August 15, 2023 Thank you both for your very full answers! I was really just after suggestions as to what possible better alternatives to what I was considering and you both went above and beyond with full examples, thanks. @Andreik that really provided an end to end example of how to use the GDIPlus tools, thank you! @Nine interesting, by using the labels I don't even need the GDI tools, I think I will explore this further, thank you!
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