找回密码
 加入
搜索
查看: 4877|回复: 10

[AU3基础] 嗯,那个什么“限制输入框的类型”的帖子 那里去了?

 火.. [复制链接]
发表于 2012-5-8 15:34:53 | 显示全部楼层 |阅读模式
早上看到的帖子,说是限制Input1只能是0-23,Input2只能是0-59
当时看到时我挺有兴趣写了点,后来有事。
刚写了一个我的版本

让大家指正


#include <GUIConstantsEX.au3>
#include <Constants.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <WinAPI.au3>
#include <GuiEdit.au3>

Opt('MustDeclareVars', 1)
Global $hGui, $msg, $InputA, $InputB
Global $wProcNew, $wProcOld, $hInputA, $hInputB
Global $iTipIcon = $TTI_ERROR
Global $sTipTitle = "Unacceptable Character"
Global $sTipTextA = "You can only enter numbers 0 to 23 here."
Global $sTipTextB = "You can only enter numbers 0 to 59 here."


$hGui = GUICreate("Custom inputs, tooltips and cue banners for INPUT CONTROL", 450, 200)
GUICtrlCreateLabel("", -10, -10)
GUICtrlSetState(-1, $GUI_FOCUS)
$InputA = GUICtrlCreateInput("", 10, 10, 400, 30, $ES_NUMBER)
$hInputA = GUICtrlGetHandle(-1)
_GUICtrlEdit_SetCueBanner($hInputA, $sTipTextA)

$InputB = GUICtrlCreateInput("", 10, 80, 400, 30, $ES_NUMBER)
$hInputB = GUICtrlGetHandle(-1)
_GUICtrlEdit_SetCueBanner($hInputB, $sTipTextB)

$wProcNew = DllCallbackRegister("_InputWinProc", "int", "hwnd;uint;wparam;lparam")
$wProcOld = _WinAPI_SetWindowLong($hInputA, $GWL_WNDPROC, DllCallbackGetPtr($wProcNew))
_WinAPI_SetWindowLong($hInputB, $GWL_WNDPROC, DllCallbackGetPtr($wProcNew))
GUISetState()

While True
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then _Exit()
WEnd

Func _GUICtrlEdit_SetCueBanner($hWnd, $sText)
    If Not IsHWnd($hWnd) Then $hWnd = GUICtrlGetHandle($hWnd)
        Local $tText = _WinAPI_MultiByteToWideChar($sText)
    Return _SendMessage($hWnd, $EM_SETCUEBANNER, False, DllStructGetPtr($tText)) = 1
EndFunc

Func _Exit()
    If $wProcOld Then 
                _WinAPI_SetWindowLong($hInputA, $GWL_WNDPROC, $wProcOld)
        _WinAPI_SetWindowLong($hInputB, $GWL_WNDPROC, $wProcOld)
        EndIf
    If $wProcNew Then DllCallbackFree($wProcNew)
    GUIDelete($hGui)
    Exit
EndFunc


Func _GuiInputSetToolTip(ByRef $hWnd, ByRef $msg, ByRef $wParam, ByRef $lParam, $sTitle = "", $sText = "", $iIcon = $TTI_NONE)
    If Not IsHWnd($hWnd) Then Return 0
    Local $tTitle, $tText, $tTT
    $tTitle = _WinAPI_MultiByteToWideChar($sTitle)
    $tText = _WinAPI_MultiByteToWideChar($sText)
    If $lParam And ($msg = $EM_SHOWBALLOONTIP) Then 
        $tTT = DllStructCreate($tagEDITBALLOONTIP, $lParam)
    Else
        $tTT = DllStructCreate($tagEDITBALLOONTIP)
        DllStructSetData($tTT, "Size", DllStructGetSize($tTT))
    EndIf
    If Not IsDllStruct($tTitle) Or Not IsDllStruct($tText) Or Not IsDllStruct($tTT) Then
        Return _WinAPI_CallWindowProc($wProcOld, $hWnd, $msg, $wParam, $lParam)
    EndIf
    DllStructSetData($tTT, "Title", DllStructGetPtr($tTitle))
    DllStructSetData($tTT, "Text", DllStructGetPtr($tText))
    DllStructSetData($tTT, "Icon", $iIcon)
    If ($msg <> $EM_SHOWBALLOONTIP) Or (Not $lParam) Then $lParam = DllStructGetPtr($tTT)
    Return _WinAPI_CallWindowProc($wProcOld, $hWnd, $EM_SHOWBALLOONTIP, $wParam, $lParam)
EndFunc

Func _InputWinProc($hWnd, $msg, $wParam, $lParam)
    #forceref $hWnd, $Msg, $wParam, $lParam
        Local $iStrLen, $iNum
        Switch $msg
                Case $EM_SHOWBALLOONTIP
                        Switch $hWnd
                                Case $hInputA
                                        Return _GuiInputSetToolTip($hWnd, $msg, $wParam, $lParam, $sTipTitle, $sTipTextA, $iTipIcon)
                                Case $hInputB 
                                        Return _GuiInputSetToolTip($hWnd, $msg, $wParam, $lParam, $sTipTitle, $sTipTextB, $iTipIcon)
                        EndSwitch
                Case $WM_CHAR
                        If $wParam = 7 Or $wParam = 8 Then ContinueCase
                        
            Switch $hWnd
                                Case $hInputA
                                        $iStrLen = StringLen(GUICtrlRead($InputA))
                                        If $iStrLen = 0 Then
                                                ContinueCase
                                        ElseIf $iStrLen = 1 Then
                                                If GUICtrlRead($InputA) == 0 Then                                                        
                                                        $wParam = 0
                                                        Return _GuiInputSetToolTip($hWnd, $msg, $wParam, $lParam, $sTipTitle, $sTipTextA, $iTipIcon)                                                        
                                                EndIf
                                                $iNum = Number(GUICtrlRead($InputA) & Chr($wParam))
                                                If $iNum > 23 Then
                                                        $wParam = 0
                                                        Return _GuiInputSetToolTip($hWnd, $msg, $wParam, $lParam, $sTipTitle, $sTipTextA, $iTipIcon)
                                                EndIf
                                        ElseIf $iStrLen = 2 Then 
                                                $wParam = 0
                        Return _GuiInputSetToolTip($hWnd, $msg, $wParam, $lParam, $sTipTitle, $sTipTextA, $iTipIcon)
                    EndIf
                Case $hInputB
                                        $iStrLen = StringLen(GUICtrlRead($InputB))
                                        If $iStrLen = 0 Then
                                                ContinueCase
                                        ElseIf $iStrLen = 1 Then
                                                If GUICtrlRead($InputB) == 0 Then                                                        
                                                        $wParam = 0
                                                        Return _GuiInputSetToolTip($hWnd, $msg, $wParam, $lParam, $sTipTitle, $sTipTextB, $iTipIcon)                                                        
                                                EndIf
                                                $iNum = Number(GUICtrlRead($InputB) & Chr($wParam))
                                                If $iNum > 59 Then
                                                        $wParam = 0
                                                        Return _GuiInputSetToolTip($hWnd, $msg, $wParam, $lParam, $sTipTitle, $sTipTextB, $iTipIcon)
                                                EndIf
                                        ElseIf $iStrLen = 2 Then 
                                                $wParam = 0
                        Return _GuiInputSetToolTip($hWnd, $msg, $wParam, $lParam, $sTipTitle, $sTipTextB, $iTipIcon)
                    EndIf
            EndSwitch
        EndSwitch
    Return _WinAPI_CallWindowProc($wProcOld, $hWnd, $msg, $wParam, $lParam)
EndFunc

评分

参与人数 4金钱 +114 贡献 +11 收起 理由
whitehead + 19 + 3
xms77 + 30 + 5 有点意思
zldfsz + 30 + 3 牛X
3mile + 35 精彩

查看全部评分

发表于 2012-5-8 16:23:49 | 显示全部楼层
回复 1# happytc

楼主厉害
发表于 2012-5-8 21:21:53 | 显示全部楼层
回复 1# happytc
快乐兄,好像出现unacceptable character后,一定要把原先的字符删除后才能输入,不能直接改写,是不是可以改成选定字符后可以改写?
 楼主| 发表于 2012-5-9 08:17:09 | 显示全部楼层
回复  happytc
快乐兄,好像出现unacceptable character后,一定要把原先的字符删除后才能输入,不能直接 ...
xms77 发表于 2012-5-8 21:21


一旦出现提示,说明输入的字符已经在限制外了
这时你用鼠标选定一个字符,然后再输入一个字符来替换花的动作,还不如直接删除一个字符后再输入呢

当然,可以设定你说的那样
发表于 2012-5-9 23:05:24 | 显示全部楼层
这个  弄了内存?
发表于 2012-5-10 07:34:02 | 显示全部楼层
做个记号,慢慢理解
发表于 2012-5-10 08:01:10 | 显示全部楼层
本帖最后由 netegg 于 2012-6-8 11:33 编辑

大概写了个,不具有通用性(看到0-23,0-59感觉应该是时间方面的控制)
[au3]#include <GUIConstantsEx.au3>
#include <GuiDateTimePicker.au3>

$formMain = GUICreate("Test", 175, 75)
GUISetState()

$dtpCtrl = GUICtrlCreateDate('', 25, 25,100, -1, BitOR($dts_timeformat, $DTS_UPDOWN))
$dtpCtrlHandle = GUICtrlGetHandle($dtpCtrl)
_GUICtrlDTP_SetFormat($dtpCtrlHandle, "H:mm")
;Local $aA[14] = [True, @YEAR, @mon, @MDAY, 21, 45, @sec, True, @YEAR, @mon, @MDAY, 23, 59, @sec]
;_GUICtrlDTP_SetRange($dtpCtrlHandle, $aA) ; 定义变化上下限

While 1
    $msg = GUIGetMsg()
    Switch $msg
        Case $gui_event_close
            Exit
    EndSwitch
WEnd
[/au3]

评分

参与人数 1金钱 +10 收起 理由
wingking84 + 10 简单

查看全部评分

发表于 2012-6-8 00:57:56 | 显示全部楼层
学习拉,顶
发表于 2012-6-8 08:35:26 | 显示全部楼层
进来膜拜高手的!原以为提问这是咱菜鸟交流的地方,原来好多大牛都喜欢来!!!
发表于 2012-6-8 12:30:24 | 显示全部楼层
牛X不是吹的
发表于 2012-6-8 17:20:46 | 显示全部楼层
本帖最后由 user3000 于 2012-6-16 08:20 编辑

回复 9# benkel

膜拜下, 顺便鄙视9楼的老鬼! 你还是菜鸟啊? 那我等是小虫虫?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-9-20 13:55 , Processed in 0.089201 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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