[已解决]ListView控件项目怎样通过键盘上下键来触发事件
本帖最后由 Darren_Lin 于 2013-4-11 21:07 编辑大家好,有一个问题请教大家。
如下窗口:
当光标在ListView的选项中时,按键盘上下键来触发读取高度选项的数据,每移动一次,读取一次,弹出msgbox窗口,显示当然高亮的项目为哪个。望大家支招解决。
找到以下函数,但不知道是否能用上。Func WM_NOTIFY($hWndGUI, $MsgID, $WParam, $LParam)
Local $tagNMHDR, $Event, $hWndFrom, $IDFrom
Local $tagNMHDR = DllStructCreate("int;int;int", $LParam)
If @error Then Return $GUI_RUNDEFMSG
$IDFrom = DllStructGetData($tagNMHDR, 2)
$Event = DllStructGetData($tagNMHDR, 3)
$tagNMHDR = 0
Switch $IDFrom;选择产生事件的控件
Case $gu_ListView1
Switch $Event; 选择产生的事件
Case $NM_CLICK ; 左击
Case $NM_DBLCLK ; 双击
Case $NM_RCLICK ; 右击
Case $LVN_HOTTRACK ;鼠标移到Listview项目上方
Case $LVN_KEYDOWN
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY上面函数Case $LV_HEYDOWN产生事件是按键被按下,请问可以指定哪个按键被键下才产生此事件吗? #include <GuiListView.au3>
$GUI = GUICreate('Test', 400, 300)
$hl = GUICtrlCreateListView('项目', 5, 5, 390, 290)
For $i = 1 To 5
GUICtrlCreateListViewItem('item' & $i, $hl)
Next
$c_index = -1
GUISetState()
Do
_Msg()
Until GUIGetMsg() = -3
Func _Msg()
$index = _GUICtrlListView_GetSelectedIndices($hl, False)
If $index <> '' And $c_index <> $index Then
ConsoleWrite($index & @CRLF)
MsgBox(0, '', _GUICtrlListView_GetItemText($hl, Number($index)), 0, $GUI)
$c_index = $index
EndIf
EndFunc Case$LVN_ITEMCHANGED 回复 2# user3000
User3000晚上好,谢谢你提供的答案,让我找到了问题解决的思路。
我有一个函数ConsoleWrite不懂,看了帮助文档也不清楚,“STDOUT 流”是什么来的。如果你有空的话,烦请你解释一下,谢谢。 回复 3# afan
版本晚上好,再请问一下,如何可以判断在Listview框中鼠标左键松开,或右键松开时的事件。
鼠标左键松开是Case ?;鼠标右键松开是Case ?。还是根本就没有这两个事件的判断,谢谢。 回复 5# Darren_Lin
一般就是使用
Case $NM_CLICK ; 左击
Case $NM_RCLICK ; 右击
不必纠结弹起消息,貌似它们都是在弹起后才触发 回复 6# afan
原来是这样,谢谢版本。 回复 4# Darren_Lin
我的"方案"是幼稚的思考方法,3楼A大的才是正解思路.
“STDOUT 流” ?可以看作计算机处理数据时即时向外输出的数据,只能当时'抓取',错过就没有了.
为什么多一个 ConsoleWrite ?因为之前我没加 Number 函数, 得不到正确结果, 就用它来检测获取的索引值.( 当然你可以用MSGBOX来作这个工作)
其实....是我忘删除了,更是我AU3功夫落下了! 回复 8# user3000
谢谢你的解答,虽然你说是幼稚的思考方法,但我觉得可以解决问题就是正确的方法,不分幼稚或不稚,因为当程序编译出来使用,使用者又不知道编写的代码是怎样的。你们都很厉害。 学习了,谢谢。 值得学习。。。。控件怎么把握才好啊。。 这个实现虽然感觉不是很正规,但很巧妙。
页:
[1]