没有吧,没有隐藏啊! 一般控件都有 IMEMode 属性中文系统只能使用 0 1 2 三个属性值0 无(缺省设置)。 该值表明“无 IME 控制”。 当 IMEMode 属性被设置为 0 时,可以使用 IMEStatus 函数确定当前的 IME 状态。 1 IME 打开。 该数值表明 IME 已经被打开,可以输入汉字或日文字符。 该设置仅对日文、简体汉字和繁体汉字 IME 有效。 2 IME 关闭。 该模式表明 IME 被关闭,因此对象将处于英文输入模式。 该设置仅对日文、简体汉字和繁体汉字 IME 有效。
我是这么想的,不过有点问题,改改因该可以达到相似效果 在窗体放一个picturebox 再在这个picturebox上放一个label,设成透明,autosize 一个textbox设成没有边界Private Sub Form_Load() Text1.Move Len(Label1), 0, 2, Picture1.ScaleHeight End SubPrivate Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Text1.Move X, 0, 2, Picture1.ScaleHeight End SubPrivate Sub Text1_KeyPress(KeyAscii As Integer) Dim str As String str = Chr(KeyAscii) Label1.Caption = Label1.Caption + str Text1.Text = "" Text1.Move Len(Label1), 0, 2, Picture1.ScaleHeight End Sub ___ ( "> )( // ) [email protected] --//""------------ -/------
以前有人贴出过在picture中输入汉字的方法,参考 '-------------------------------------------------------------- '以下模块中 '-------------------------------------------------------------- Option ExplicitPrivate Declare Function CallNextHookEx Lib "user32" _ (ByVal hHook As Long, _ ByVal ncode As Long, _ ByVal wParam As Long, _ lParam As Any) As Long
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _ (ByVal idHook As Long, _ ByVal lpfn As Long, _ ByVal hmod As Long, _ ByVal dwThreadId As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" _ (ByVal hHook As Long) As Long
Private Declare Function GetKeyState Lib "user32" _ (ByVal nVirtKey As Long) As Integer
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _ (Destination As Any, _ Source As Any, _ ByVal Length As Long)Private Type PKBDLLHOOKSTRUCT VKCode As Long scanCode As Long flags As Long time As Long dwExtraInfo As Long End TypePrivate Const WH_KEYBOARD_LL = 13 Private Const HC_ACTION = 0 Private Const WM_KEYDOWN = &H100 Private Const VK_CONTROL = &H11 Private Const VK_SHIFT = &H10 Private Const VK_MULTIPLY = &H6A Private Const VK_ADD = &H6B Private Const VK_SEPARATOR = &H6C Private Const VK_SUBTRACT = &H6D Private Const VK_DECIMAL = &H6E Private Const VK_DIVIDE = &H6F Private Const VK_PRIOR = &H21 Private Const VK_NEXT = &H22 Private Const VK_END = &H23 Private Const VK_HOME = &H24 Private Const VK_LEFT = &H25 Private Const VK_UP = &H26 Private Const VK_DOWN = &H28 Private Const VK_RIGHT = &H27 Private Const VK_INSERT = &H2D Private Const VK_DELETE = &H2E Private Const VK_F1 = &H70 Private Const VK_F12 = &H7B Private Const VK_NUMLOCK = &H90 Private Const VK_NUMPAD0 = &H60 Private Const VK_NUMPAD9 = &H69 Private Const VK_RETURN = &HD Private Const VK_SPACE = &H20 Private Const VK_TAB = &H9 Private Const VK_ESCAPE = &H1B Private Const VK_BACK = &H8Private PrevHook As LongPublic Function LowLevelKeyboardProc(ByVal ncode As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long Dim p As PKBDLLHOOKSTRUCT Dim strKey As String
If ncode = HC_ACTION Then Select Case wParam Case WM_KEYDOWN CopyMemory p, ByVal lParam, Len(p)
If p.VKCode > 0 And p.VKCode < &H92 Then If (GetKeyState(VK_CONTROL) And &H8000) <> 0 Then strKey = "{Ctrl}+" End If
If (GetKeyState(VK_SHIFT) And &H8000) <> 0 Then strKey = strKey & "{Shift}+" End If
Select Case p.VKCode Case VK_MULTIPLY strKey = strKey & "{Multiply}" Case VK_ADD strKey = strKey & "{Add}" Case VK_SEPARATOR strKey = strKey & "{Separator}" Case VK_SUBTRACT strKey = strKey & "{Subtract}" Case VK_DECIMAL strKey = strKey & "{Decimal}" Case VK_DIVIDE strKey = strKey & "{Divide}" Case VK_PRIOR strKey = strKey & "{Prior}" Case VK_NEXT strKey = strKey & "{Nexe}" Case VK_END strKey = strKey & "{End}" Case VK_HOME strKey = strKey & "{Home}" Case VK_LEFT strKey = strKey & "{Left}" Case VK_UP strKey = strKey & "{Up}" Case VK_DOWN strKey = strKey & "{Down}" Case VK_RIGHT strKey = strKey & "{Right}" Case VK_INSERT strKey = strKey & "{Insert}" Case VK_DELETE strKey = strKey & "{Delete}" Case VK_BACK strKey = strKey & "{Back}" Case VK_F1 To VK_F12 strKey = strKey & "F" & CStr(p.VKCode - &H70) Case VK_NUMLOCK strKey = strKey & "{NumLock}" Case VK_NUMPAD0 To VK_NUMPAD9 strKey = strKey & CStr(p.VKCode - &H60) Case VK_RETURN strKey = strKey & "{Return}" Case VK_SPACE strKey = strKey & "{Space}" Case VK_TAB strKey = strKey & "{Tab}" Case VK_ESCAPE strKey = strKey & "{Escape}" Case &H30 To &H39, &H41 To &H5A strKey = strKey & Chr(p.VKCode) Case Else 'do nothing End Select Form1.picturebox1.print strKey End If
Case Else 'do nothing
End Select End If
CallNextHookEx WH_KEYBOARD_LL, ncode, wParam, lParam End FunctionPublic Sub Hook() PrevHook = SetWindowsHookEx(WH_KEYBOARD_LL, _ AddressOf LowLevelKeyboardProc, _ App.hInstance, _ 0) End SubPublic Sub ReleaseHook() Call UnhookWindowsHookEx(PrevHook) End Sub '-------------------------------------------------------------- '以下在窗体中(窗体中放一个picturebox) '-------------------------------------------------------------- Private Sub Form_Load() Call Hook End SubPrivate Sub Form_Unload(Cancel As Integer) Call ReleaseHook End Sub
一般控件都有 IMEMode 属性中文系统只能使用 0 1 2 三个属性值0 无(缺省设置)。
该值表明“无 IME 控制”。
当 IMEMode 属性被设置为 0 时,可以使用 IMEStatus 函数确定当前的 IME 状态。
1 IME 打开。
该数值表明 IME 已经被打开,可以输入汉字或日文字符。
该设置仅对日文、简体汉字和繁体汉字 IME 有效。
2 IME 关闭。
该模式表明 IME 被关闭,因此对象将处于英文输入模式。
该设置仅对日文、简体汉字和繁体汉字 IME 有效。
找了几个用PictureBox模仿TextBox的例子,但无一例外,都没有解决这个问题。请大家继续关注...
在窗体放一个picturebox
再在这个picturebox上放一个label,设成透明,autosize
一个textbox设成没有边界Private Sub Form_Load()
Text1.Move Len(Label1), 0, 2, Picture1.ScaleHeight
End SubPrivate Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Text1.Move X, 0, 2, Picture1.ScaleHeight
End SubPrivate Sub Text1_KeyPress(KeyAscii As Integer)
Dim str As String
str = Chr(KeyAscii)
Label1.Caption = Label1.Caption + str
Text1.Text = ""
Text1.Move Len(Label1), 0, 2, Picture1.ScaleHeight
End Sub ___
( ">
)(
// ) [email protected]
--//""------------
-/------
'--------------------------------------------------------------
'以下模块中
'--------------------------------------------------------------
Option ExplicitPrivate Declare Function CallNextHookEx Lib "user32" _
(ByVal hHook As Long, _
ByVal ncode As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _
(ByVal idHook As Long, _
ByVal lpfn As Long, _
ByVal hmod As Long, _
ByVal dwThreadId As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" _
(ByVal hHook As Long) As Long
Private Declare Function GetKeyState Lib "user32" _
(ByVal nVirtKey As Long) As Integer
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Any, _
Source As Any, _
ByVal Length As Long)Private Type PKBDLLHOOKSTRUCT
VKCode As Long
scanCode As Long
flags As Long
time As Long
dwExtraInfo As Long
End TypePrivate Const WH_KEYBOARD_LL = 13
Private Const HC_ACTION = 0
Private Const WM_KEYDOWN = &H100
Private Const VK_CONTROL = &H11
Private Const VK_SHIFT = &H10
Private Const VK_MULTIPLY = &H6A
Private Const VK_ADD = &H6B
Private Const VK_SEPARATOR = &H6C
Private Const VK_SUBTRACT = &H6D
Private Const VK_DECIMAL = &H6E
Private Const VK_DIVIDE = &H6F
Private Const VK_PRIOR = &H21
Private Const VK_NEXT = &H22
Private Const VK_END = &H23
Private Const VK_HOME = &H24
Private Const VK_LEFT = &H25
Private Const VK_UP = &H26
Private Const VK_DOWN = &H28
Private Const VK_RIGHT = &H27
Private Const VK_INSERT = &H2D
Private Const VK_DELETE = &H2E
Private Const VK_F1 = &H70
Private Const VK_F12 = &H7B
Private Const VK_NUMLOCK = &H90
Private Const VK_NUMPAD0 = &H60
Private Const VK_NUMPAD9 = &H69
Private Const VK_RETURN = &HD
Private Const VK_SPACE = &H20
Private Const VK_TAB = &H9
Private Const VK_ESCAPE = &H1B
Private Const VK_BACK = &H8Private PrevHook As LongPublic Function LowLevelKeyboardProc(ByVal ncode As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Dim p As PKBDLLHOOKSTRUCT
Dim strKey As String
If ncode = HC_ACTION Then
Select Case wParam
Case WM_KEYDOWN
CopyMemory p, ByVal lParam, Len(p)
If p.VKCode > 0 And p.VKCode < &H92 Then
If (GetKeyState(VK_CONTROL) And &H8000) <> 0 Then
strKey = "{Ctrl}+"
End If
If (GetKeyState(VK_SHIFT) And &H8000) <> 0 Then
strKey = strKey & "{Shift}+"
End If
Select Case p.VKCode
Case VK_MULTIPLY
strKey = strKey & "{Multiply}"
Case VK_ADD
strKey = strKey & "{Add}"
Case VK_SEPARATOR
strKey = strKey & "{Separator}"
Case VK_SUBTRACT
strKey = strKey & "{Subtract}"
Case VK_DECIMAL
strKey = strKey & "{Decimal}"
Case VK_DIVIDE
strKey = strKey & "{Divide}"
Case VK_PRIOR
strKey = strKey & "{Prior}"
Case VK_NEXT
strKey = strKey & "{Nexe}"
Case VK_END
strKey = strKey & "{End}"
Case VK_HOME
strKey = strKey & "{Home}"
Case VK_LEFT
strKey = strKey & "{Left}"
Case VK_UP
strKey = strKey & "{Up}"
Case VK_DOWN
strKey = strKey & "{Down}"
Case VK_RIGHT
strKey = strKey & "{Right}"
Case VK_INSERT
strKey = strKey & "{Insert}"
Case VK_DELETE
strKey = strKey & "{Delete}"
Case VK_BACK
strKey = strKey & "{Back}"
Case VK_F1 To VK_F12
strKey = strKey & "F" & CStr(p.VKCode - &H70)
Case VK_NUMLOCK
strKey = strKey & "{NumLock}"
Case VK_NUMPAD0 To VK_NUMPAD9
strKey = strKey & CStr(p.VKCode - &H60)
Case VK_RETURN
strKey = strKey & "{Return}"
Case VK_SPACE
strKey = strKey & "{Space}"
Case VK_TAB
strKey = strKey & "{Tab}"
Case VK_ESCAPE
strKey = strKey & "{Escape}"
Case &H30 To &H39, &H41 To &H5A
strKey = strKey & Chr(p.VKCode)
Case Else
'do nothing
End Select
Form1.picturebox1.print strKey
End If
Case Else
'do nothing
End Select
End If
CallNextHookEx WH_KEYBOARD_LL, ncode, wParam, lParam
End FunctionPublic Sub Hook()
PrevHook = SetWindowsHookEx(WH_KEYBOARD_LL, _
AddressOf LowLevelKeyboardProc, _
App.hInstance, _
0)
End SubPublic Sub ReleaseHook()
Call UnhookWindowsHookEx(PrevHook)
End Sub
'--------------------------------------------------------------
'以下在窗体中(窗体中放一个picturebox)
'--------------------------------------------------------------
Private Sub Form_Load()
Call Hook
End SubPrivate Sub Form_Unload(Cancel As Integer)
Call ReleaseHook
End Sub
这种做法不是我想要的,我自己做了一个表格控件,现在就是想要实现象Excel那样的效果,表格客户区并不是TextBox,但仍可显示输入法状态。