#include <GuiListView.au3>
#include <GuiComboBox.au3>
#include <WinAPI.au3>
Global $hGUI, $g_ListView, $g_Combo, $g_Item, $hOldC
Global $g_bComboVisible = False ; 添加组合框可见状态跟踪
Opt("GUIOnEventMode", 1)
_CreateGUI()
While 1
Sleep(100)
WEnd
Func _CreateGUI()
$hGUI = GUICreate("ListViewClass", 600, 300, -1, -1)
GUISetOnEvent(-3, "_Exit")
$g_Combo = GUICtrlCreateCombo('', -100, -100)
GUICtrlSetFont(-1,11)
$g_ListView = GUICtrlCreateListView("", 60, 50, 480, 200, -1, 0x00000221)
For $i = 1 To 5
_GUICtrlListView_AddColumn(-1, "col1", 80)
Next
For $i = 0 To 9
_GUICtrlListView_AddItem($g_ListView, "Item" & $i)
For $j = 1 To 4
_GUICtrlListView_AddSubItem($g_ListView, $i, "SubItem" & $j, $j)
Next
Next
$hCall = DllCallbackRegister("_ListViewProc", "ptr", "hWnd;uint;wparam;lparam")
$hOldC = _WinAPI_SetWindowLong(GUICtrlGetHandle($g_ListView), -4, DllCallbackGetPtr($hCall))
GUISetState(@SW_SHOW)
EndFunc ;==>_CreateGUI
Func _Exit()
Exit
EndFunc ;==>_Exit
Func _ListViewProc($hWnd, $iMsg, $wparam, $lparam)
Switch $iMsg
Case 0x0203 ; WM_LBUTTONDBLCLK
$iX = BitAND($lparam, 0xFFFF)
$iY = BitShift($lparam, 16)
$tLVHITTESTINFO = DllStructCreate("int X;int Y;uint Flags;int Item;int SubItem")
DllStructSetData($tLVHITTESTINFO, "X", $iX)
DllStructSetData($tLVHITTESTINFO, "Y", $iY)
_SendMessage($hWnd, $LVM_SUBITEMHITTEST, 0, DllStructGetPtr($tLVHITTESTINFO))
Dim $g_Item[2]
$g_Item[0] = DllStructGetData($tLVHITTESTINFO, "Item")
$g_Item[1] = DllStructGetData($tLVHITTESTINFO, "SubItem")
$aRect = _GUICtrlListView_GetSubItemRect($g_ListView, $g_Item[0], $g_Item[1])
$aPos = ControlGetPos($hGUI, "", $g_ListView)
$sData = _GUICtrlListView_GetItemText($g_ListView, $g_Item[0], $g_Item[1])
_WinAPI_SetParent(GUICtrlGetHandle($g_Combo), $g_ListView)
_WinAPI_BringWindowToTop(GUICtrlGetHandle($g_Combo))
GUICtrlSetPos($g_Combo, $aPos[0] + $aRect[0] +5, $aPos[1] + $aRect[1] + 3, _GUICtrlListView_GetColumnWidth($g_ListView, $g_Item[1]))
GUICtrlSetData($g_Combo,"")
_GUICtrlComboBox_AddString($g_Combo,"添加")
_GUICtrlComboBox_SetEditText($g_Combo, $sData)
$g_bComboVisible = True ; 标记组合框可见
Case 0x0201 ; WM_LBUTTONDOWN
If $g_bComboVisible Then
; 检查点击位置是否在组合框内
Local $hCombo = GUICtrlGetHandle($g_Combo)
Local $aComboPos = WinGetPos($hCombo)
Local $tPoint = DllStructCreate("int X;int Y")
DllStructSetData($tPoint, "X", BitAND($lparam, 0xFFFF))
DllStructSetData($tPoint, "Y", BitShift($lparam, 16))
_WinAPI_ClientToScreen($hWnd, $tPoint)
Local $iX = DllStructGetData($tPoint, "X")
Local $iY = DllStructGetData($tPoint, "Y")
If $iX < $aComboPos[0] Or $iX > $aComboPos[0] + $aComboPos[2] Or _
$iY < $aComboPos[1] Or $iY > $aComboPos[1] + $aComboPos[3] Then
_UdpData()
EndIf
EndIf
Case 0x0100 ; WM_KEYDOWN - 添加键盘支持
If $g_bComboVisible And $wParam = 0x0D Then ; 回车键
_UdpData()
EndIf
EndSwitch
Return _WinAPI_CallWindowProc($hOldC, $hWnd, $iMsg, $wparam, $lparam)
EndFunc ;==>_ListViewProc
Func _UdpData()
If Not IsArray($g_Item) Then Return
_GUICtrlListView_SetItemText($g_ListView, $g_Item[0], GUICtrlRead($g_Combo), $g_Item[1])
GUICtrlSetPos($g_Combo, -1000, -100)
GUICtrlSetData($g_Combo, "")
Dim $g_Item = 0
$g_bComboVisible = False ; 重置组合框可见状态
EndFunc ;==>_UdpData