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控件加上鼠標右鍵雙擊?
懇請提供一些思路,謝謝回覆。
看不懂问题。。。 是点击栏目原地编辑?还是点击栏目打开Edit控件窗口? haijie1223 发表于 2021-11-22 08:24
看不懂问题。。。
+1...
问题应精简 如果是说要 edit 控件响应鼠标右键消息的话,那不是在 WM_NOTIFY 中处理的,edit 等控件都不会有该消息。简单的可以直接在 $GUI_EVENT_SECONDARYDOWN 消息中处理即可。 接LZ上一贴,我猜LZ是想点击GUICtrlCreateListView列表某列某行条目,读取SQL数据库相对的数据显示在edit控件窗口 chzj589 发表于 2021-11-22 13:14
接LZ上一贴,我猜LZ是想点击GUICtrlCreateListView列表某列某行条目,读取SQL数据库相对的数据显示在edit控 ...
肯定不是,那个太简单。
精简他的提问,“在 WM_NOTIFY 中处理 Edit 控件右键双击”。 本帖最后由 tubaba 于 2021-11-22 16:01 编辑
注册WM_COMMAND消息
又想了一下,虽然EDIT控件是在WM_COMMAND中处理,但是响应右键双击这种操作恐怕不行.EDIT右键菜单是由系统接管的,而点击右键会弹出系统菜单
看了半天,没明白楼主的意思...上面的话当我没说...
抱歉,應該是上個圖比較清晰,感謝各位回覆,目前已知右鍵連點兩次Edit控件呼叫Function()是不可行的,那如果改為左鍵連點呼叫function()呢?
請看圖說明。 yohoboy 发表于 2021-11-23 01:01
抱歉,應該是上個圖比較清晰,感謝各位回覆,目前已知右鍵連點兩次Edit控件呼叫Function()是不可行的,那如 ...
意思是在某个edit控件上右键双击调用某个函数是吧。 如上5#所说,如果是右键点击,在 $GUI_EVENT_SECONDARYDOWN 消息中处理。现在换成左键点击,就在 $GUI_EVENT_PRIMARYDOWN 中处理。
不要在 WM_NOTIFY 中处理,不会有该消息;也不要在 WM_COMMAND 中处理,该消息不会传递点击消息。
可以肯定的是,不管是在Edit右键双击还是左键双击,都可以实现(只不过右键双击稍麻烦一点,因为要判断是否是单击时放行弹出右键菜单)。
提供个思路:点击时记录时间戳,再计算与上次点击的时间间隔是否<=250ms(该值或可读取系统设置),即为双击。 afan 发表于 2021-11-23 11:53
如上5#所说,如果是右键点击,在 $GUI_EVENT_SECONDARYDOWN 消息中处理。现在换成左键点击,就在 $GUI_EVEN ...
用WM_COMMAND,是不会传递点击消息。但可用ENTER鍵操作。多了一步。 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
chzj589 发表于 2021-11-23 17:18
折腾了一下,"WM_COMMAND"也可以,
不必折腾,WM_COMMAND 是不会有 Edit 控件的点击消息的,不要被它失焦的消息误导了。 个人比较喜欢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