找回密码
 加入
搜索
查看: 4146|回复: 7

[GUI管理] [已解决]关于GUICtrlCreateEdit中的强制性样式: $WS_TABSTOP 的问题

[复制链接]
发表于 2010-5-9 10:52:53 | 显示全部楼层 |阅读模式
本帖最后由 zjimmy 于 2010-5-17 22:09 编辑

帮助文档中指出,在 GUICtrlCreateEdit 中,$WS_TABSTOP 是强制的,这里我有一个疑问:
如果我需要在 Edit 中输入"制表符",即按下 {Tab},怎么办?
默认情况下,按下 {Tab} 就切换到另一个控件了。。。

评分

参与人数 1金钱 +10 收起 理由
afan + 10 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

 楼主| 发表于 2010-5-10 10:12:13 | 显示全部楼层
补充一下,我的版本是 3.3.0.0
 楼主| 发表于 2010-5-11 08:34:58 | 显示全部楼层
呃,没有什么人理我。。。论坛搜索也没有找到需要的。
发表于 2010-5-11 09:00:54 | 显示全部楼层
#include <GUIEdit.au3>
#include <WindowsConstants.au3>

$hGUI = GUICreate("", 400 ,300)

GUICtrlCreateEdit("", 5, 5, 390, 260, BitOR($ES_WANTRETURN, $WS_VSCROLL))
$hEdit = GUICtrlGetHandle(-1)

GUICtrlCreateButton("Ok", 220, 270, 80, 20)
GUICtrlCreateButton("Cancel", 310, 270, 80, 20)

$hEC = DllCallBackRegister("_EditProc", "int", "hWnd;uint;wparam;lparam")
$hOEC = _WinAPI_SetWindowLong($hEdit, -4, DllCallBackGetPtr($hEC))

GUISetState()
While GUIGetMsg() <> -3
WEnd
GUIDelete($hGUI)
DllCallbackFree($hEC)

Func _EditProc($hWnd, $iMsg, $iwParam, $ilParam)
        If ($iMsg = $WM_KEYDOWN) And ($iwParam = 9) Then
                Return GUICtrlSetData(3, GUICtrlRead(3) & @Tab)
        EndIf
        Return _WinAPI_CallWindowProc($hOEC, $hWnd, $iMsg, $iwParam, $ilParam)
EndFunc        ;==>_EditProc
截取WM_KEYDOWN消息。还涉及到插入符的位置问题,参考此贴:http://autoitx.com/forum.php?mod ... hlight=%C1%B7%CF%B0
 楼主| 发表于 2010-5-11 22:37:00 | 显示全部楼层
截取WM_KEYDOWN消息。还涉及到插入符的位置问题,参考此贴:
pusofalse 发表于 2010-5-11 09:00


强!
请问,关于这里的3怎么理解?
Return GUICtrlSetData(3, GUICtrlRead(3) & @Tab)
发表于 2010-5-11 22:48:59 | 显示全部楼层
回复 5# zjimmy


    就是第一个创建的控件
 楼主| 发表于 2010-5-12 10:26:58 | 显示全部楼层
那么,这里的3为什么不替换为 Edit 的 Control ID 呢?
#include <GUIEdit.au3>
#include <WindowsConstants.au3>

$hGUI = GUICreate("", 400 ,300)

$Edit = GUICtrlCreateEdit("", 5, 5, 390, 260, BitOR($ES_WANTRETURN, $WS_VSCROLL))
$hEdit = GUICtrlGetHandle(-1)

GUICtrlCreateButton("Ok", 220, 270, 80, 20)
GUICtrlCreateButton("Cancel", 310, 270, 80, 20)

$hEC = DllCallBackRegister("_EditProc", "int", "hWnd;uint;wparam;lparam")
$hOEC = _WinAPI_SetWindowLong($hEdit, -4, DllCallBackGetPtr($hEC))

GUISetState()
While GUIGetMsg() <> -3
WEnd
GUIDelete($hGUI)
DllCallbackFree($hEC)

Func _EditProc($hWnd, $iMsg, $iwParam, $ilParam)
        If ($iMsg = $WM_KEYDOWN) And ($iwParam = 9) Then
                Return GUICtrlSetData($Edit, GUICtrlRead($Edit) & @Tab)
        EndIf
        Return _WinAPI_CallWindowProc($hOEC, $hWnd, $iMsg, $iwParam, $ilParam)
EndFunc        ;==>_EditProc
另外,如果有两个以上 Edit,又应该怎么处理这个_EditProc 呢?
#include <GUIEdit.au3>
#include <WindowsConstants.au3>

$hGUI = GUICreate("", 400 ,300)

GUICtrlCreateEdit("", 5, 5, 390, 120, BitOR($ES_WANTRETURN, $WS_VSCROLL))
$hEdit1 = GUICtrlGetHandle(-1)

GUICtrlCreateEdit("", 5, 135, 390, 120, BitOR($ES_WANTRETURN, $WS_VSCROLL))
$hEdit2 = GUICtrlGetHandle(-1)

GUICtrlCreateButton("Ok", 220, 270, 80, 20)
GUICtrlCreateButton("Cancel", 310, 270, 80, 20)

$hEC = DllCallBackRegister("_EditProc", "int", "hWnd;uint;wparam;lparam")
$hOEC1 = _WinAPI_SetWindowLong($hEdit1, -4, DllCallBackGetPtr($hEC))

GUISetState()
While GUIGetMsg() <> -3
WEnd
GUIDelete($hGUI)
DllCallbackFree($hEC)

Func _EditProc($hWnd, $iMsg, $iwParam, $ilParam)
        If ($iMsg = $WM_KEYDOWN) And ($iwParam = 9) Then
                Return GUICtrlSetData(3, GUICtrlRead(3) & @Tab)
        EndIf
        Return _WinAPI_CallWindowProc($hOEC1, $hWnd, $iMsg, $iwParam, $ilParam)
EndFunc        ;==>_EditProc
 楼主| 发表于 2010-5-17 22:07:41 | 显示全部楼层
比较好的处理应该是这样:(感谢 A版 和 P版)
#include <GUIEdit.au3>
#include <WindowsConstants.au3>

$hGUI = GUICreate("", 400, 300)

GUICtrlCreateButton("Ok", 220, 270, 80, 20)
GUICtrlCreateButton("Cancel", 310, 270, 80, 20)

$Edit1 = GUICtrlCreateEdit("", 5, 5, 390, 120, BitOR($ES_WANTRETURN, $WS_VSCROLL))
$hEdit1 = GUICtrlGetHandle(-1)

$Edit2 = GUICtrlCreateEdit("", 5, 135, 390, 120, BitOR($ES_WANTRETURN, $WS_VSCROLL))
$hEdit2 = GUICtrlGetHandle(-1)

$hEC = DllCallbackRegister("_EditProc", "int", "hWnd;uint;wparam;lparam")
$hOEC1 = _WinAPI_SetWindowLong($hEdit1, -4, DllCallbackGetPtr($hEC))
$hOEC2 = _WinAPI_SetWindowLong($hEdit2, -4, DllCallbackGetPtr($hEC))

GUISetState()
While GUIGetMsg() <> -3
WEnd
GUIDelete($hGUI)
DllCallbackFree($hEC)

Func _EditProc($hWnd, $iMsg, $iwParam, $ilParam)
        If ($iMsg = $WM_KEYDOWN) And ($iwParam = 9) Then
                If $hWnd = $hEdit1 Then Return GUICtrlSetData($Edit1, GUICtrlRead($Edit1) & @TAB)
                If $hWnd = $hEdit2 Then Return GUICtrlSetData($Edit2, GUICtrlRead($Edit2) & @TAB)
        EndIf
        If $hWnd = $hEdit1 Then Return _WinAPI_CallWindowProc($hOEC1, $hWnd, $iMsg, $iwParam, $ilParam)
        If $hWnd = $hEdit2 Then Return _WinAPI_CallWindowProc($hOEC2, $hWnd, $iMsg, $iwParam, $ilParam)
EndFunc   ;==>_EditProc

评分

参与人数 1金钱 +9 收起 理由
lynfr8 + 9 很棒的见解

查看全部评分

您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2025-1-12 04:02 , Processed in 0.106302 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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