找回密码
 加入
搜索
查看: 3800|回复: 11

[AU3基础] [已解决]关于$NM_RETURN

  [复制链接]
发表于 2011-8-5 02:55:16 | 显示全部楼层 |阅读模式
本帖最后由 king8462 于 2011-8-13 17:49 编辑

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




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2011-8-5 12:17:44 | 显示全部楼层
好像没说明白?为何非得要使用$NM_RETURN?

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

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

可以说明白些吗?
 楼主| 发表于 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[0]-1
                         ;MsgBox(0,"",$array[$i])
                                                 
                                                 GUICtrlSetData ( $Input1, $array[1])
                        
                         GUICtrlSetData ( $Input2, $array[2])
                          
                                                 ; Next                
                                                                
                        EndIf
        EndSwitch
        $tNMTV = 0
EndFunc   ;==>WM_NOTIFY

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2011-8-6 13:36:31 | 显示全部楼层
好像没说明白?为何非得要使用$NM_RETURN?

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

再 ...
powerofos 发表于 2011-8-5 12:17



   
$LVN_KEYDOWN获取的数据是上一行的数据!
发表于 2011-8-6 14:01:57 | 显示全部楼层
$LVN_KEYDOWN获取的数据是上一行的数据!
king8462 发表于 2011-8-6 13:36


兄弟,$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
发表于 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

评分

参与人数 1贡献 +5 收起 理由
powerofos + 5 乐于助人且代码教完整...

查看全部评分

发表于 2011-8-6 14:48:45 | 显示全部楼层
本帖最后由 powerofos 于 2011-8-6 14:51 编辑
3mile 发表于 2011-8-6 14:22



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

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

我都是猜的,楼主是想ENTER键逐行读取列表??还是只是ENTER键返回“高亮/已选”的ITEM数据?
 楼主| 发表于 2011-8-6 16:59:40 | 显示全部楼层
本帖最后由 king8462 于 2011-8-6 17:55 编辑
佩服,要不不上,上的话就是比较完整的代码,呵呵,我是没这个耐心...

说实话,看到楼主的跟帖回复 ...
powerofos 发表于 2011-8-6 14:48


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

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

本人是菜鸟,麻烦楼上修改下我的代码,谢谢!
 楼主| 发表于 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[0]-1
                ;MsgBox(0,"",$array[$i])

                GUICtrlSetData($Input1, $array[1])

                GUICtrlSetData($Input2, $array[2])

                ;  Next
        EndIf

        ;GUICtrlSetData($status1, 'Current selected: ' & $cur_sel & ' Total selected: ' & $count_sel & ' Total items: ' & $count)
EndFunc   ;==>OnStateChange
发表于 2011-8-7 02:27:05 | 显示全部楼层
回复 9# king8462


恭喜楼主解决问题。

看了下你发的代码,单从运行效果上来看,并不需要3mile提供的代码,用牛刀杀鸡的感觉。
 楼主| 发表于 2011-8-7 17:27:22 | 显示全部楼层
回复  king8462


恭喜楼主解决问题。

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


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

有更简单的代码吗?希望提供下。
发表于 2011-8-7 17:40:56 | 显示全部楼层
回复 11# king8462


看帮助里的:_GUICtrlListView_HitTest()

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

单单从你修改后的脚本,我看不来你想要什么效果,你姑且去看看吧。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-26 20:46 , Processed in 0.082047 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表