fenhanxue 发表于 2017-7-25 15:40:26

Combo 文本读取异常,寻求原因【已解决】

本帖最后由 fenhanxue 于 2017-7-25 22:53 编辑

先上代码:#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiComboBox.au3>
#include <GuiComboBoxEx.au3>

$Form1 = GUICreate("Form1", 623, 449)
$Combo1 = GUICtrlCreateCombo("", 88, 72, 329, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))

$bt = GUICtrlCreateButton('',0,300,100,100)
GUISetState(@SW_SHOW)

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")


While 1
      $nMsg = GUIGetMsg()

      Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                                        Case $bt
                                                MsgBox(0,'',GUICtrlRead($Combo1))
      EndSwitch
WEnd

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam);文本变化
       
        Local $temp_list =
       
      Local $hWndFrom, $iIDFrom, $iCode, $hWndCombo
      $hWndFrom = $ilParam
      $iIDFrom = BitAND($iwParam, 0xFFFF)
      $iCode = BitShift($iwParam, 16)
      
      ;判断是否是 $Combo1 消息
      If $hWndFrom <> GUICtrlGetHandle($Combo1) Then   Return $GUI_RUNDEFMSG
      If $iCode <> $CBN_EDITCHANGE Then Return $GUI_RUNDEFMSG;$CBN_EDITCHANGE      代表 $Combo1 文字发生改变
               

                $temp_hwnd = $Combo1
                Local $last = GUICtrlRead($temp_hwnd)
                               

                               
                                        Do
                                        Until _GUICtrlComboBox_DeleteString($temp_hwnd, 0) = -1

                                       
                                        If $last = '' Then
                                                For $i = 1 To $temp_list
                                                        _GUICtrlComboBox_AddString($temp_hwnd, $temp_list[$i])
                                                Next
                                                _GUICtrlComboBox_ShowDropDown($temp_hwnd, False)
                                        Else
                                                Local $if_have_item = 0
                                                For $i = 1 To $temp_list
                                                        Local $temp_data = ''
                                                        If StringInStr($temp_list[$i], $last) <> 0 Then
                                                                _GUICtrlComboBox_AddString($temp_hwnd,$temp_list[$i])
                                                                $if_have_item = 1
                                                        EndIf
                                                Next
                                               
                                               
                                                If $if_have_item = 1 Then
                                                        Sleep(1)
                                                        _GUICtrlComboBox_ShowDropDown($temp_hwnd, True)
                                                        _GUICtrlComboBox_SetEditText($temp_hwnd,$last)
                                                Else
                                                        If _GUICtrlComboBox_GetDroppedState($temp_hwnd) Then _GUICtrlComboBox_ShowDropDown($temp_hwnd, False)
                                                EndIf
                                        EndIf       

        Return $GUI_RUNDEFMSG

EndFunc   ;==>WM_COMMAND异常表现如下图:


1.启动程序后,鼠标点击combo输入框
2.键盘输入4*
3.鼠标点一下任何灰色的GUI界面(目的是让combo取消下拉)
4.点一下按钮。此时 GUICtrlRead($Combo) 得到的结果不是   4*,而是下拉框里的第一行文本,何解?

5:另,根据多次测试,发现,键盘一次只输入一个字符的话,GUICtrlRead($Combo)得到的结果是正确的。一次性输入多个字符,则得到的结果就不正确。
如,一次性只输入4,那么 GUICtrlRead($Combo)的结果也会是4
一次性输入35 GUICtrlRead($Combo)的结果便不是35,而是Combo 下拉后的第一行文本

kk_lee69 发表于 2017-7-25 15:48:29

回复 1# fenhanxue

輸入5 有東西   輸入55空白.....

tubaba 发表于 2017-7-25 15:55:25

GUICtrlRead 换 _GUICtrlComboBox_GetEditText

fenhanxue 发表于 2017-7-25 16:27:33

回复 2# kk_lee69

注册了一个消息,见:Func WM_COMMAND

大意是combo,内置了一个列表:
7.4*35.5*600
8.4*35.5*600
22
33

输入字符后,自动监控combo,判断里面是否包含有列表的文字,有包含,则删选后选出,不包含则不选。
例如,输入5,则 7.4*35.5*600和 8.4*35.5*600 都包含5,所以显示这2个。
输入55,则这4个列表都不包含55,所以不显示

fenhanxue 发表于 2017-7-25 16:29:06

回复 3# tubaba


    替换后的确可以,为什么
GUICtrlRead 会异常?

水木子 发表于 2017-7-25 16:47:58

回复 5# fenhanxue

注释掉46和47行试试

tubaba 发表于 2017-7-25 16:49:20

不叫异常,说明combo是个组合控件,_GUICtrlComboBox_GetEditText获取的仅是edit的值.GUICtrlRead获取的是整个控件对外告知的值.

yamakawa 发表于 2017-7-25 18:10:22

回复 5# fenhanxue


    GUICtrlRead 获取的是列表中选中项目的值,而不是你输入的,显示在combo中的内容,如果没选择,默认是第一个。所以输出了列表的第一个
   而
_GUICtrlComboBox_GetEditText是获取组合控件编辑框的文本

fenhanxue 发表于 2017-7-25 22:52:24

回复 8# yamakawa


    也不尽然,例如,你直接输入4,再GUICtrlRead,结果会显示是4的

fenhanxue 发表于 2017-7-25 22:53:02

回复 7# tubaba


    受教啦,这个解释很通俗易懂,感谢指点
页: [1]
查看完整版本: Combo 文本读取异常,寻求原因【已解决】