找回密码
 加入
搜索
楼主: kk_lee69

[AU3基础] 求合并_GUICtrlComboBox_Create与_GUICtrlComboBoxEx_Create的WM_NOTIFY消息

[复制链接]
发表于 2020-8-24 15:12:56 | 显示全部楼层
本帖最后由 afan 于 2020-9-20 14:47 编辑
chzj589 发表于 2020-8-23 21:24
用以下代码试试

不要搞得那么复杂,精简代码是解决问题的第一步
功能达到了再去优化,关键还是设计思路
列表临时出现一个下拉控件并处理交互,可以很简单
  1. #include <GUIListView.au3>

  2. Global $hListView1, $aItem, $iCombo
  3. Global $sDefCombo1 = '11|22', $sDefCombo2 = 'abc|ZZZ'
  4. _GUICreate()
  5. While GUIGetMsg() <> -3
  6. WEnd

  7. Func _GUICreate()
  8.         Local $hGUI = GUICreate('')
  9.         Dim $iCombo = GUICtrlCreateCombo('', -100, -100)
  10.         Local $ListView1 = GUICtrlCreateListView('编号|可双击下拉1  |xxx|可双击下拉2  |fff', 2, 30, 396, 250)
  11.         Dim $hListView1 = GUICtrlGetHandle(-1)
  12.         GUICtrlSetFont(-1, 11, 400, 0, '微软雅黑')
  13.         _GUICtrlListView_SetExtendedListViewStyle($ListView1, $LVS_EX_GRIDLINES + $LVS_EX_FULLROWSELECT)
  14.         For $ii = 1 To 8
  15.                 GUICtrlCreateListViewItem(StringFormat('%s|aaa-%s|BBB_%s|333.%s|ddd~%s', $ii, $ii, $ii, $ii, $ii), $ListView1)
  16.         Next
  17.         GUISetState()
  18.         GUIRegisterMsg(0x004E, '_WM_NOTIFY') ;$WM_NOTIFY = 0x004E
  19. EndFunc   ;==>_GUICreate

  20. Func _WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
  21.         #forceref $hWnd, $iMsg, $iwParam
  22.         Local $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
  23.         Local $hWndFrom = HWnd(DllStructGetData($tNMHDR, 'hWndFrom'))
  24.         Local $iCode = DllStructGetData($tNMHDR, 'Code')
  25.         Switch $hWndFrom
  26.                 Case $hListView1
  27.                         Switch $iCode
  28.                                 Case -2 ;$NM_CLICK = -2
  29.                                         If IsArray($aItem) Then
  30.                                                 _GUICtrlListView_SetItemText($hListView1, $aItem[0], GUICtrlRead($iCombo), $aItem[1])
  31.                                                 GUICtrlSetPos($iCombo, -1000, -100)
  32.                                                 Dim $aItem = 0
  33.                                         EndIf
  34.                                 Case -3 ;$NM_DBLCLK = -3
  35.                                         Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
  36.                                         Local $iIndex = DllStructGetData($tInfo, 'Index')
  37.                                         Local $iSub = DllStructGetData($tInfo, 'SubItem')
  38.                                         Dim $aItem = 0
  39.                                         If Not StringRegExp($iSub, "^(1|3)$") Then Return 'GUI_RUNDEFMSG'
  40.                                         Local $aRect = _GUICtrlListView_GetSubItemRect($hListView1, $iIndex, $iSub)
  41.                                         Dim $aItem[2] = [$iIndex, $iSub]
  42.                                         Local $sDef = $sDefCombo1
  43.                                         If $iSub = 3 Then $sDef = $sDefCombo2
  44.                                         Local $sData = _GUICtrlListView_GetItemText($hListView1, $iIndex, $iSub)
  45.                                         GUICtrlSetPos($iCombo, $aRect[0] + 4, $aRect[1] + 32, $aRect[2] - $aRect[0])
  46.                                         GUICtrlSetData($iCombo, '|' & $sData & '|' & $sDef, $sData)
  47.                                         GUICtrlSetState($iCombo, 256)

  48.                         EndSwitch
  49.         EndSwitch
  50.         Return 'GUI_RUNDEFMSG'
  51. EndFunc   ;==>_WM_NOTIFY
复制代码


又被吃代码了,还好自己复制测试发现了问题。
发表于 2020-8-24 15:20:03 | 显示全部楼层
afan 发表于 2020-8-24 15:12
不要搞得那么复杂,精简代码是解决问题的第一步
功能达到了再去优化,关键还是设计思路
列表临时出现一 ...

谢谢!打开了思路。
发表于 2020-8-25 15:45:32 | 显示全部楼层
afan 发表于 2020-8-24 15:12
不要搞得那么复杂,精简代码是解决问题的第一步
功能达到了再去优化,关键还是设计思路
列表临时出现一 ...

请教:
鼠标左鍵单击=-2
鼠标左鍵双击=-3
为什么?
那鼠标右键单击= ?
代码受益非浅!
主要是这一行: GUICtrlSetData($iCombo, '|' & $sData & '|' & $sDef, $sData)
还有:
If IsArray($aItem) Then
_GUICtrlListView_SetItemText($hListView1, $aItem[0], GUICtrlRead($iCombo), $aItem[1])
GUICtrlSetPos($iCombo, -1000, -100)
Dim $aItem = 0
EndIf
发表于 2020-8-25 15:49:27 | 显示全部楼层
chzj589 发表于 2020-8-25 15:45
请教:
鼠标左鍵单击=-2
鼠标左鍵双击=-3

这是 Windows 消息常量,固定值,在 WindowsConstants.au3 中:

Global Const $NM_FIRST = 0
Global Const $NM_OUTOFMEMORY = $NM_FIRST - 1
Global Const $NM_CLICK = $NM_FIRST - 2
Global Const $NM_DBLCLK = $NM_FIRST - 3
Global Const $NM_RETURN = $NM_FIRST - 4
Global Const $NM_RCLICK = $NM_FIRST - 5
Global Const $NM_RDBLCLK = $NM_FIRST - 6
发表于 2020-8-25 15:57:16 | 显示全部楼层
chzj589 发表于 2020-8-25 15:45
请教:
鼠标左鍵单击=-2
鼠标左鍵双击=-3

不管临时控件或是浮窗交互,首先显示原有数据这是必须的,然后再可以编辑或取消。
这都是关乎用户体验及方便数据交互的问题。
发表于 2020-8-25 16:09:22 | 显示全部楼层
afan 发表于 2020-8-25 15:49
这是 Windows 消息常量,固定值,在 WindowsConstants.au3 中:

Global Const $NM_FIRST = 0

谢谢!要学习的知识还很多。
发表于 2020-8-25 22:30:53 | 显示全部楼层
chzj589 发表于 2020-8-25 16:09
谢谢!要学习的知识还很多。

常量值的问题,可以使用我的工具,常量询捕 https://www.autoitx.com/thread-71517-1-1.html
值是多少,出自哪里,一目了然。
发表于 2020-8-26 11:03:02 | 显示全部楼层
afan 发表于 2020-8-25 22:30
常量值的问题,可以使用我的工具,常量询捕 https://www.autoitx.com/thread-71517-1-1.html
值是多少, ...

感谢!方便多了
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2026-9-23 21:45 , Processed in 0.069050 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

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