Jump to content

Recommended Posts


Hello all
I have a question please
this  a question is about the context menu
When i create a list box  Or combo box
if i create a context menu for this list
When i press the application key or the shortcut shift + f10
the menu options is appear normally
but When i create a List view
if i create a context menu for this list
When i press the application key or the shortcut shift + f10
the menu options isn't appear
But the right mouse button works normally
I need a solution please because I deal with the screen readers users
Unfortunately They can not use the mouse to navigate
So I have to find a solution to activate keyboard shortcuts
am waiting  for your help

Edited by nacerbaaziz
Link to post
Share on other sites
  • Moderators

@nacerbaaziz you know what comes next, you need to provide code that shows the issue you are encountering.

"Profanity is the last vestige of the feeble mind. For the man who cannot express himself forcibly through intellect must do so through shock and awe" - Spencer W. Kimball

How to get your question answered on this forum!

Link to post
Share on other sites

hello again
this is my example
When i press the application key or the shortcut shift + f10
the menu options isn't appear
But the right mouse button works normally


#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#include <GuiListView.au3>
main()
func main()
local $GUI = GUICreate("listView context menu", 800, 400, @DesktopWidth / 2 - 192, @DesktopHeight / 2 - 235, -1, $WS_EX_ACCEPTFILES + $WS_EX_TOPMOST)
global $list = GUICtrlCreateListView("", 0, 10, 700, 150, bitOr($LVS_SINGLESEL,$LVS_SORTASCENDING))

    _GUICtrlListView_AddColumn($list, "Name", 150, 0)
    _GUICtrlListView_AddColumn($list, "version", 50, 0)
    _GUICtrlListView_AddColumn($list, "Publisher", 150, 0)
    _GUICtrlListView_AddColumn($list, "Uninstall file path", 400, 0)
local $menu = GUICtrlCreateContextMenu($list)
local $Ref = GUICtrlCreateMenuItem("refresh", $menu)
local $Unins = GUICtrlCreateMenuItem("Uninstall", $menu)
Unins_refresh()
GUISetState(@sw_Show, $GUI)
while 1
Switch GUIGetMSG()
case $GUI_Event_Close
exit
case $Ref
Unins_refresh()
case $Unins
            $selecteditem = _GUICtrlListView_GetItemTextString($list, Int(_GUICtrlListView_GetSelectedIndices($list)))
            $selecteditemarray = StringSplit($selecteditem, "|")

Dim $iMsgBoxAnswer
$iMsgBoxAnswer = MsgBox(4132,"uninstall " &             $selecteditemarray[1] & "?","are you sure want to uninstall " &             $selecteditemarray[1] & " version" &             $selecteditemarray[2] & "?")
Select
   Case $iMsgBoxAnswer = 6 ;Yes

run($selecteditemarray[4])
EndSelect

EndSwitch
Wend
endFunc
Func Unins_refresh()
    _GUICtrlListView_DeleteAllItems($list)
    ProgressOn("Uninstall Manager", "Loading...", "0%")

local $r_var, $r_hash = 0, $UninsName = "", $UnInsPath = "", $UninsVersion = "", $UninsPublisher = "", $SystemComponent
local $RegKey = "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
    While 1
        $r_hash += 1
        $r_var = RegEnumKey($regKey, $r_hash)
        If @error <> 0 Then
$r_var = ""
$r_hash = 0
$UninsName = ""
$UnInsPath = ""
$UninsVersion = ""
$UninsPublisher = ""
            ExitLoop

        Else
        $r_var = $Regkey & "\" &         $r_var
$UNinsName = RegRead($r_var, "DisplayName")
if @error then $UNinsName = ""
$UNinsVersion = RegRead($r_var, "DisplayVersion")
if @error then $UNinsVersion = ""
$UninsPublisher = RegRead($r_var, "Publisher")
if @error then $UninsPublisher = ""
$UNinsPath = RegRead($r_var, "UninstallString")
if @error then $UNinsPath = ""
$SystemComponent = RegRead($r_var, "SystemComponent")
if @error then $SystemComponent = 0
if not ($UninsPath = "") and not ($UninsName = "") and not ($SystemComponent = 1) then
            GUICtrlCreateListViewItem($UninsName & "|" & $UninsVersion & "|" & $UninsPublisher & "|" & $UninsPath, $list)
endIf
        EndIf
    WEnd
$RegKey = "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
    While 1
        $r_hash += 1
        $r_var = RegEnumKey($regKey, $r_hash)
        If @error <> 0 Then
$r_var = ""
$r_hash = 0
$UninsName = ""
$UnInsPath = ""
$UninsVersion = ""
$UninsPublisher = ""
            ExitLoop

        Else
        $r_var = $Regkey & "\" &         $r_var
$UNinsName = RegRead($r_var, "DisplayName")
if @error then $UNinsName = ""
$UNinsVersion = RegRead($r_var, "DisplayVersion")
if @error then $UNinsVersion = ""
$UninsPublisher = RegRead($r_var, "Publisher")
if @error then $UninsPublisher = ""
$UNinsPath = RegRead($r_var, "UninstallString")
if @error then $UNinsPath = ""
$SystemComponent = RegRead($r_var, "SystemComponent")
if @error then $SystemComponent = 0
if not ($UninsPath = "") and not ($UninsName = "") and not ($SystemComponent = 1) then
            GUICtrlCreateListViewItem($UninsName & "|" & $UninsVersion & "|" & $UninsPublisher & "|" & $UninsPath, $list)
endIf
        EndIf
WEnd
###
if @OSArch = "x64" then
$RegKey = "HKLM64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
    While 1
        $r_hash += 1
        $r_var = RegEnumKey($regKey, $r_hash)
        If @error <> 0 Then
$r_var = ""
$r_hash = 0
$UninsName = ""
$UnInsPath = ""
$UninsVersion = ""
$UninsPublisher = ""
            ExitLoop

        Else
        $r_var = $Regkey & "\" &         $r_var
$UNinsName = RegRead($r_var, "DisplayName")
if @error then $UNinsName = ""
$UNinsVersion = RegRead($r_var, "DisplayVersion")
if @error then $UNinsVersion = ""
$UninsPublisher = RegRead($r_var, "Publisher")
if @error then $UninsPublisher = ""
$UNinsPath = RegRead($r_var, "UninstallString")
if @error then $UNinsPath = ""
$SystemComponent = RegRead($r_var, "SystemComponent")
if @error then $SystemComponent = 0
if not ($UninsPath = "") and not ($UninsName = "") and not ($SystemComponent = 1) then
            GUICtrlCreateListViewItem($UninsName & "|" & $UninsVersion & "|" & $UninsPublisher & "|" & $UninsPath, $list)
endIf
        EndIf
WEnd
$RegKey = "HKCU64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
    While 1
        $r_hash += 1
        $r_var = RegEnumKey($regKey, $r_hash)
        If @error <> 0 Then
$r_var = ""
$r_hash = 0
$UninsName = ""
$UnInsPath = ""
$UninsVersion = ""
$UninsPublisher = ""
            ExitLoop

        Else
        $r_var = $Regkey & "\" &         $r_var
$UNinsName = RegRead($r_var, "DisplayName")
if @error then $UNinsName = ""
$UNinsVersion = RegRead($r_var, "DisplayVersion")
if @error then $UNinsVersion = ""
$UninsPublisher = RegRead($r_var, "Publisher")
if @error then $UninsPublisher = ""
$UNinsPath = RegRead($r_var, "UninstallString")
if @error then $UNinsPath = ""
$SystemComponent = RegRead($r_var, "SystemComponent")
if @error then $SystemComponent = 0
if not ($UninsPath = "") and not ($UninsName = "") and not ($SystemComponent = 1) then

            GUICtrlCreateListViewItem($UninsName & "|" & $UninsVersion & "|" & $UninsPublisher & "|" & $UninsPath, $list)
endIf
        EndIf
WEnd
endIf
endFunc


:)
Please help me

Edited by nacerbaaziz
Link to post
Share on other sites

I recently encountered a similar issue with trying to allow update on arrow up and down in a list view

same thing should help you as well

Global $g_hList1 = GUICtrlCreateListView("#|x|y", 5, 24, 161, 201, $LVS_SHOWSELALWAYS Or $LVS_SINGLESEL)
Global $g_hList1_LVN = GUICtrlCreateDummy() ;listview notifications

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

;Event loop etc....
If GuiGetMsg() == $g_hList1_LVN Then
            ;Your Code
EndIf
;;;.................................

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    Static Local $hWndList1 = GUICtrlGetHandle($g_hList1)
    If Not IsHWnd($hWndList1) Then $hWndList1 = GUICtrlGetHandle($g_hList1)
    If @error Then Return $GUI_RUNDEFMSG
    If $wParam = $g_hList1 Then
        Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam)

        Switch DllStructGetData($tNMHDR, "Code")

            Case $LVN_KEYDOWN, $NM_CLICK
                GUICtrlSendToDummy($g_hList1_LVN, $lParam)
        EndSwitch
    EndIf

    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
































































;

To see it in full context check here:

You also don't really need the dummy control but I wanted to receive an even in my event loop and handle it there rather than in the WM_Notify callback

Noticed I saved the listview handle as well; It seems that sometimes it takes forever for the GUICtrlGetHandle() function to return...

Edited by Bilgus
Made the code post Long so you can use the popup button to get it in a separate window
Link to post
Share on other sites

Basically you don't get notifications for keypress in the list view so you register a callback for WM_NOTIFY and look for the handle of the listview

This calls the dummy control when it gets a key even or mouse click

in the event for the dummy control you check for a mouse right click or keyboard key and pop your menu

If you want more code than that follow the link and you can see the code in action for the arrow keys

I put the code for DrawPathPoints in a file for you in the example code post..

Edited by Bilgus
Link to post
Share on other sites
  • Moderators

You have all that code, but don't understand 18 lines that were provided to you? Are you just copying your code from somewhere, without actually understanding what how it works?

"Profanity is the last vestige of the feeble mind. For the man who cannot express himself forcibly through intellect must do so through shock and awe" - Spencer W. Kimball

How to get your question answered on this forum!

Link to post
Share on other sites
  • 3 weeks later...

hiI understand the code,
but let's say I have more than one list view in the same GUI
so how can I do each list view its own context menu
This is the code that I do, please help me to adjust it.
I apologize for my difficulty in understanding.

#include <Misc.au3>
#include <ListViewConstants.au3>
#include <GUIConstants.au3>
Global $GUI = GUICreate("test")
Global $g_hList1 = GUICtrlCreateListView("#|x|y", 5, 24, 161, 70, $LVS_SHOWSELALWAYS Or $LVS_SINGLESEL)
Global $g_hList1_LVN = GUICtrlCreateDummy()
Global $context = GUICtrlCreateContextMenu($g_hList1_LVN)
GUICtrlCreateMenuItem("1", $context)
GUICtrlCreateMenuItem("2", $context)

Global $g_hList2 = GUICtrlCreateListView("#|x|y", 5, 100, 161, 70, $LVS_SHOWSELALWAYS Or $LVS_SINGLESEL)
Global $g_hList2_LVN = GUICtrlCreateDummy()
Global $context2 = GUICtrlCreateContextMenu($g_hList2_LVN)
GUICtrlCreateMenuItem("3", $context2)
GUICtrlCreateMenuItem("4", $context2)

GUISetState()
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
While 1
    Switch GUIGetMsg()
        Case $gui_event_close
            Exit
        Case $g_hList1_LVN
            ShowMenu($GUI, GUIGetMsg(), $context)
    EndSwitch
WEnd
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    Static Local $hWndList1 = GUICtrlGetHandle($g_hList1)
    If Not IsHWnd($hWndList1) Then $hWndList1 = GUICtrlGetHandle($g_hList1)
    If @error Then Return $GUI_RUNDEFMSG
    If $wParam = $g_hList1 Then
        Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
        Switch DllStructGetData($tNMHDR, "Code")
            Case $LVN_KEYDOWN, $NM_CLICK
                If _IsPressed("02") Or _IsPressed("5D") Then
                    GUICtrlSendToDummy($g_hList1_LVN, $lParam)
                EndIf
        EndSwitch
    EndIf
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
Func ShowMenu($hWnd, $idCtrl, $idContext)
    Local $aPos, $x, $y
    Local $hMenu = GUICtrlGetHandle($idContext)

    $aPos = ControlGetPos($hWnd, "", $idCtrl)

    $x = $aPos[0]
    $y = $aPos[1] + $aPos[3]

    ClientToScreen($hWnd, $x, $y)
    TrackPopupMenu($hWnd, $hMenu, $x, $y)
EndFunc   ;==>ShowMenu

; Convert the client (GUI) coordinates to screen (desktop) coordinates
Func ClientToScreen($hWnd, ByRef $x, ByRef $y)
    Local $tPoint = DllStructCreate("int;int")

    DllStructSetData($tPoint, 1, $x)
    DllStructSetData($tPoint, 2, $y)

    DllCall("user32.dll", "int", "ClientToScreen", "hwnd", $hWnd, "struct*", $tPoint)

    $x = DllStructGetData($tPoint, 1)
    $y = DllStructGetData($tPoint, 2)
    ; release Struct not really needed as it is a local
    $tPoint = 0
EndFunc   ;==>ClientToScreen

; Show at the given coordinates (x, y) the popup menu (hMenu) which belongs to a given GUI window (hWnd)
Func TrackPopupMenu($hWnd, $hMenu, $x, $y)
    DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", $hMenu, "int", 0, "int", $x, "int", $y, "hwnd", $hWnd, "ptr", 0)
EndFunc   ;==>TrackPopupMenu

@Bilgus

Edited by Jos
added codebox ... please use that in the future and tidied code
Link to post
Share on other sites

There is the bare minimum for what you want

#include <Misc.au3>
#include <ListViewConstants.au3>
#include <GUIConstants.au3>
#include <GuiMenu.au3>

Global $GUI = GUICreate("test")
Global $g_iTemp
Global $g_hList1 = GUICtrlCreateListView("#|x|y", 5, 24, 161, 70, $LVS_SHOWSELALWAYS Or $LVS_SINGLESEL)
GUICtrlCreateListViewItem("text", $g_hList1)
Global $g_hList1_LVN = GUICtrlCreateDummy()

Global $context = GUICtrlCreateContextMenu($g_hList1)
GUICtrlCreateMenuItem("1", $context)
GUICtrlCreateMenuItem("2", $context)

Global $g_hList2 = GUICtrlCreateListView("#|x|y", 5, 100, 161, 70, $LVS_SHOWSELALWAYS Or $LVS_SINGLESEL)
GUICtrlCreateListViewItem("text", $g_hList2)
Global $g_hList2_LVN = GUICtrlCreateDummy()
Global $context2 = GUICtrlCreateContextMenu($g_hList2)
GUICtrlCreateMenuItem("3", $context2)
GUICtrlCreateMenuItem("4", $context2)

GUISetState()
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
While 1
    Switch GUIGetMsg()
        Case $gui_event_close
            Exit
        Case $g_hList1_LVN ;This is just a dummy it only recieves events
            ConsoleWrite("LV1 EVENT" & @CRLF)
            $g_iTemp = GUICtrlRead($g_hList1_LVN) ;Retrieve the code that WM_NOTIFY SENT
            If $g_iTemp = $LVN_KEYDOWN Then
                If _IsPressed("79") And (_IsPressed("A0") Or _IsPressed("A1")) Then ;Right/ Left Shift & F10
                    ShowMenu($GUI, $g_hList1, $context)
                Else
                    ConsoleWrite("Some Other Keys" & @CRLF)
                EndIf
            Else
                ConsoleWrite("Some Other Event" & @CRLF)
            EndIf
        Case $g_hList2_LVN
            ConsoleWrite("LV2 EVENT" & @CRLF)
            $g_iTemp = GUICtrlRead($g_hList1_LVN)
            If $g_iTemp = $LVN_KEYDOWN Then
                If _IsPressed("79") And (_IsPressed("A0") Or _IsPressed("A1")) Then ;Right/ Left Shift & F10
                    ShowMenu($GUI, $g_hList2, $context2)
                EndIf
            EndIf
    EndSwitch
WEnd
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    Local $tNMHDR, $iCode ;
    Switch $wParam
        Case $g_hList1
            $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
            $iCode = DllStructGetData($tNMHDR, "Code")
            Switch $iCode
                Case $LVN_KEYDOWN, $NM_CLICK
                    GUICtrlSendToDummy($g_hList1_LVN, $iCode) ;send the code back to be processed by the dummy
            EndSwitch
        Case $g_hList2
            $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
            $iCode = DllStructGetData($tNMHDR, "Code")
            Switch $iCode
                Case $LVN_KEYDOWN, $NM_CLICK
                    GUICtrlSendToDummy($g_hList2_LVN, $iCode)
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func ShowMenu($hWnd, $idCtrl, $idContext)
    Local $aPos, $x, $y
    Local $hMenu = GUICtrlGetHandle($idContext)

    $aPos = ControlGetPos($hWnd, "", $idCtrl)

    $x = $aPos[0]
    $y = $aPos[1] + $aPos[3]

    ClientToScreen($hWnd, $x, $y)
    TrackPopupMenu($hWnd, $hMenu, $x, $y)
EndFunc   ;==>ShowMenu

; Convert the client (GUI) coordinates to screen (desktop) coordinates
Func ClientToScreen($hWnd, ByRef $x, ByRef $y)
    Local $tPoint = DllStructCreate("int;int")

    DllStructSetData($tPoint, 1, $x)
    DllStructSetData($tPoint, 2, $y)

    DllCall("user32.dll", "int", "ClientToScreen", "hwnd", $hWnd, "struct*", $tPoint)

    $x = DllStructGetData($tPoint, 1)
    $y = DllStructGetData($tPoint, 2)
    ; release Struct not really needed as it is a local
    $tPoint = 0
EndFunc   ;==>ClientToScreen

; Show at the given coordinates (x, y) the popup menu (hMenu) which belongs to a given GUI window (hWnd)
Func TrackPopupMenu($hWnd, $hMenu, $x, $y)
    ;DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", $hMenu, "int", 0, "int", $x, "int", $y, "hwnd", $hWnd, "ptr", 0)
    _GUICtrlMenu_TrackPopupMenu($hMenu, $hWnd, $x, $y)
EndFunc   ;==>TrackPopupMenu

 

Edited by Bilgus
Link to post
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
  • 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 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()  
    • By nacerbaaziz
      hello guys, please i need your help
      am trying to work with CreateWindowEx api, i created the window with it controls, also i setup the call back function
      i'am using WinMSGLoop to focus with the keyboard.
      here i have a problem, i hope that you can help me.
      on the controls i used the UDF that comme with the autoit, such as _GUIButton_Create, _GUIListBox_Create....
      but i can't find a STATIC control UDF, for that i used this

      local $h_ssrvlbl = _WinAPI_CreateWindowEx(0, "STATIC", "الخادم", BitOr($WS_VISIBLE, $WS_CHILD, $WS_CLIPSIBLINGS, $WS_CLIPCHILDREN), 250, 10, 100, 20, $hWnd)
      as you can see here, there is an arabic text, so here is the problem, the arabic text isn't show normally, what is the problem here?
      also i have  an other question about keyboard focus, when i used WinMSGLoop, it worked, but if i press alt+tab to switch windows or focus an other window and return back to my window, the focus of control is kill.
      can any one help me to solve that please?
      my code will be as file here with the include files
      i hope can any one help me here
      thanks in advance
       
      speed Test win.zip
×
×
  • Create New...