netegg Posted June 16, 2010 Share Posted June 16, 2010 (edited) I've made out a listview with the checkbox in subitem, but i don't know why the subitem has a block grey color on the right side in the subitem, could anybody tell me? expandcollapse popup#include <GuiConstantsEx.au3> #include <GuiListView.au3> #include <GuiImageList.au3> #include <WindowsConstants.au3> #include <GuiButton.au3> #include <GuiEdit.au3> Opt('MustDeclareVars', 1) $Debug_LV = False Global $hListView, $hButton[100], $hGUI,$hDC,$hBrush _Main() Func _Main() $hGUI = GUICreate("(UDF Created) ListView Create", 400, 300) $hListView = _GUICtrlListView_Create($hGUI, "", 2, 2, 394, 268, $LVS_EX_GRIDLINES) GUISetState() GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") ; Add columns _GUICtrlListView_InsertColumn($hListView, 0, "Column 1", 100) _GUICtrlListView_InsertColumn($hListView, 1, "Column 2", 112) _GUICtrlListView_InsertColumn($hListView, 2, "Column 3", 100) ; Add items _GUICtrlListView_AddItem($hListView, "Row 1: Col 1", 0) _GUICtrlListView_AddItem($hListView, "Row 2: Col 1", 1) _GUICtrlListView_AddItem($hListView, "Row 3: Col 1", 2) _GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 2", 1) _GUICtrlListView_AddSubItem($hListView, 1, "Row 2: Col 2", 1) _GUICtrlListView_AddSubItem($hListView, 2, "Row 3: Col 2", 1) For $i = 0 To _GUICtrlListView_GetItemCount($hListView) - 1 _initedit($i, 1) Next ; Loop until user exits Do Until GUIGetMsg() = $GUI_EVENT_CLOSE GUIDelete() EndFunc ;==>_Main Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam) #forceref $hWnd, $iMsg, $iwParam Local $hWndFrom, $iCode, $tNMHDR, $hWndListView, $tInfo, $Index $hWndListView = $hListView If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView) $tNMHDR = DllStructCreate($tagNMHDR, $ilParam) $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom")) $iCode = DllStructGetData($tNMHDR, "Code") Switch $hWndFrom Case $hWndListView Switch $iCode Case $NM_CLICK $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam) $Index = DllStructGetData($tInfo, "Index") If _GUICtrlButton_GetCheck($hButton[$Index]) Then _GUICtrlButton_SetCheck($hButton[$Index], $BST_UNCHECKED) Else _GUICtrlButton_SetCheck($hButton[$Index]) EndIf ConsoleWrite(_GUICtrlButton_GetState($hButton[$Index]) & @CRLF) EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_NOTIFY Func _initedit($item, $subitem) Local $iSubItemText = _GUICtrlListView_GetItemText($hListView, $item, $subitem) Local $aRect = _GUICtrlListView_GetSubItemRect($hListView, $item, $subitem) $hButton[$item] = _GUICtrlButton_Create($hGUI, '', $aRect[0], $aRect[1], 16, 17, $BS_AUTOCHECKBOX + $bs_flat) Local $hEdit =_GUICtrlEdit_Create($hGUI, $iSubItemText, $aRect[0] + 16, $aRect[1], 100, 17) $hDC = _WinAPI_GetWindowDC($hEdit) $hBrush = _WinAPI_CreateSolidBrush(0x0000FF) FrameRect($hDC, $aRect[0] + 16, $aRect[1], 100, 17, $hBrush) EndFunc ;==>_initedit Func FrameRect($hDC, $nLeft, $nTop, $nRight, $nBottom, $hBrush) Local $stRect = DllStructCreate("int;int;int;int") DllStructSetData($stRect, 1, $nLeft) DllStructSetData($stRect, 2, $nTop) DllStructSetData($stRect, 3, $nRight) DllStructSetData($stRect, 4, $nBottom) DllCall("user32.dll", "int", "FrameRect", "hwnd", $hDC, "ptr", DllStructGetPtr($stRect), "hwnd", $hBrush) EndFunc ;==>FrameRect Edited June 16, 2010 by netegg Link to comment Share on other sites More sharing options...
PsaltyDS Posted June 16, 2010 Share Posted June 16, 2010 It's the bizarre button you put there with _GuiCtrlButton_Create() inside the equally bizarre _initedit() function.Why you put there is anybody's guess.BTW, your WM_NOTIFY function crashes if you click on any column other than the first, because $Index = -1. See MSDN: NM_CLICK (List View) Notification: RemarksThe iItem member of lParam is only valid if the icon or first-column label has been clicked. To determine which item is selected when a click takes place elsewhere in a row, send an LVM_SUBITEMHITTEST message. Valuater's AutoIt 1-2-3, Class... Is now in Session!For those who want somebody to write the script for them: RentACoder"Any technology distinguishable from magic is insufficiently advanced." -- Geek's corollary to Clarke's law Link to comment Share on other sites More sharing options...
netegg Posted June 19, 2010 Author Share Posted June 19, 2010 It's the bizarre button you put there with _GuiCtrlButton_Create() inside the equally bizarre _initedit() function.Why you put there is anybody's guess.BTW, your WM_NOTIFY function crashes if you click on any column other than the first, because $Index = -1. See MSDN: NM_CLICK (List View) Notification: Hi, thx. But how should I do? I've had no mind! Link to comment Share on other sites More sharing options...
PsaltyDS Posted June 19, 2010 Share Posted June 19, 2010 It looks like you copy/pasted this from somewhere else with no idea how any of it works. That makes it hard to figure out how much you need to know. 1. If you didn't need the button there for some reason, just delete it from the script. 2. Test $Index to see if it's < 0, and if so either ignore it (requiring the user to click either the first column or icon), or send LVM_SUBITEMHITTEST to find out which item it was. What matters is not using $Index when it's invalid, i.e. for $hButton[$Index]. Valuater's AutoIt 1-2-3, Class... Is now in Session!For those who want somebody to write the script for them: RentACoder"Any technology distinguishable from magic is insufficiently advanced." -- Geek's corollary to Clarke's law 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