king8462 发表于 2011-8-5 02:55:16

[已解决]关于$NM_RETURN

本帖最后由 king8462 于 2011-8-13 17:49 编辑

想通过键盘按回车键选择listview中的某行并返回结果,搜索了论坛,好多是关于鼠标点击的WM_NOTIFY。求高人给个$NM_RETURN 的使用方法!




powerofos 发表于 2011-8-5 12:17:44

好像没说明白?为何非得要使用$NM_RETURN?

使用NM_NOTIFY-$LVN_KEYDOWN 不合你要求? 原因?

再者,NM_NOTIFY方式外,还可以为LISTVIEW注册DllCallbackRegister实现?

可以说明白些吗?

king8462 发表于 2011-8-6 13:31:25

本帖最后由 king8462 于 2011-8-6 13:33 编辑

想实现如下功能:
#include <GuiListView.au3>
#include <WindowsConstants.au3>

GUICreate('', 400, 300)
$ListView1 = GUICtrlCreateListView('1|2', 5, 5, 390, 232)
$Input1 = GUICtrlCreateInput("Input1", 24, 252, 121, 21)
$Input2 = GUICtrlCreateInput("Input2", 168, 252, 89, 21)
_GUICtrlListView_SetColumnWidth($ListView1, 0, 180)

For $i = 1 To 10
      GUICtrlCreateListViewItem('项目 - ' & $i&"|"& $i+1, $ListView1)
Next
GUISetState()
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

Do
Until GUIGetMsg() = -3

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
      $tNMTV = DllStructCreate($tagNMTVDISPINFO, $ilParam)
      $iCode = DllStructGetData($tNMTV, "Code")
      $iIndex = GUICtrlRead($ListView1)
      Switch $iCode
                Case $LVN_KEYDOWN
                        If ($iIndex) Then
                              $ItemText = GUICtrlRead($iIndex)
                              ;MsgBox(0, '项目文本:', $ItemText)
                                                $array = StringSplit($ItemText, '|', 1)
                        ; For $i= 1 To $array-1
                         ;MsgBox(0,"",$array[$i])
                                               
                                               GUICtrlSetData ( $Input1, $array)
                       
                         GUICtrlSetData ( $Input2, $array)
                        
                                               ; Next               
                                                               
                        EndIf
      EndSwitch
      $tNMTV = 0
EndFunc   ;==>WM_NOTIFY

king8462 发表于 2011-8-6 13:36:31

好像没说明白?为何非得要使用$NM_RETURN?

使用NM_NOTIFY-$LVN_KEYDOWN 不合你要求? 原因?

再 ...
powerofos 发表于 2011-8-5 12:17 http://www.autoitx.com/images/common/back.gif


   
$LVN_KEYDOWN获取的数据是上一行的数据!

powerofos 发表于 2011-8-6 14:01:57

$LVN_KEYDOWN获取的数据是上一行的数据!
king8462 发表于 2011-8-6 13:36 http://www.autoitx.com/images/common/back.gif

兄弟,$LVN_KEYDOWN 用错了吧?
既然你获取KEYDOWN消息,得再指定是哪个键吧?

我猜,你是想按ENTER键,读取item的值,然后显示在INPUT1, INPUT2中,
再按ENTER键,读取次行,以此类推吧?

如果我猜对了,那实现这个不难吧?Switch $iCode
                                Case $LVN_KEYDOWN
                                        Local $tINFO = DllStructCreate($tagNMLVKEYDOWN,$ilParam)
                                        MsgBox(0,"",DllStructGetData($tINFO,"VKey"))
                                        Switch DllStructGetData($tINFO,"VKey")
                                                Case 65 ;A                                               
                                        EndSwitch       
                        EndSwitch

3mile 发表于 2011-8-6 14:22:00

#NoTrayIcon
#include <GUIConstants.au3>
#include <GUIListView.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("Test", 500, 200)
$ListView1 = GUICtrlCreateListView("A|B|C", 5, 5, 480, 175, BitOR($LVS_REPORT,$LVS_SINGLESEL,$LVS_SHOWSELALWAYS,$LVS_NOLABELWRAP,$WS_HSCROLL,$WS_VSCROLL,$WS_BORDER), BitOR($WS_EX_CLIENTEDGE,$LVS_EX_CHECKBOXES,$LVS_EX_FULLROWSELECT))
GUICtrlCreateListViewItem('r1c1|r1c2|r1c3', $ListView1)
GUICtrlCreateListViewItem('r2c1|r2c2|r2c3', $ListView1)
GUICtrlCreateListViewItem('r3c1|r3c2|r3c3', $ListView1)
$status1 = GUICtrlCreateLabel("", 0, 183, 500, 17, $WS_GROUP, $WS_EX_CLIENTEDGE)
GUISetState(@SW_SHOW)

GUIRegisterMsg($WM_NOTIFY, "WM_Notify_Events")

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
   Case $GUI_EVENT_CLOSE
       Exit
EndSwitch
WEnd

Func WM_Notify_Events($hWndGUI, $MsgID, $wParam, $lParam)
#forceref $hWndGUI, $MsgID, $wParam
Local $NMHDR, $NMLVDISPINFO, $NMLISTVIEW, $event

$NMHDR = DllStructCreate($tagNMHDR, $lParam)
$event = DllStructGetData($NMHDR, 'Code')

If $hWndGUI = $Form1 And $wParam = $ListView1 Then
   Select
       Case $LVN_ITEMCHANGED
         $NMLISTVIEW = DllStructCreate($tagNMLISTVIEW, $lParam)
         If BitAND(DllStructGetData($NMLISTVIEW, "Changed"), $LVIF_STATE) = $LVIF_STATE And _
               DllStructGetData($NMLISTVIEW, "NewState") <> DllStructGetData($NMLISTVIEW, "OldState") Then OnStateChange()
   EndSelect
EndIf
Return $GUI_RUNDEFMSG
EndFunc

Func OnStateChange()
$cur_sel = _GUICtrlListView_GetNextItem($ListView1) ; current selected
$count_sel = _GUICtrlListView_GetSelectedCount($ListView1)
$count = _GUICtrlListView_GetItemCount($ListView1)

GUICtrlSetData($status1, 'Current selected: ' & $cur_sel & ' Total selected: ' & $count_sel & ' Total items: ' & $count)
EndFunc

powerofos 发表于 2011-8-6 14:48:45

本帖最后由 powerofos 于 2011-8-6 14:51 编辑


3mile 发表于 2011-8-6 14:22 http://www.autoitx.com/images/common/back.gif


佩服,要不不上,上的话就是比较完整的代码,呵呵,我是没这个耐心...

说实话,看到楼主的跟帖回复后,说白了,我还是没弄懂楼主究竟要想实现些什么??

我都是猜的,楼主是想ENTER键逐行读取列表??还是只是ENTER键返回“高亮/已选”的ITEM数据?

king8462 发表于 2011-8-6 16:59:40

本帖最后由 king8462 于 2011-8-6 17:55 编辑

佩服,要不不上,上的话就是比较完整的代码,呵呵,我是没这个耐心...

说实话,看到楼主的跟帖回复 ...
powerofos 发表于 2011-8-6 14:48 http://www.autoitx.com/images/common/back.gif

抱歉,一直没说明白,是需要按

ENTER键返回“高亮/已选”的ITEM数据!

本人是菜鸟,麻烦楼上修改下我的代码,谢谢!

king8462 发表于 2011-8-6 21:12:18

本帖最后由 king8462 于 2011-8-6 21:20 编辑

自己修改了下,基本实现了需求!
再次感谢楼上2位的帮助!#NoTrayIcon
#include <GUIConstants.au3>
#include <GUIListView.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 623, 444, 298, 128)
$ListView1 = GUICtrlCreateListView("1               |2", 24, 24, 505, 281, BitOR($GUI_SS_DEFAULT_LISTVIEW, $LVS_NOLABELWRAP, $WS_HSCROLL, $WS_VSCROLL, $WS_BORDER), BitOR($WS_EX_CLIENTEDGE, $LVS_EX_CHECKBOXES, $LVS_EX_FULLROWSELECT))
$Input1 = GUICtrlCreateInput("Input1", 56, 352, 153, 21)
$Input2 = GUICtrlCreateInput("Input2", 272, 352, 161, 21)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

For $i = 1 To 3
GUICtrlCreateListViewItem('项目 - ' & $i & "|" & $i + 1, $ListView1)
GUISetState()
Next
GUIRegisterMsg($WM_NOTIFY, "WM_Notify_Events")
While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
        EndSwitch
WEnd
Func WM_Notify_Events($hWndGUI, $MsgID, $wParam, $lParam)
        #forceref $hWndGUI, $MsgID, $wParam
        Local $NMHDR, $NMLVDISPINFO, $NMLISTVIEW, $event

        $NMHDR = DllStructCreate($tagNMHDR, $lParam)
        $event = DllStructGetData($NMHDR, 'Code')

        If $hWndGUI = $Form1 And $wParam = $ListView1 Then
                Select
                        Case $LVN_ITEMCHANGED
                                $NMLISTVIEW = DllStructCreate($tagNMLISTVIEW, $lParam)
                                If BitAND(DllStructGetData($NMLISTVIEW, "Changed"), $LVIF_STATE) = $LVIF_STATE And _
                                                DllStructGetData($NMLISTVIEW, "NewState") <> DllStructGetData($NMLISTVIEW, "OldState") Then OnStateChange()
                EndSelect
        EndIf
        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_Notify_Events

Func OnStateChange()
        $cur_sel = _GUICtrlListView_GetNextItem($ListView1) ; current selected
        $count_sel = _GUICtrlListView_GetSelectedCount($ListView1)
        $count = _GUICtrlListView_GetItemCount($ListView1)
        $iIndex = GUICtrlRead($ListView1)
        ;$ItemText = GUICtrlRead($iIndex)
        If ($iIndex) Then
                $ItemText = GUICtrlRead($iIndex)
                ; MsgBox(0, '项目文本:', $ItemText)
                $array = StringSplit($ItemText, '|', 1)
                ;For $i= 1 To $array-1
                ;MsgBox(0,"",$array[$i])

                GUICtrlSetData($Input1, $array)

                GUICtrlSetData($Input2, $array)

                ;Next
        EndIf

        ;GUICtrlSetData($status1, 'Current selected: ' & $cur_sel & ' Total selected: ' & $count_sel & ' Total items: ' & $count)
EndFunc   ;==>OnStateChange

powerofos 发表于 2011-8-7 02:27:05

回复 9# king8462


恭喜楼主解决问题。

看了下你发的代码,单从运行效果上来看,并不需要3mile提供的代码,用牛刀杀鸡的感觉。

king8462 发表于 2011-8-7 17:27:22

回复king8462


恭喜楼主解决问题。

看了下你发的代码,单从运行效果上来看,并不需要3mile提供的 ...
powerofos 发表于 2011-8-7 02:27 http://www.autoitx.com/images/common/back.gif

自己不会写,所以照着修改了一下!

有更简单的代码吗?希望提供下。

powerofos 发表于 2011-8-7 17:40:56

回复 11# king8462


看帮助里的:_GUICtrlListView_HitTest()

其实就是是NOTIFY里的单击消息而已。

单单从你修改后的脚本,我看不来你想要什么效果,你姑且去看看吧。
页: [1]
查看完整版本: [已解决]关于$NM_RETURN