找回密码  加入

QQ登录

只需一步,快速开始

AUTOIT CN

搜索
查看: 1203|回复: 5

[GUI管理] 如何实现鼠标悬停ComboBox控件上就可以用滑轮翻动[已解决]

[复制链接]
发表于 2017-5-28 17:03:33 | 显示全部楼层 |阅读模式
本帖最后由 heroxianf 于 2017-5-29 09:18 编辑

之前不加禁止编辑的样式点进去就可以滑轮上下翻动,现在使用下拉控件禁止编辑后想实现鼠标悬停上就可以滑动翻菜单,请大家指点一下。


  1. #include <GUIConstantsEx.au3>
  2. #include <MsgBoxConstants.au3>
  3. #include <GuiComboBox.au3>

  4. Example()

  5. Func Example()

  6.         Local $hGUI = GUICreate("ComboBox", 300, 200)
  7.         Local $idComboBox1 = GUICtrlCreateCombo("test1", 10, 10, 185, 20, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL, $CBS_DROPDOWNLIST))
  8.         Local $idComboBox2 = GUICtrlCreateCombo("中文1", 10, 50, 185, 20, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL, $CBS_DROPDOWNLIST))
  9.         Local $idClose = GUICtrlCreateButton("关闭", 210, 170, 85, 25)
  10.         GUICtrlSetData($idComboBox1, "test2|test3|test4", "test4")
  11.         GUICtrlSetData($idComboBox2, "中文2|中文3|中文4", "中文4")

  12.         GUISetState(@SW_SHOW, $hGUI)

  13.         While 1
  14.                 Switch GUIGetMsg()
  15.                         Case $GUI_EVENT_CLOSE, $idClose
  16.                                 ExitLoop
  17.                         Case $idComboBox1
  18.                                
  19.                         Case $idComboBox2
  20.                                

  21.                 EndSwitch
  22.         WEnd
  23.         GUIDelete($hGUI)
  24. EndFunc   ;==>Example
复制代码
发表于 2017-5-28 23:34:03 | 显示全部楼层
和鼠标悬停不悬停没关系,只要获取了焦点就可以。
 楼主| 发表于 2017-5-28 23:53:52 | 显示全部楼层
回复 2# haijie1223


    发哥 哪个函数呢?
 楼主| 发表于 2017-5-29 01:03:16 | 显示全部楼层
回复 2# haijie1223

发哥帮我完善一下哇   怎么获取焦点呢?

  1. #include <GUIConstantsEx.au3>
  2. #include <MsgBoxConstants.au3>
  3. #include <GuiComboBox.au3>
  4. #include <StaticConstants.au3>
  5. #include <WindowsConstants.au3>
  6. #include <WinAPI.au3>

  7. Global Const $TME_CANCEL = 0x80000000
  8. Global Const $TME_HOVER = 0x00000001
  9. Global Const $TME_LEAVE = 0x00000002
  10. Global Const $TME_NONCLIENT = 0x00000010
  11. Global Const $TME_QUERY = 0x40000000
  12. Global $idComboBox1, $idComboBox2, $wProcOld, $wProcNew

  13. Example()

  14. Func Example()

  15.         Local $hGUI = GUICreate("ComboBox", 300, 200)
  16.         $idComboBox1 = GUICtrlCreateCombo("test1", 10, 10, 185, 20, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL, $CBS_DROPDOWNLIST))
  17.         $wProcNew = DllCallbackRegister("_MyProc", "int", "hwnd;uint;uint;dword")
  18.         $wProcOld = _WinAPI_SetWindowLong(GUICtrlGetHandle(-1), $GWL_WNDPROC, DllCallbackGetPtr($wProcNew))
  19.        
  20.        
  21.         $idComboBox2 = GUICtrlCreateCombo("中文1", 10, 50, 185, 20, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL, $CBS_DROPDOWNLIST))
  22.         $wProcNew = DllCallbackRegister("_MyProc", "int", "hwnd;uint;uint;dword")
  23.         $wProcOld = _WinAPI_SetWindowLong(GUICtrlGetHandle(-1), $GWL_WNDPROC, DllCallbackGetPtr($wProcNew))
  24.        
  25.         Local $idClose = GUICtrlCreateButton("关闭", 210, 170, 85, 25)
  26.        

  27.         GUISetState(@SW_SHOW, $hGUI)

  28.         GUICtrlSetData($idComboBox1, "test2|test3|test4", "test4")
  29.         GUICtrlSetData($idComboBox2, "中文2|中文3|中文4", "中文4")
  30.        
  31.         While 1
  32.                 Switch GUIGetMsg()
  33.                         Case $GUI_EVENT_CLOSE, $idClose
  34.                                 ExitLoop

  35.                 EndSwitch
  36.         WEnd
  37.         GUIDelete($hGUI)
  38. EndFunc   ;==>Example

  39. Func _MyProc($hWnd, $uiMsg, $wParam, $lParam)
  40.         Local $iCtrl = _WinAPI_GetDlgCtrlID($hWnd)
  41.         Switch $uiMsg
  42.                 Case $WM_LBUTTONDOWN;左键按下

  43.                 Case $WM_LBUTTONUP;左键弹起

  44.                 Case $WM_MOUSEHOVER;鼠标悬停
  45.                         Switch $iCtrl
  46.                                 Case $idComboBox1
  47.                                         MsgBox(0, "", "1", 1)

  48.                         EndSwitch
  49.                 Case $WM_MOUSELEAVE;鼠标离开
  50.                         Switch $iCtrl
  51.                                 Case $idComboBox1

  52.                         EndSwitch
  53.                 Case $WM_MOUSEMOVE;鼠标移动
  54.                         __TrackMouseEvent($hWnd, BitOR($TME_HOVER, $TME_LEAVE), 5) ;//MOUSELEAVE|MOUSEHOVER消息由此函数触发
  55.                 Case $WM_SETCURSOR;设置光标
  56.                         GUICtrlSetCursor($iCtrl, 0)
  57.         EndSwitch
  58.         Return _WinAPI_CallWindowProc($wProcOld, $hWnd, $uiMsg, $wParam, $lParam)
  59. EndFunc   ;==>_MyProc

  60. Func __TrackMouseEvent($hWnd, $iFlags, $iTime = -1)
  61.         Local $tTME = DllStructCreate('dword;dword;hwnd;dword')
  62.         DllStructSetData($tTME, 1, DllStructGetSize($tTME))
  63.         DllStructSetData($tTME, 2, $iFlags)
  64.         DllStructSetData($tTME, 3, $hWnd)
  65.         DllStructSetData($tTME, 4, $iTime)

  66.         Local $aRet = DllCall('user32.dll', 'bool', 'TrackMouseEvent', 'struct*', $tTME)
  67.         If @error Then Return SetError(@error, @extended, 0)
  68.         ; If Not $aRet[0] Then Return SetError(1000, 0, 0)

  69.         Return $aRet[0]
  70. EndFunc   ;==>__TrackMouseEvent
复制代码
发表于 2017-5-29 07:42:25 | 显示全部楼层
While 1
               
                                $Info = GUIGetCursorInfo($hGUI)
                                If $Info[4] = $idComboBox1 Or $Info[4] = $idComboBox2 Then
                                        GUICtrlSetState($Info[4], $GUI_FOCUS)
                                EndIf
                               
                Switch GUIGetMsg()
                        Case $GUI_EVENT_CLOSE, $idClose
                                ExitLoop
                        Case $idComboBox1
                                
                        Case $idComboBox2
                                

                EndSwitch
        WEnd

评分

1

查看全部评分

 楼主| 发表于 2017-5-29 09:17:14 | 显示全部楼层
基础已经完成,谢谢大家了。

  1. #include <GUIConstantsEx.au3>
  2. #include <MsgBoxConstants.au3>
  3. #include <GuiComboBox.au3>
  4. #include <StaticConstants.au3>
  5. #include <WindowsConstants.au3>
  6. #include <WinAPI.au3>

  7. Global Const $TME_CANCEL = 0x80000000
  8. Global Const $TME_HOVER = 0x00000001
  9. Global Const $TME_LEAVE = 0x00000002
  10. Global Const $TME_NONCLIENT = 0x00000010
  11. Global Const $TME_QUERY = 0x40000000
  12. Global $idComboBox1, $idComboBox2, $wProcOld, $wProcNew

  13. Example()

  14. Func Example()

  15.         Local $hGUI = GUICreate("ComboBox", 300, 200)
  16.         $idComboBox1 = GUICtrlCreateCombo("test1", 10, 10, 185, 20, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL, $CBS_DROPDOWNLIST))
  17.         $wProcNew = DllCallbackRegister("_MyProc", "int", "hwnd;uint;uint;dword")
  18.         $wProcOld = _WinAPI_SetWindowLong(GUICtrlGetHandle(-1), $GWL_WNDPROC, DllCallbackGetPtr($wProcNew))
  19.        
  20.        
  21.         $idComboBox2 = GUICtrlCreateCombo("中文1", 10, 50, 185, 20, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL, $CBS_DROPDOWNLIST))
  22.         $wProcNew = DllCallbackRegister("_MyProc", "int", "hwnd;uint;uint;dword")
  23.         $wProcOld = _WinAPI_SetWindowLong(GUICtrlGetHandle(-1), $GWL_WNDPROC, DllCallbackGetPtr($wProcNew))
  24.        
  25.         Local $idClose = GUICtrlCreateButton("关闭", 210, 170, 85, 25)
  26.        

  27.         GUISetState(@SW_SHOW, $hGUI)

  28.         GUICtrlSetData($idComboBox1, "test2|test3|test4", "test4")
  29.         GUICtrlSetData($idComboBox2, "中文2|中文3|中文4", "中文4")
  30.        
  31.         While 1
  32.                 Switch GUIGetMsg()
  33.                         Case $GUI_EVENT_CLOSE, $idClose
  34.                                 ExitLoop

  35.                 EndSwitch
  36.         WEnd
  37.         GUIDelete($hGUI)
  38. EndFunc   ;==>Example

  39. Func _MyProc($hWnd, $uiMsg, $wParam, $lParam)
  40.         Local $iCtrl = _WinAPI_GetDlgCtrlID($hWnd)
  41.         Switch $uiMsg
  42.                 Case $WM_LBUTTONDOWN;左键按下

  43.                 Case $WM_LBUTTONUP;左键弹起

  44.                 Case $WM_MOUSEHOVER;鼠标悬停
  45.                         Switch $iCtrl
  46.                                 Case $idComboBox1
  47.                                         GUICtrlSetState($idComboBox1, $GUI_FOCUS)
  48.                                 Case $idComboBox2
  49.                                         GUICtrlSetState($idComboBox2, $GUI_FOCUS)

  50.                         EndSwitch
  51.                 Case $WM_MOUSELEAVE;鼠标离开
  52.                         Switch $iCtrl
  53.                                 Case $idComboBox1

  54.                         EndSwitch
  55.                 Case $WM_MOUSEMOVE;鼠标移动
  56.                         __TrackMouseEvent($hWnd, BitOR($TME_HOVER, $TME_LEAVE), 5) ;//MOUSELEAVE|MOUSEHOVER消息由此函数触发
  57.                 Case $WM_SETCURSOR;设置光标
  58.                         GUICtrlSetCursor($iCtrl, 0)
  59.         EndSwitch
  60.         Return _WinAPI_CallWindowProc($wProcOld, $hWnd, $uiMsg, $wParam, $lParam)
  61. EndFunc   ;==>_MyProc

  62. Func __TrackMouseEvent($hWnd, $iFlags, $iTime = -1)
  63.         Local $tTME = DllStructCreate('dword;dword;hwnd;dword')
  64.         DllStructSetData($tTME, 1, DllStructGetSize($tTME))
  65.         DllStructSetData($tTME, 2, $iFlags)
  66.         DllStructSetData($tTME, 3, $hWnd)
  67.         DllStructSetData($tTME, 4, $iTime)

  68.         Local $aRet = DllCall('user32.dll', 'bool', 'TrackMouseEvent', 'struct*', $tTME)
  69.         If @error Then Return SetError(@error, @extended, 0)
  70.         ; If Not $aRet[0] Then Return SetError(1000, 0, 0)

  71.         Return $aRet[0]
  72. EndFunc   ;==>__TrackMouseEvent
复制代码
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2019-10-24 11:27 , Processed in 0.078124 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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