yohoboy 发表于 2021-11-22 00:29:26

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

本帖最后由 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控件加上鼠標右鍵雙擊?
懇請提供一些思路,謝謝回覆。


haijie1223 发表于 2021-11-22 08:24:33

看不懂问题。。。

chzj589 发表于 2021-11-22 08:43:05

是点击栏目原地编辑?还是点击栏目打开Edit控件窗口?

afan 发表于 2021-11-22 11:12:45

haijie1223 发表于 2021-11-22 08:24
看不懂问题。。。

+1...
问题应精简

afan 发表于 2021-11-22 12:02:32

如果是说要 edit 控件响应鼠标右键消息的话,那不是在 WM_NOTIFY 中处理的,edit 等控件都不会有该消息。简单的可以直接在 $GUI_EVENT_SECONDARYDOWN 消息中处理即可。

chzj589 发表于 2021-11-22 13:14:19

接LZ上一贴,我猜LZ是想点击GUICtrlCreateListView列表某列某行条目,读取SQL数据库相对的数据显示在edit控件窗口

afan 发表于 2021-11-22 13:56:29

chzj589 发表于 2021-11-22 13:14
接LZ上一贴,我猜LZ是想点击GUICtrlCreateListView列表某列某行条目,读取SQL数据库相对的数据显示在edit控 ...

肯定不是,那个太简单。
精简他的提问,“在 WM_NOTIFY 中处理 Edit 控件右键双击”。

tubaba 发表于 2021-11-22 15:47:44

本帖最后由 tubaba 于 2021-11-22 16:01 编辑

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

看了半天,没明白楼主的意思...上面的话当我没说...

yohoboy 发表于 2021-11-23 01:01:29

抱歉,應該是上個圖比較清晰,感謝各位回覆,目前已知右鍵連點兩次Edit控件呼叫Function()是不可行的,那如果改為左鍵連點呼叫function()呢?
請看圖說明。

haijie1223 发表于 2021-11-23 10:37:17

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

意思是在某个edit控件上右键双击调用某个函数是吧。

afan 发表于 2021-11-23 11:53:18

如上5#所说,如果是右键点击,在 $GUI_EVENT_SECONDARYDOWN 消息中处理。现在换成左键点击,就在 $GUI_EVENT_PRIMARYDOWN 中处理。
不要在 WM_NOTIFY 中处理,不会有该消息;也不要在 WM_COMMAND 中处理,该消息不会传递点击消息。

可以肯定的是,不管是在Edit右键双击还是左键双击,都可以实现(只不过右键双击稍麻烦一点,因为要判断是否是单击时放行弹出右键菜单)。
提供个思路:点击时记录时间戳,再计算与上次点击的时间间隔是否<=250ms(该值或可读取系统设置),即为双击。

chzj589 发表于 2021-11-23 13:17:29

afan 发表于 2021-11-23 11:53
如上5#所说,如果是右键点击,在 $GUI_EVENT_SECONDARYDOWN 消息中处理。现在换成左键点击,就在 $GUI_EVEN ...

用WM_COMMAND,是不会传递点击消息。但可用ENTER鍵操作。多了一步。

chzj589 发表于 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


afan 发表于 2021-11-23 17:40:44

chzj589 发表于 2021-11-23 17:18
折腾了一下,"WM_COMMAND"也可以,

不必折腾,WM_COMMAND 是不会有 Edit 控件的点击消息的,不要被它失焦的消息误导了。

tubaba 发表于 2021-11-23 20:47:40

个人比较喜欢windows消息模式



#include <WinAPIConstants.au3>
#include <WinAPI.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 615, 437, -1, -1)
$Edit1 = GUICtrlCreateEdit("", 120, 112, 345, 121)
Global $hEdit1_CallBack = DllCallbackRegister("Edit_CallBackFunc", "int", "hWnd;uint;wparam;lparam")
Global $pEdit1_CallBack = DllCallbackGetPtr($hEdit1_CallBack)
Global $hOEdit1_CallBack = _WinAPI_SetWindowLong(GUICtrlGetHandle($Edit1), $GWL_WNDPROC, $pEdit1_CallBack)

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


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

While 1
        $nMsg = GUIGetMsg(1)
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Switch $nMsg
                                Case $Form1
                                        Exit
                                Case $Form2
                                        GUISetState(@SW_HIDE, $Form2)
                                        GUICtrlSetData($Edit1, GUICtrlRead($Edit2))
                        EndSwitch

        EndSwitch
WEnd


Func Edit_CallBackFunc($hWnd, $iMsg, $wParam, $lParam)
        Switch $iMsg
                Case $WM_LBUTTONDBLCLK
                        GUISetState(@SW_SHOW, $Form2)

        EndSwitch
        Return _WinAPI_CallWindowProc($hOEdit1_CallBack, $hWnd, $iMsg, $wParam, $lParam)
EndFunc   ;==>Edit_CallBackFunc

页: [1] 2
查看完整版本: ListView控件與Edit控件使用WM_NOTIFY呼叫選擇方式[已解決]