smooth 发表于 2014-2-14 21:54:50

请教如何修改这个自定义函数使其能更广泛应用?

下列自定函数,是在另外一个帖子里找到的,我做了代码精简,就变成了下面这个样子,不需要插入头文件。
这个是用来限制GUICtrlCreateInput输入的类型的,它的难能可贵之处在于可以实时检测。我仔细看了一下,主要通过_Input_Changed($hWnd, $CtrlId)这个函数里的正则来实现的,于是我就想,通过变换正则,就可以实现多种限制,太爽了。可是遇到一个问题,如果不加修改,那一个脚本里只能检测一种,光修改正则,就全部堆到脚本里,是不行的。所以我就动手把所有的变量都修改掉,函数名也修改掉,正则那里修改成自己想要限制的类型,然后放入到同一个脚本里,但是发现根本就不行。琢磨了几天都没进展。大家帮忙看看,需要怎么才能实现我这个想法?欢迎指点。谢谢!

Global Const $GUI_EVENT_CLOSE = -3
Global Const $GUI_RUNDEFMSG = 'GUI_RUNDEFMSG'
Global $sToolTip_Text = ["对不起,不支持中文字符!", "错误:"]
Global $sInputs_Array
GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")
GUIRegisterMsg($WM_MOVE, "WM_CLEAR_TOOLTIP")
GUIRegisterMsg($WM_LBUTTONDOWN, "WM_CLEAR_TOOLTIP")
GUIRegisterMsg($WM_RBUTTONDOWN, "WM_CLEAR_TOOLTIP")
Func _GuiInputSetNotCN($CtrlId)
        Local $iUbound = UBound($sInputs_Array)
        ReDim $sInputs_Array[$iUbound + 1]
        $sInputs_Array[$iUbound] = $CtrlId
EndFunc   ;==>_GuiInputSetNotCN
Func _Input_Changed($hWnd, $CtrlId)
        ToolTip("")
        Local $Read_Input = GUICtrlRead($CtrlId)
        If StringRegExp($Read_Input, '[^\x00-\xff]') Then
                GUICtrlSetData($CtrlId, StringRegExpReplace($Read_Input, '[^\x00-\xff]', ''))
                Local $Gui_Get_Pos = WinGetPos($hWnd)
                Local $Ctrl_Get_Pos = ControlGetPos($hWnd, "", $CtrlId)
                Local Const $SM_CYCAPTION = 4
                Local Const $SM_CXFIXEDFRAME = 7
                Local $X_Pos = $Gui_Get_Pos + $Ctrl_Get_Pos + $Ctrl_Get_Pos + GetSystemMetrics($SM_CXFIXEDFRAME)
                Local $Y_Pos = $Gui_Get_Pos + $Ctrl_Get_Pos + $Ctrl_Get_Pos + GetSystemMetrics($SM_CYCAPTION)
                ToolTip($sToolTip_Text, $X_Pos, $Y_Pos, $sToolTip_Text, 3, 1 + 4)
                DllCall("user32.dll", "int", "MessageBeep", "int", 0x0)
        EndIf
EndFunc   ;==>_Input_Changed
Func WM_CLEAR_TOOLTIP($hWnd, $iMsg, $wParam, $lParam)
        ToolTip("")
        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_CLEAR_TOOLTIP
Func MY_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
        If $hWnd = 0 Or Not WinExists($hWnd) Then Return $GUI_RUNDEFMSG
        Local $nNotifyCode = BitShift($wParam, 16)
        Local $nID = BitAND($wParam, 0xFFFF)
        Local Const $EN_CHANGE = 0x300
        Local Const $EN_UPDATE = 0x400
        Local Const $EN_SETFOCUS = 0x100
        Local Const $EN_KILLFOCUS = 0x200
        For $i = 1 To UBound($sInputs_Array) - 1
                If $nID = $sInputs_Array[$i] Then
                        Switch $nNotifyCode
                                Case $EN_UPDATE
                                        _Input_Changed($hWnd, $sInputs_Array[$i])
                                Case $EN_SETFOCUS, $EN_KILLFOCUS
                                        ToolTip("")
                        EndSwitch
                        ExitLoop
                EndIf
        Next
        Return $GUI_RUNDEFMSG
EndFunc   ;==>MY_WM_COMMAND
Func GetSystemMetrics($Flag)
        Local $iRet = DllCall('user32.dll', 'int', 'GetSystemMetrics', 'int', $Flag)
        Return $iRet
EndFunc   ;==>GetSystemMetrics
$GUI = GUICreate("_GuiInputSetNotCN() Demo", 400, 100)
$Input_1 = GUICtrlCreateInput("", 20, 10, 360, 20)
_GuiInputSetNotCN($Input_1)
$Input_2 = GUICtrlCreateInput("", 20, 40, 360, 20)
_GuiInputSetNotCN($Input_2)
$Exit = GUICtrlCreateButton("Exit", 20, 70, 60, 20)
GUISetState()
While 1
        Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE, $Exit
                        ExitLoop
        EndSwitch
WEnd

nmgwddj 发表于 2014-2-17 16:40:41

自定义函数里面提供个正则的参数不就得了?设定个默认值。

smooth 发表于 2014-2-18 10:54:07

回复 2# nmgwddj

是的,一般人都会这样想,但是我考虑下来是行不通的。
页: [1]
查看完整版本: 请教如何修改这个自定义函数使其能更广泛应用?