-
Recently Browsing 0 members
No registered users viewing this page.
-
Similar Content
-
By RAMzor
Hello,
I'm trying to implement Virtual ListView in my project. I have been based on example from @LarsJ.
The script loads data from csv file instead of array as in original example and perform some parsing.
Sometimes, when running a script, it adds garbage to the end of the correct data.
The data is loaded correctly into the global array (double-clicking on a row with garbage displays it correct in the console), but is not displayed correctly.
What am I missing or doing wrong?
#include <GUIConstants.au3> #include <WindowsConstants.au3> #include <GuiImageList.au3> #include <GuiListView.au3> #include <GuiStatusBar.au3> #include <FileConstants.au3> #include <GuiListBox.au3> #include <SendMessage.au3> #include <EditConstants.au3> Opt("MustDeclareVars", 1) Global $hWnd, $idLV, $hLV, $aItems[1][1] Global $gWinXMin = 1130, $gWinYMin = 615 Global Const $TopMost = 262144 ; Set MsgBox top-most attribute Example() Func Example() Local $Ver = "Virtual LV" ; Create GUI $hWnd = GUICreate("iTS - Test Sequencer [Ver " & $Ver & "]", $gWinXMin, $gWinYMin, -1, -1, BitOR($WS_SIZEBOX, $WS_SYSMENU, $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX)) ; Create ListView Reduces flicker Checkboxes Tooltip Icons Local $iLvStyle = BitOR($WS_EX_CLIENTEDGE, $LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $LVS_EX_DOUBLEBUFFER, $LVS_EX_CHECKBOXES, $LVS_EX_INFOTIP);, $LVS_EX_SUBITEMIMAGES) $idLV = GUICtrlCreateListView("", 8, 50, 915, 477, $LVS_OWNERDATA, $iLvStyle) $hLV = GUICtrlGetHandle($idLV) ; Virtual listview ; --- ListView Add columns --- _GUICtrlListView_AddColumn($hLV, "# ID", 45) ; 0 _GUICtrlListView_AddColumn($hLV, "Group", 120) ; 1 _GUICtrlListView_AddColumn($hLV, "Name", 335) ; 2 _GUICtrlListView_AddColumn($hLV, "Min", 50) ; 3 _GUICtrlListView_AddColumn($hLV, "Max", 50) ; 4 _GUICtrlListView_AddColumn($hLV, "Result", 50) ; 5 _GUICtrlListView_AddColumn($hLV, "Status", 50) ; 6 _GUICtrlListView_AddColumn($hLV, "Description", 179) ; 7 ; Checkboxes _GUICtrlListView_SetCallBackMask($hLV, 32) ; 32 - The application stores the image list index of the current state image ; Load icon images ;~ Local $hImage = _GUIImageList_Create() ;~ _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hLV, 0xFF0000, 16, 16)) ; Index = 0 ;~ _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hLV, 0x00FF00, 16, 16)) ; Index = 1 ;~ _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hLV, 0x0000FF, 16, 16)) ; Index = 2 ;~ _GUICtrlListView_SetImageList($hLV, $hImage, 1) ; --- StatusBar --- Local $aStatusBarParts[5] = [220, 160, 160, 140, -1] Global $StatusBar = _GUICtrlStatusBar_Create($hWnd, $aStatusBarParts) ; $SBARS_SIZEGRIP ; --- DEBUG --- Local $Debug_1 = GUICtrlCreateButton("Check Random", 928, 383, 91, 25) ; 152 Local $Debug_2 = GUICtrlCreateButton("Load From Array", 1024, 383, 91, 25) ; 152 Local $Debug_3 = GUICtrlCreateButton("Load 15 Rows", 928, 412, 91, 25) Local $Debug_4 = GUICtrlCreateButton("Load 500 Rows", 1024, 412, 91, 25) Local $DebugLabel_1 = GUICtrlCreateLabel("DEBAG", 928, 444, 36, 17) GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") GUIRegisterMsg($WM_SIZE, "WM_SIZE") GUIRegisterMsg($WM_GETMINMAXINFO, "MY_WM_GETMINMAXINFO") ; Restrict minimaze window below specified size [$gWinXMin, $gWinYMin] GUISetState(@SW_SHOW) ; ============================================================================================= ; --- Load Test --- Local $sTestCsvFile = @ScriptDir & "\Test CSV 15.csv" _ListView_Load($sTestCsvFile, $aItems, True) ; Load Autosized ; ============================================================================================= ; Message loop While 1 Switch GUIGetMsg() Case $Debug_1 ConsoleWrite(UBound($aItems, 1) & @CRLF) ConsoleWrite(UBound($aItems, 2) & @CRLF) For $i = 0 To UBound($aItems, 1) - 1 $aItems[$i][10] = 8192 ; Checked Next ConsoleWrite("- $i " & $i & @CRLF) GUICtrlSendMsg( $idLV, $LVM_SETITEMCOUNT, $i, 0 ) ;~ $aItems[$i][10] = 4096 ; Unchecked ;~ $aItems[$k+$j][10] = 8192 ; Checked Case $Debug_2 Local $iRows = 250 Dim $aItems[$iRows+1][12] For $iRow = 0 To $iRows - 1 $aItems[$iRow][0] = $iRow + 1 $aItems[$iRow][1] = "AAA-" & Random(1000000, 9999999, 1) $aItems[$iRow][2] = "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" $aItems[$iRow][3] = "CCC-" & Random(1000000, 9999999, 1) $aItems[$iRow][4] = "DDD-" & Random(1000000, 9999999, 1) $aItems[$iRow][10] = 4096 ; Unchecked Next GUICtrlSendMsg( $idLV, $LVM_SETITEMCOUNT, $iRow, 0 ) _GUICtrlStatusBar_SetText($StatusBar, $iRow & " Rows Loaded", 1) Case $Debug_3 GUICtrlSetData($Debug_3, "Load 15") $sTestCsvFile = @ScriptDir & "\Test CSV 15.csv" _ListView_Load($sTestCsvFile, $aItems, True) ; Load Autosized Case $Debug_4 GUICtrlSetData($Debug_4, "Load 500") $sTestCsvFile = @ScriptDir & "\Test CSV 500.csv" _ListView_Load($sTestCsvFile, $aItems, True) ; Load Autosized Case $GUI_EVENT_CLOSE ExitLoop EndSwitch WEnd GUIDelete() EndFunc ;==>Example ; ; ; Return Test Count Func _ListView_Load($sTestCsvFile, ByRef $aItems, $AutoSize = True) Local $iRow = 0, $iNumLen, $aData, $aName, $GroupName, $TestName, $TestIdx, $MinVal, $MaxVal, $iStatus;, $aName Local $sTestIniFile = StringRegExpReplace($sTestCsvFile, '\.[^.]*$', '.tcf') ; INI File ;~ _SendMessage($hLV, $LVM_DELETEALLITEMS) ; Delete All Local $aCsv = FileReadToArray($sTestCsvFile) ; 9.289ms If @error Then Return MsgBox($TopMost+16, "_ListView_Load()", "! CSV File Reading ERROR") Local $LinesCount = @extended Dim $aItems[$LinesCount][12] $iNumLen = StringLen($LinesCount) For $i = 1 To $LinesCount-1 ; If StringLeft($aCsv[$i], 5) = "TEST_" Then $aData = StringSplit($aCsv[$i], ",") If $aData[0] >= 5 Then $iRow += 1 $aData[1] = StringReplace($aData[1], "TEST_", "", 1) $aData[1] = StringReplace(StringReplace($aData[1], "__", "|", 1), "_", " ", 1) $aName = StringSplit($aData[1], "|", 3) If @error Then $GroupName = "" $TestName = $aName[0] Else $GroupName = $aName[0] $TestName = StringReplace($aName[1], "_", " ") ; (all '_' replaced with ' ') EndIf $TestIdx = StringStripWS($aData[2], 7) $MinVal = StringStripWS($aData[3], 7) $MaxVal = StringStripWS( $aData[4], 7) $aItems[$iRow - 1][0] = StringFormat("%0" & $iNumLen & "i ", $iRow) $aItems[$iRow - 1][1] = $GroupName $aItems[$iRow - 1][2] = $TestName $aItems[$iRow - 1][3] = $MinVal $aItems[$iRow - 1][4] = $MaxVal $aItems[$iRow - 1][10] = 4096 ; 4096-Unchecked, 8192-Checked EndIf Else ContinueLoop EndIf Next _GUICtrlListView_BeginUpdate($hLV) GUICtrlSendMsg($idLV, $LVM_SETITEMCOUNT, $iRow, 0) ; Update data [$aItems] to ListView _GUICtrlListView_SetColumnWidth($hLV, 0, -1) If $AutoSize Then For $i = 1 To 2 _GUICtrlListView_SetColumnWidth($hLV, $i, $LVSCW_AUTOSIZE) Next EndIf _GUICtrlListView_EndUpdate($hLV) _GUICtrlStatusBar_SetText($StatusBar, $iRow & " Rows Loaded", 1) Return $iRow EndFunc ;==>_ListView_Load Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam) Local Static $tText = DllStructCreate("wchar[50]") Local Static $pText = DllStructGetPtr($tText) Local $tNMHDR, $hWndFrom, $iCode $tNMHDR = DllStructCreate($tagNMHDR, $lParam) $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom")) $iCode = DllStructGetData($tNMHDR, "Code") Switch $hWndFrom Case $hLV Switch $iCode Case $LVN_GETDISPINFOW Local $tNMLVDISPINFO = DllStructCreate($tagNMLVDISPINFO, $lParam) Local $iItem = DllStructGetData($tNMLVDISPINFO, "Item") Local $iSubItem = DllStructGetData($tNMLVDISPINFO, "SubItem") Local $iMask = DllStructGetData($tNMLVDISPINFO, "Mask") ; Text If BitAND($iMask, $LVIF_TEXT) Then Local $sText = $aItems[$iItem][$iSubItem] DllStructSetData($tText, 1, $sText) DllStructSetData($tNMLVDISPINFO, "Text", $pText) DllStructSetData($tNMLVDISPINFO, "TextMax", StringLen($sText)) EndIf ; Checkbox in first column If BitAND($iMask, $LVIF_STATE) And $iSubItem = 0 Then DllStructSetData($tNMLVDISPINFO, "State", $aItems[$iItem][10]) EndIf ; Icon in first column ; Use proper $iSubItem value for other columns If BitAND($iMask, $LVIF_IMAGE) And $iSubItem = 6 Then ; Status Column Icon DllStructSetData($tNMLVDISPINFO, "Image", $aItems[$iItem][11]) EndIf Case $NM_CUSTOMDRAW Local $tNMLVCUSTOMDRAW = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam) Local $dwDrawStage = DllStructGetData($tNMLVCUSTOMDRAW, "dwDrawStage") Local $dwItemSpec = DllStructGetData($tNMLVCUSTOMDRAW, "dwItemSpec") Switch $dwDrawStage ; Holds a value that specifies the drawing stage Case $CDDS_PREPAINT ; Before the paint cycle begins Return $CDRF_NOTIFYITEMDRAW ; Notify the parent window of any item-related drawing operations Case $CDDS_ITEMPREPAINT ; Before painting an item If Mod($dwItemSpec, 2) = 1 Then DllStructSetData($tNMLVCUSTOMDRAW, "ClrTextBk", 0xFFFFFF) Else DllStructSetData($tNMLVCUSTOMDRAW, "ClrTextBk", 0xEBF7FF) ; BGR EndIf Return $CDRF_NEWFONT ; $CDRF_NEWFONT must be returned after changing font or colors EndSwitch Case $NM_CLICK Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam) Local $iItem = DllStructGetData($tInfo, "Index") Local $iSubItem = DllStructGetData($tInfo, "SubItem") If $iSubItem = 0 Then If $aItems[$iItem][10] = 4096 Then $aItems[$iItem][10] = 8192 ; Checked Else $aItems[$iItem][10] = 4096 ; Unchecked EndIf _GUICtrlListView_RedrawItems($hLV, $iItem, $iItem) EndIf Case $NM_DBLCLK ; User double-clicks an item with the left mouse button (No return value) Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam) Local $iItem = DllStructGetData($tInfo, "Index") Local $iSubItem = DllStructGetData($tInfo, "SubItem") ConsoleWrite("--> DBLCLK Row : " & $iItem + 1 & @CRLF) ConsoleWrite("--> Name : " & $aItems[$iItem][$iSubItem] & @CRLF) EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_NOTIFY ; Resize the status bar when GUI size changes Func WM_SIZE($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg, $wParam, $lParam ;~ ConsoleWrite("ListView Width " & ControlGetPos($hWnd, "", $idLV)[2] & @CRLF) _GUICtrlStatusBar_Resize($StatusBar) Return $GUI_RUNDEFMSG EndFunc ;==>WM_SIZE Func MY_WM_GETMINMAXINFO($hWnd, $Msg, $wParam, $lParam) Local $minmaxinfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int",$lParam) DllStructSetData($minmaxinfo, 7, $gWinXMin); min X (+15) DllStructSetData($minmaxinfo, 8, $gWinYMin); min Y (+15) Return 0 EndFunc
Test CSV 15.csv Test CSV 500.csv Virt_LV_Garbage.au3
-
By RAMzor
Hello all,
I have an ListView with checkboxes and about 300 - 400 items. Entire list is loaded (from ini) every time and I need to store and load "checked scenario" by name.
Store list of checked indexless is a bad idea because in the case of sorting the list - scenario will no longer be correct.
What is the best way to store list of various scenarios of checked items?
Base code and database ini are attached
Example_LV_Store_Scenario.au3 Example.ini
-
By kurtykurtyboy
GuiFlatButton is a UDF to easily create regular buttons with different colors for background, foreground, border, hover, focus, etc..
This started as an effort to change the background color of a button and eventually grew into a full UDF.
If you've looked around forums for changing button background colors, you have probably noticed that each proposed workaround has its own set of issues/side-effects. The answers usually circle back to 'use ownerdrawn buttons' and 'not worth it'. Well, now it is possible for anyone to easily create ownerdrawn buttons - totally worth it!
Some issues with other workarounds such as drawing with GDI+ or using a colored label as a 'button':
Not 'real' buttons so you lose built-in functionality that windows gives to buttons Messy / inefficient code in the main while loop to check for mouse position Slow to respond to click, paint, etc... Having to deal with GUIRegisterMsg messages Not straight-forward to implement GuiFlatButton is not a workaround; it is a technique to respond to Windows' built-in owner-drawn button events.
With minimal effort, we can now create true simple colored buttons.
The idea is to create an owner-drawn button using GUICtrlCreateButton then subclass the GUI and controls to handle the button-specific events to paint it however we want.
This UDF magically does all of this for us! No need to worry about event handling or main while loop logic.
How to use
It couldn't be any easier! Simply create a new button using the familiar syntax. This creates an ownerdrawn button with default colors.
$mybutton1 = GuiFlatButton_Create("Button 1", 78, 20, 120, 40) If you want to change the background and text colors:
GuiFlatButton_SetBkColor(-1, 0x5555FF) GuiFlatButton_SetColor(-1, 0xFFFFFF) Advanced Usage
Set background/text/border all at once
GuiFlatButton_SetColors(-1, 0x0000FF, 0xFFFFFF, 0x9999FF) Set ALL colors for ALL button states! (normal, focus, hover, selected)
Local $aColorsEx = [0x0000FF, 0xFFFFFF, -2, 0x4444FF, 0xFFFFFF, 0xAAAAFF, 0x6666FF, 0xFFFFFF, 0xCCCCFF, 0x0000EE, 0xFFFFFF, 0x7777EE] GuiFlatButton_SetColorsEx(-1, $aColorsEx) Set default colors to apply to any future buttons
;set colors GuiFlatButton_SetDefaultColors(0x0000FF, 0xFFFFFF, 0x9999FF) ;create buttons $mybutton1 = GuiFlatButton_Create("Button 1", 12, 20, 120, 40) $mybutton2 = GuiFlatButton_Create("Button 2", 143, 20, 120, 40) Set ALL color defaults
;set colors Local $aColorsEx = [0x0000FF, 0xFFFFFF, -2, 0x4444FF, 0xFFFFFF, 0xAAAAFF, 0x6666FF, 0xFFFFFF, 0xCCCCFF, 0x0000EE, 0xFFFFFF, 0x7777EE] GuiFlatButton_SetDefaultColorsEx($aColorsEx) ;create buttons $mybutton1 = GuiFlatButton_Create("Button 1", 12, 20, 120, 40) $mybutton2 = GuiFlatButton_Create("Button 2", 143, 20, 120, 40)
Available Functions
Simple Example
#include <GUIConstantsEx.au3> #include <MsgBoxConstants.au3> #include "GuiFlatButton.au3" Example() ;GUI with one button Func Example() Local $hGUI, $mybutton1 $hGUI = GUICreate("GuiFlatButton Ex0", 275, 120) GUISetBkColor(0x333333) $idLabel = GUICtrlCreateLabel("Click the button", 10, 100, 150, 30) GUICtrlSetColor(-1, 0xFFFFFF) ;create new button then set the background and foreground colors $mybutton1 = GuiFlatButton_Create("Button 1", 78, 20, 120, 40) GuiFlatButton_SetBkColor(-1, 0x5555FF) GuiFlatButton_SetColor(-1, 0xFFFFFF) GUISetState(@SW_SHOW, $hGUI) Local $i = 0 Local $iMsg While 1 $iMsg = GUIGetMsg() Switch $iMsg Case $GUI_EVENT_CLOSE ExitLoop Case $mybutton1 $i += 1 GUICtrlSetData($idLabel, $i) ConsoleWrite($i & @CRLF) EndSwitch Sleep(10) WEnd GUIDelete() EndFunc ;==>Example
Menu/Toolbar Example
#include <GUIConstantsEx.au3> #include <MsgBoxConstants.au3> #include "GuiFlatButton.au3" Example() ;Example GUI with toolbar Func Example() Local $hGUI, $idLabel, $aButtons, $iTbSize $hGUI = GUICreate("GuiFlatButton Ex2", 300, 200) GUISetBkColor(0x444444) $idLabel = GUICtrlCreateLabel("Click a button", 10, 180, 150, 30) GUICtrlSetColor(-1, 0xFFFFFF) $aButtons = createToolbar() $iTbSize = UBound($aButtons) GUISetState(@SW_SHOW, $hGUI) Local $i = 0 Local $iMsg While 1 $iMsg = GUIGetMsg() Switch $iMsg Case $GUI_EVENT_CLOSE ExitLoop Case $aButtons[0] To $aButtons[$iTbSize - 1] ConsoleWrite("1") GUICtrlSetData($idLabel, GuiFlatButton_Read($iMsg)) EndSwitch Sleep(10) WEnd GUIDelete() EndFunc ;==>Example Func createToolbar() Local $aButtons[6] Local $bkColor = 0x777777 Local $textColor = 0xFFFFFF Local $borderColor = 0x999999 Local $aBtnClrs[12] = [0x777777, 0xFFFFFF, $GUI_BKCOLOR_TRANSPARENT, 0x888888, 0xFFFFFF, $GUI_BKCOLOR_TRANSPARENT, 0x999999, 0xFFFFFF, $GUI_BKCOLOR_TRANSPARENT, 0x666666, 0xFFFFFF, $GUI_BKCOLOR_TRANSPARENT] For $i = 0 To UBound($aButtons) - 1 $aButtons[$i] = GuiFlatButton_Create("B" & $i, $i * 50, 0, 50, 17) GuiFlatButton_SetColorsEx($aButtons[$i], $aBtnClrs) Next Return $aButtons EndFunc ;==>createToolbar
Icon Example
You can even easily add icons to your buttons -- just create a new button and send it an icon!
#include <GDIPlus.au3> #include "GuiFlatButton.au3" Example() ;buttons with Icon images Func Example() ;get images for demonstration _GDIPlus_Startup() ;initialize GDI+ Local $hIcon = _WinAPI_ShellExtractIcon(@SystemDir & '\shell32.dll', 258, 24, 24) ;extract the 'Save' icon Local $hBitmap = _GDIPlus_BitmapCreateFromHICON($hIcon) ;Create Bitmap from Icon (for demonstration) Local $hHBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap) ;Create HBitmap from Bitmap _GDIPlus_BitmapDispose($hBitmap) ;dispose the bitmap _GDIPlus_Shutdown() ;done with GDI+ Local $hGUI = GUICreate("GuiFlatButton Ex5", 255, 400) GUISetBkColor(0xEEEEEE) ;set default colors of future buttons Local $aColorsEx = _ [0xE2E5E8, 0X000000, 0x888888, _ ; normal : Background, Text, Border 0xE2E5E8, 0X000000, 0x333333, _ ; focus : Background, Text, Border 0xE8E8E8, 0X000000, 0x666666, _ ; hover : Background, Text, Border 0xDDDDDD, 0X000000, 0xAAAAAA] ; selected : Background, Text, Border GuiFlatButton_SetDefaultColorsEx($aColorsEx) ;normal button with icon $label1 = GUICtrlCreateLabel( "$BS_TOOLBUTTON -->", 5, 10) GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT) Local $mybutton1 = GuiFlatButton_Create("Save", 130, 5, 50, 48, $BS_TOOLBUTTON) _WinAPI_DeleteObject(_SendMessage(GUICtrlGetHandle($mybutton1), $BM_SETIMAGE, $IMAGE_ICON, $hIcon)) ;align top Local $mybuttonT = GuiFlatButton_Create("Top", 5, 65, 120, 55, $BS_TOP) _WinAPI_DeleteObject(_SendMessage(GUICtrlGetHandle($mybuttonT), $BM_SETIMAGE, $IMAGE_ICON, $hIcon)) ;align top-left Local $mybuttonTL = GuiFlatButton_Create("Top-Left", 5, 125, 120, 55, BITOR($BS_TOP, $BS_LEFT)) _WinAPI_DeleteObject(_SendMessage(GUICtrlGetHandle($mybuttonTL), $BM_SETIMAGE, $IMAGE_ICON, $hIcon)) ;align top-right Local $mybuttonTR = GuiFlatButton_Create("Top-Right", 5, 185, 120, 55, BITOR($BS_TOP, $BS_RIGHT)) _WinAPI_DeleteObject(_SendMessage(GUICtrlGetHandle($mybuttonTR), $BM_SETIMAGE, $IMAGE_ICON, $hIcon)) ;align left Local $mybuttonL = GuiFlatButton_Create("Left", 5, 245, 120, 55, $BS_LEFT) _WinAPI_DeleteObject(_SendMessage(GUICtrlGetHandle($mybuttonL), $BM_SETIMAGE, $IMAGE_ICON, $hIcon)) ;align bottom Local $mybuttonB = GuiFlatButton_Create("Bottom", 130, 65, 120, 55, $BS_BOTTOM) _WinAPI_DeleteObject(_SendMessage(GUICtrlGetHandle($mybuttonB), $BM_SETIMAGE, $IMAGE_ICON, $hIcon)) ;align bottom-left Local $mybuttonBL = GuiFlatButton_Create("Bottom-Left", 130, 125, 120, 55, BITOR($BS_BOTTOM, $BS_LEFT)) _WinAPI_DeleteObject(_SendMessage(GUICtrlGetHandle($mybuttonBL), $BM_SETIMAGE, $IMAGE_ICON, $hIcon)) ;align bottom-right Local $mybuttonBR = GuiFlatButton_Create("Bottom-Right", 130, 185, 120, 55, BITOR($BS_BOTTOM, $BS_RIGHT)) _WinAPI_DeleteObject(_SendMessage(GUICtrlGetHandle($mybuttonBR), $BM_SETIMAGE, $IMAGE_ICON, $hIcon)) ;align right Local $mybuttonR = GuiFlatButton_Create("Right", 130, 245, 120, 55, $BS_RIGHT) _WinAPI_DeleteObject(_SendMessage(GUICtrlGetHandle($mybuttonR), $BM_SETIMAGE, $IMAGE_ICON, $hIcon)) GuiFlatButton_SetState($mybuttonR, $GUI_DISABLE ) ;disabled Local $mybuttonDisable = GuiFlatButton_Create("Disabled", 130, 310, 120, 55, $BS_TOOLBUTTON) _WinAPI_DeleteObject(_SendMessage(GUICtrlGetHandle($mybuttonDisable), $BM_SETIMAGE, $IMAGE_BITMAP, $hHBitmap)) GuiFlatButton_SetState($mybuttonDisable, $GUI_DISABLE ) ;clean up! _WinAPI_DestroyIcon( $hIcon ) _WinAPI_DeleteObject( $hHBitmap ) GUISetState(@SW_SHOW, $hGUI) Local $iMsg While 1 $iMsg = GUIGetMsg() Switch $iMsg Case $GUI_EVENT_CLOSE ExitLoop EndSwitch Sleep(10) WEnd GUIDelete() EndFunc ;==>Example
I'm sure there are some use-cases I've forgotten, so feedback is welcome!
Download the latest UDF and several more examples:
Update 2022-05-25
GuiFlatButton_20220525.zip
Fixed issue, buttons disappear when a GUI containing a child window with WS_EX_MDICHILD extended style is moved
Update 2022-05-24
Fixed issue releasing subclassing when GUI is deleted but program is not closed
Fixed occasional white background flicker
Added function GuiFlatButton_GetPos
Update 2021-01-02
Fixed bug, not drawing correctly after deleting GUI with GUIDelete()
Fixed bug, changing default colors changed all buttons, even previously created buttons
Made some internal functions more efficient
Update 2019-04-14
Fixed bug, not showing pressed down state when clicking rapidly
Added Icon/Bitmap support!
Added function GuiFlatButton_SetPos to change the position and/or size of a button
Update 2019-02-09
Added 2 new functions to set the button colors globally for all future buttons.
GuiFlatButton_SetDefaultColors
GuiFlatButton_SetDefaultColorsEx
Credits to:
Melba23 (UDF template)
LarsJ (general subclassing code)
4ggr35510n (TrackMouseEvent example)
binhnx (disable dragging with $WS_EX_CONTROLPARENT)
GUIRegisterMsg in AutoIt Help (owner-draw button example)
funkey (_WinAPI_DrawState example)
GuiFlatButton_20190414.zip GuiFlatButton20210102.zip
GuiFlatButton_20220524.zip
-
By ahha
Under program control is there an easy way to move a slider (thumb) to the top or bottom?
I am aware of Melba23's GUIScrollbars_Ex UDF (https://www.autoitscript.com/forum/topic/113723-scrollbars-made-easy-bugfix-version-2-may-21/) but I believe it's overkill for my simple needs.
In a listview with a vertical scrollbar when the window is active one can hit Ctrl+Home to move the scrollbar slider (thumb) to the top and Ctrl+End to the bottom.
One can also right click the slider and choose Scroll Here, Top, Bottom, Page UP, Page Down, Scroll Up, and Scroll Down.
I must be doing something basically wrong but am stuck. Move the thumb to the middle before clicking the Top button to test the code below (Bottom is not coded). I've commented out other trys. try #3 is a strange fail.
Any comments on what I'm missing greatly appreciated as I'm stuck
#AutoIt3Wrapper_run_debug_mode=Y #include <Debug.au3> #include <GUIConstantsEx.au3> #include <GuiListView.au3> #include <GuiScrollBars.au3> AutoItSetOption("MustDeclareVars", 1) ;v1b - cut out extraneous code Example() Exit Func Example() Local $i, $j, $x, $hGUI, $idListView, $bTop, $bBottom $hGUI = GUICreate("Scrollbar Question", 300, 400) ;get handle in case we need it later $idListView = GUICtrlCreateListView("Col 0", 10, 10, 280, 300) $bTop = GUICtrlCreateButton("Top", 10, 350, 60, 25) $bBottom = GUICtrlCreateButton("Bottom", 120, 350, 60, 25) ;Pause("$hGUI = '" & $hGUI &"'"& @CRLF & "$idListView = '" & $idListView &"'") For $i = 1 to 100 _GUICtrlListView_AddItem($idListView, $i) Next GUISetState(@SW_SHOW) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop Case $bTop ;drag thumb to middle of scrollbar before clicking Top button ;try #1 - FAILS Opt("WinTitleMatchMode", 2) ;2 = Match any substring in the title $x = WinActivate("Scrollbar Question") ;not $idListview but main GUI $hGUI - neither working If $x <> $hGUI Then Pause("WinActivate FAILED") Send("^{HOME}") ;Ctrl+home ;try#2 - FAILS ;~ $x = WinActivate($hGUI) ;try Main GUI ;~ If $x <> $hGUI Then Pause("WinActivate FAILED") ;~ Send("^{HOME}") ;Ctrl+home ;try#3 - strange FAILS ;~ $x = WinActivate($idListview) ;try $idListview ;~ If $x <> $idListview Then Pause("WinActivate FAILED") ;strange it works BUT if I comment out this line it fails ;~ ;Sleep(1000) ;it's not a time delay issue ;~ Send("^{HOME}") ;Ctrl+home ;try#4 - same strange fail as #3 ;~ $x = WinActivate($idListview) ;try $idListview ;~ If $x <> $idListview Then Pause("WinActivate FAILED") ;~ Send("{UP 100}") ;try#5 - what the heck is going on? same strange fail as #3 ;$x = WinActivate($idListview) ;try $idListview ;~ $x = WinActivate($hGUI) ;try Main GUI ;~ If $x <> $idListview Then Pause("WinActivate FAILED") ;~ MouseWheel($MOUSE_WHEEL_UP, 100) ;_GUIScrollBars_ScrollWindow($hGUI, 0, 100) ;NO - moves the ListView window in the $hGUI ;_GUIScrollBars_ScrollWindow($idListview, 0, 100) ;does not seem to work ;_GUIScrollBars_SetScrollInfoPos($hGUI, $SB_VERT, 30) ;does not work ;_GUIScrollBars_SetScrollInfoPos($idListview, $SB_VERT, 30) ;does not work ;I'm doing something very basic wrong. I need help. Pause("Scrollbar thumb should be at Top") Case $bBottom Pause("In: Case $bBottom") Pause("Scroll bar should be at BOttom") EndSwitch WEnd GUIDelete($idListView) EndFunc ;Func Example() Func Pause($text="") MsgBox(262144, "DEBUG", "Paused: " & $text) EndFunc
-
By ahha
Newbie to _GUICtrlListView_RegisterSortCallBack and can't get it to sort properly on date in format MM/DD/YYYY.
Example code below. Q - How do I get the date to sort properly?
;#AutoIt3Wrapper_run_debug_mode=Y #include <GUIConstantsEx.au3> #include <GuiListView.au3> Global $g_id_ListView Example() Exit Func Example() Local $idRow1, $idRow2, $idRow3 GUICreate("ListView Sort Question", 300, 200) $g_id_ListView = GUICtrlCreateListView("Row#|Name|Date", 10, 10, 280, 180) $id_Row1 = GUICtrlCreateListViewItem("#1|Alice|01/15/2022", $g_id_ListView) $id_Row2 = GUICtrlCreateListViewItem("#2|Bob|02/22/2021", $g_id_ListView) $id_Row3 = GUICtrlCreateListViewItem("#3|Carol|03/13/2021", $g_id_ListView) $id_Row10 = GUICtrlCreateListViewItem("#10|Dave|10/09/2021", $g_id_ListView) $id_Row11 = GUICtrlCreateListViewItem("#11|Eve|11/21/2021", $g_id_ListView) GUISetState(@SW_SHOW) ;$vCompareType = 0 ;not ok as Row# sort #1, #10, and want #1, #2, ;$vCompareType = 1 ;not ok as Row# sort #1, #10, and want #1, #2, $vCompareType = 2 ;Row# okay but Date messed up _GUICtrlListView_RegisterSortCallBack($g_id_ListView, $vCompareType) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop Case $g_id_ListView ;MsgBox(0,"","col="&GUICtrlGetState($g_id_ListView)) _GUICtrlListView_SortItems($g_id_ListView, GUICtrlGetState($g_id_ListView)) EndSwitch WEnd _GUICtrlListView_UnRegisterSortCallBack($g_id_ListView) GUIDelete($g_id_ListView) EndFunc ;Func Example()
-
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