Jump to content

Activate/Focus input control, which overlaps a listview


Recommended Posts

Hi,

iam not able to "activate" (the blue border of the edit control should be displayed) the created input control when clicking on a listview item. All i want is, when the edit control is created, it's active (blue border displayed) and you can directly write in it (cursor at the end), but i can't get it work. Can someone help?

#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <WindowsConstants.au3>
#include <GuiEdit.au3>
#include <Misc.au3>



Global $Debug_LV = False ; Check ClassName being passed to ListView functions, set to True and use a handle to another control to see it work
Global $bChanged = False, $hDLL = DllOpen("user32.dll")
Global $aClick_Info[2]
Global $hListView, $hTmp_Edit
Global $GUI, $hImage
$GUI = GUICreate("(UDF Created) ListView Create", 400, 300)

$hListView = _GUICtrlListView_Create($GUI, "", 2, 2, 394, 268)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
GUISetState()

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

; Load images
$hImage = _GUIImageList_Create()
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0xFF0000, 16, 16))
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x00FF00, 16, 16))
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x0000FF, 16, 16))
_GUICtrlListView_SetImageList($hListView, $hImage, 1)

; Add columns
_GUICtrlListView_InsertColumn($hListView, 0, "Column 1", 100)
_GUICtrlListView_InsertColumn($hListView, 1, "Column 2", 100)
_GUICtrlListView_InsertColumn($hListView, 2, "Column 3", 100)

; Add items
_GUICtrlListView_AddItem($hListView, "Row 1: Col 1", 0)
_GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 2", 1)
_GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 3", 2)
_GUICtrlListView_AddItem($hListView, "Row 2: Col 1", 1)
_GUICtrlListView_AddSubItem($hListView, 1, "Row 2: Col 2", 1)
_GUICtrlListView_AddItem($hListView, "Row 3: Col 1", 2)

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

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
    $hWndListView = $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
        Case $hWndListView
            Switch $iCode
                Case $NM_CLICK ; Sent by a list-view control when the user clicks an item with the left mouse button
                    Local $iIndex, $iSubItem, $sTmp_Text, $aRect, $aPos
                    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                    $iIndex = DllStructGetData($tInfo, "Index")
                    $iSubItem = DllStructGetData($tInfo, "SubItem")

                    ; make sure user clicks on the listview & only the activate
                    If $iIndex <> -1 And Not $bChanged Then

                        $bChanged = True

                        Local $iTimer = TimerInit()
                        Local $iCounter = 1
                        Local $DOUBLE_CLICK_TIME_DELTA = 1200

                        While 1
                            If _IsPressed("01", $hDLL) Then

                                $iCounter+=1
                                ConsoleWrite("_IsPressed - clicked." & @CRLF)
                                ; Wait until key is released.
                                While _IsPressed("01", $hDLL)
                                WEnd
                                ConsoleWrite("counter: " & $iCounter & " timer: " & TimerDiff($iTimer) & @CRLF)
                            EndIf
                            If $iCounter = 2 And TimerDiff($iTimer) < $DOUBLE_CLICK_TIME_DELTA Then
                                ConsoleWrite("yes." & @CRLF)
                                ExitLoop
                            EndIf
                            If TimerDiff($iTimer) > $DOUBLE_CLICK_TIME_DELTA Then
                                ConsoleWrite("over." & @CRLF)
                                $bChanged = False
                                Return 1
                            EndIf
                        WEnd

                        GUICtrlDelete($hTmp_Edit)

                        $aClick_Info[0] = $iIndex
                        $aClick_Info[1] = $iSubItem

;~                      GUISetAccelerators($aAccelKeys)

                        $sTmp_Text = _GUICtrlListView_GetItemText($hWndListView, $iIndex, $iSubItem)
                        ConsoleWrite("item: " & $iIndex & " subitem: " & $iSubItem & " text: " & $sTmp_Text & @CRLF)

                        If $iSubItem = 0 Then
                            $aRect = _GUICtrlListView_GetItemRect($hWndListView, $iIndex, 2)
                        Else
                            $aRect = _GUICtrlListView_GetSubItemRect($hWndListView, $iIndex, $iSubItem)
                        EndIf

                        $aPos = ControlGetPos("", "", $hWndListView)
                        ConsoleWrite("Information :" & StringFormat("Item 2 Rectangle : [%d, %d, %d, %d]", $aRect[0]+ $aPos[0], $aRect[1]+ $aPos[1], $aRect[2], $aRect[3]) & @CRLF)

                        $hTmp_Edit = GUICtrlCreateEdit($sTmp_Text, $aRect[0] + $aPos[0], $aRect[1] + $aPos[1], $aRect[2] - $aRect[0], $aRect[3] - $aRect[1], 0)
                        GUICtrlSetState($hTmp_Edit, $GUI_FOCUS+$GUI_SHOW+$Gui_ontop)
                        _GUICtrlEdit_SetSel(GUICtrlGetHandle($hTmp_Edit), 2, 15)
                    EndIf
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

 

Edited by Trolleule
Link to comment
Share on other sites

  • Moderators

Trolleule,

The way I do it in my GUIListViewEx UDF is to set a flag inside the handler which is detected by another function in the idle loop - that way you do not stay too long inside the handler, which can lead to all sorts of problems. Take look at the UDF code - the functions involved are _GUIListViewEx_WM_NOTIFY_Handler & _GUIListViewEx_EditOnClick.

M23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

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

×
×
  • Create New...