找回密码  加入

AUTOIT CN

搜索
查看: 401|回复: 26

[AU3基础] ListView控件與Edit控件使用WM_NOTIFY呼叫選擇方式[已解決]

[复制链接]
发表于 2021-11-22 00:29:26 | 显示全部楼层 |阅读模式
本帖最后由 yohoboy 于 2021-11-24 01:59 编辑

各位好:


   近期將之前發表的源碼做優化,在工作日誌交接這作品中
   https://www.autoitx.com/thread-72366-1-1.html?_dsign=7796db39


   遇到一個問題,因源碼是參考別的範例做修改,使用上符合功能。
   但是因有一個功能要增加,怎麼試都試不出來,所以上來詢問大家怎麼處理。


   在 Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam) 這function,
  如操作ListView控件可以使用鍵盤上下鍵,鼠標左擊及右擊選單呼叫操作正常。
  但是如果想要增加Edit控件(或Input控件)增加鼠標右鍵雙擊呼叫Function(如新增窗口控件等)
  依$hWhd及$ilParam回傳訊息,怎麼都無法讓Edit控件選擇,並增加鼠標功能。
  像下面範例
   Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam) ;滑鼠鍵盤點擊事件
        Local $tNMHDR, $hWndFrom, $iCode, $hWndListView, $hWndContent
        If Not IsHWnd($GUI_ListView) Then

                                ListFunc()
        endif
       If Not IsHWnd($GUI_Edit) Then
                               editfunc()
       endif
    endfunc
或是
    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
       Switch $hWnd
                Case $gui_ListView
                        listview1func()
                Case $gui_Edit
                        Editfunc90
       endswitch
    endfunc
等等版上相關範例源碼測過,無法符合需求。
因此如何讓edit控件加上鼠標右鍵雙擊?
懇請提供一些思路,謝謝回覆。


发表于 2021-11-22 08:24:33 | 显示全部楼层
看不懂问题。。。
发表于 2021-11-22 08:43:05 | 显示全部楼层
是点击栏目原地编辑?还是点击栏目打开Edit控件窗口?
发表于 2021-11-22 11:12:45 | 显示全部楼层
haijie1223 发表于 2021-11-22 08:24
看不懂问题。。。

+1...
问题应精简
发表于 2021-11-22 12:02:32 | 显示全部楼层
如果是说要 edit 控件响应鼠标右键消息的话,那不是在 WM_NOTIFY 中处理的,edit 等控件都不会有该消息。简单的可以直接在 $GUI_EVENT_SECONDARYDOWN 消息中处理即可。
发表于 2021-11-22 13:14:19 | 显示全部楼层
接LZ上一贴,我猜LZ是想点击GUICtrlCreateListView列表某列某行条目,读取SQL数据库相对的数据显示在edit控件窗口
发表于 2021-11-22 13:56:29 | 显示全部楼层
chzj589 发表于 2021-11-22 13:14
接LZ上一贴,我猜LZ是想点击GUICtrlCreateListView列表某列某行条目,读取SQL数据库相对的数据显示在edit控 ...

肯定不是,那个太简单。
精简他的提问,“在 WM_NOTIFY 中处理 Edit 控件右键双击”。
发表于 2021-11-22 15:47:44 | 显示全部楼层
本帖最后由 tubaba 于 2021-11-22 16:01 编辑

注册WM_COMMAND消息
又想了一下,虽然EDIT控件是在WM_COMMAND中处理,但是响应右键双击这种操作恐怕不行.EDIT右键菜单是由系统接管的,而点击右键会弹出系统菜单

看了半天,没明白楼主的意思...上面的话当我没说...
 楼主| 发表于 2021-11-23 01:01:29 | 显示全部楼层
抱歉,應該是上個圖比較清晰,感謝各位回覆,目前已知右鍵連點兩次Edit控件呼叫Function()是不可行的,那如果改為左鍵連點呼叫function()呢?
請看圖說明。

本帖子中包含更多资源

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

x
发表于 2021-11-23 10:37:17 | 显示全部楼层
yohoboy 发表于 2021-11-23 01:01
抱歉,應該是上個圖比較清晰,感謝各位回覆,目前已知右鍵連點兩次Edit控件呼叫Function()是不可行的,那如 ...

意思是在某个edit控件上右键双击调用某个函数是吧。
发表于 2021-11-23 11:53:18 | 显示全部楼层
如上5#所说,如果是右键点击,在 $GUI_EVENT_SECONDARYDOWN 消息中处理。现在换成左键点击,就在 $GUI_EVENT_PRIMARYDOWN 中处理。
不要在 WM_NOTIFY 中处理,不会有该消息;也不要在 WM_COMMAND 中处理,该消息不会传递点击消息。

可以肯定的是,不管是在Edit右键双击还是左键双击,都可以实现(只不过右键双击稍麻烦一点,因为要判断是否是单击时放行弹出右键菜单)。
提供个思路:点击时记录时间戳,再计算与上次点击的时间间隔是否<=250ms(该值或可读取系统设置),即为双击。
发表于 2021-11-23 13:17:29 | 显示全部楼层
afan 发表于 2021-11-23 11:53
如上5#所说,如果是右键点击,在 $GUI_EVENT_SECONDARYDOWN 消息中处理。现在换成左键点击,就在 $GUI_EVEN ...

用WM_COMMAND,是不会传递点击消息。但可用ENTER鍵操作。多了一步。
发表于 2021-11-23 17:18:28 | 显示全部楼层
afan 发表于 2021-11-23 11:53
如上5#所说,如果是右键点击,在 $GUI_EVENT_SECONDARYDOWN 消息中处理。现在换成左键点击,就在 $GUI_EVEN ...

折腾了一下,"WM_COMMAND"也可以,

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
#include <GUIConstants.au3>
#include <EditConstants.au3>
Opt("GUIOnEventMode", 1)
Global $Form1, $Edit1, $ZEdit1, $TEMP, $TEMP1, $Input1;, $AInput1, $Pic, $FormS3
$TEMP = "编辑框控件Edit1"
$xtkjn = "关于" & $TEMP & @CRLF _
                 & "此功能目前仅支持Access2007版本的数据库!" & @CRLF _
                 & "请谨慎使用本功能!本程序会自动备份数据库" & @CRLF _
                 & "因使用本功能造成的损失由使用者自行承担," & @CRLF _
                 & "作者不承担任何责任." & @CRLF _
                 & "欢迎大家一起研究其他的版本的密码查看方法" & @CRLF
$TEMP1 = "编辑框控件 ZEdit1"
$xtkjn1 = "关于" & $TEMP1 & @CRLF _
                 & "此功能目前仅支持Access2007版本的数据库!" & @CRLF _
                 & "请谨慎使用本功能!本程序会自动备份数据库" & @CRLF
Example()
While 1
        Sleep(100)
WEnd
Func _Exit()
        GUIDelete()
        Exit
EndFunc   ;==>_Exit
Func btnMinClick()
        WinSetState($Form1, "", @SW_MINIMIZE)
EndFunc   ;==>btnMinClick
Func Example()
        $Form1 = GUICreate("编辑框控件", 540, 490, -1, -1)
        GUISetBkColor(0x007180)
        GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
        $Edit1 = GUICtrlCreateEdit("", 8, 40, 525, 210, BitOR($ES_WANTRETURN, $ES_AUTOVSCROLL, $WS_VSCROLL, $ES_MULTILINE))
        GUICtrlSetFont(-1, 11, 400, 0, 'Arial')
        GUICtrlSetColor(-1, 0xFF00007F)
        GUICtrlSetBkColor(-1, 0xEEE9D8)
        GUICtrlSetLimit(-1, 999999999);设置控件的字符或象素数量限制
        $ZEdit1 = GUICtrlCreateEdit("", 10, 260, 525, 220, BitOR($ES_WANTRETURN, $ES_AUTOVSCROLL, $WS_VSCROLL, $ES_MULTILINE))
        GUICtrlSetBkColor(-1, 0xEEE9D1)
        GUICtrlSetFont($ZEdit1, 12, 400, 0, "微软雅黑")
        $Input1 = GUICtrlCreateInput('AAAAAA', 8, 10, 350, 20)
        GUICtrlSetColor(-1, 0x990000)
        GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
        GUISetState(@SW_SHOW, $Form1)
        GUICtrlSetData($Edit1, $xtkjn)
        GUICtrlSetData($ZEdit1, $xtkjn1)
EndFunc   ;==>Example
Func WM_COMMAND($hWndGUI, $MsgID, $wParam, $lParam)
        #forceref $hWndGUI, $MsgID
        Local $hWndFrom, $iIDFrom, $iCode
        $hWndFrom = $lParam
        $iIDFrom = BitAND($wParam, 0xFFFF)
        $iCode = BitShift($wParam, 16)
        Switch $iIDFrom
                Case $Input1
                        If GUICtrlRead($Input1) = "" Then
                        Else
                                If BitShift($wParam, 16) = 0x100 Then MsgBox(0, "提示Input1", GUICtrlRead($Input1))
                        EndIf
                Case $Edit1
                        If GUICtrlRead($Edit1) = "" Then
                        Else
                                If BitShift($wParam, 16) = 0x100 Then MsgBox(0, "提示Edit1", GUICtrlRead($Edit1))
                        EndIf
                Case $ZEdit1
                        If GUICtrlRead($ZEdit1) = "" Then
                        Else
                                If BitShift($wParam, 16) = 0x100 Then MsgBox(0, "提示ZEdit1", GUICtrlRead($ZEdit1))
                        EndIf
        EndSwitch
        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND


发表于 2021-11-23 17:40:44 | 显示全部楼层
chzj589 发表于 2021-11-23 17:18
折腾了一下,"WM_COMMAND"也可以,

不必折腾,WM_COMMAND 是不会有 Edit 控件的点击消息的,不要被它失焦的消息误导了。
发表于 2021-11-23 20:47:40 | 显示全部楼层
个人比较喜欢windows消息模式


复制代码
  1. #include <WinAPIConstants.au3>
  2. #include <WinAPI.au3>
  3. #include <EditConstants.au3>
  4. #include <GUIConstantsEx.au3>
  5. #include <WindowsConstants.au3>
  6. #Region ### START Koda GUI section ### Form=
  7. $Form1 = GUICreate("Form1", 615, 437, -1, -1)
  8. $Edit1 = GUICtrlCreateEdit("", 120, 112, 345, 121)
  9. Global $hEdit1_CallBack = DllCallbackRegister("Edit_CallBackFunc", "int", "hWnd;uint;wparam;lparam")
  10. Global $pEdit1_CallBack = DllCallbackGetPtr($hEdit1_CallBack)
  11. Global $hOEdit1_CallBack = _WinAPI_SetWindowLong(GUICtrlGetHandle($Edit1), $GWL_WNDPROC, $pEdit1_CallBack)

  12. $Form2 = GUICreate("Form2", 615, 437, 627, 422)
  13. $Edit2 = GUICtrlCreateEdit("", 120, 112, 345, 121)


  14. GUISetState(@SW_SHOW, $Form1)
  15. #EndRegion ### END Koda GUI section ###

  16. While 1
  17.         $nMsg = GUIGetMsg(1)
  18.         Switch $nMsg[0]
  19.                 Case $GUI_EVENT_CLOSE
  20.                         Switch $nMsg[1]
  21.                                 Case $Form1
  22.                                         Exit
  23.                                 Case $Form2
  24.                                         GUISetState(@SW_HIDE, $Form2)
  25.                                         GUICtrlSetData($Edit1, GUICtrlRead($Edit2))
  26.                         EndSwitch

  27.         EndSwitch
  28. WEnd


  29. Func Edit_CallBackFunc($hWnd, $iMsg, $wParam, $lParam)
  30.         Switch $iMsg
  31.                 Case $WM_LBUTTONDBLCLK
  32.                         GUISetState(@SW_SHOW, $Form2)

  33.         EndSwitch
  34.         Return _WinAPI_CallWindowProc($hOEdit1_CallBack, $hWnd, $iMsg, $wParam, $lParam)
  35. EndFunc   ;==>Edit_CallBackFunc
复制代码

您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2021-12-5 10:23 , Processed in 1.343750 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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