Darren_Lin 发表于 2013-4-10 20:35:03

[已解决]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产生事件是按键被按下,请问可以指定哪个按键被键下才产生此事件吗?

user3000 发表于 2013-4-10 21:28:21

#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

afan 发表于 2013-4-10 21:39:03

Case$LVN_ITEMCHANGED

Darren_Lin 发表于 2013-4-10 21:56:19

回复 2# user3000


    User3000晚上好,谢谢你提供的答案,让我找到了问题解决的思路。
我有一个函数ConsoleWrite不懂,看了帮助文档也不清楚,“STDOUT 流”是什么来的。如果你有空的话,烦请你解释一下,谢谢。

Darren_Lin 发表于 2013-4-10 22:01:51

回复 3# afan


    版本晚上好,再请问一下,如何可以判断在Listview框中鼠标左键松开,或右键松开时的事件。
   鼠标左键松开是Case ?;鼠标右键松开是Case ?。还是根本就没有这两个事件的判断,谢谢。

afan 发表于 2013-4-10 22:12:45

回复 5# Darren_Lin


    一般就是使用
Case $NM_CLICK ; 左击
Case $NM_RCLICK ; 右击
不必纠结弹起消息,貌似它们都是在弹起后才触发

Darren_Lin 发表于 2013-4-10 22:49:25

回复 6# afan


    原来是这样,谢谢版本。

user3000 发表于 2013-4-11 06:25:54

回复 4# Darren_Lin

我的"方案"是幼稚的思考方法,3楼A大的才是正解思路.

“STDOUT 流” ?可以看作计算机处理数据时即时向外输出的数据,只能当时'抓取',错过就没有了.

为什么多一个 ConsoleWrite ?因为之前我没加 Number 函数, 得不到正确结果, 就用它来检测获取的索引值.( 当然你可以用MSGBOX来作这个工作)
其实....是我忘删除了,更是我AU3功夫落下了!

Darren_Lin 发表于 2013-4-11 07:04:14

回复 8# user3000


    谢谢你的解答,虽然你说是幼稚的思考方法,但我觉得可以解决问题就是正确的方法,不分幼稚或不稚,因为当程序编译出来使用,使用者又不知道编写的代码是怎样的。你们都很厉害。

r200802 发表于 2013-4-15 17:39:06

学习了,谢谢。

qingrengqq 发表于 2013-4-27 20:59:49

值得学习。。。。控件怎么把握才好啊。。

damoo 发表于 2014-4-6 17:56:31

这个实现虽然感觉不是很正规,但很巧妙。
页: [1]
查看完整版本: [已解决]ListView控件项目怎样通过键盘上下键来触发事件