Как установить фокус ввода на динамически созданный контрол Edit? - VB
Формулировка задачи:
Здравствуйте!
Создаю через CreateWindowEx контрол EDIT со стилем ES_MULTILINE.
Все работает нормально. Можно вводить текст, по нажатию ENTER - переход на новую строку.
НО, если добавить на форму стандартную кнопку, она получает "частичный" фокус ввода
и получается, что текст с клавиатуры вводится в EditBox, а нажатие ENTER - отправляется кнопке.
Как передать контролу EDIT полный фокус ввода при нажатии ЛКМ по нему?
Я пробовал получать оповещение WM_SETFOCUS, устанавливая затем фокус через функцию SetFocus или WM_NEXTDLGCTL, но это не помогло:
Листинг программы
- Option Explicit
- Private Declare Function CreateWindowEx Lib "user32.dll" Alias "CreateWindowExW" (ByVal dwExStyle As Long, ByVal lpClassName As Long, ByVal lpWindowName As Long, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long
- Private Const WS_EX_CLIENTEDGE As Long = &H200&
- Private Const WS_CHILD As Long = &H40000000
- Private Const WS_VISIBLE As Long = &H10000000
- Private Const ES_MULTILINE As Long = 4&
- Private Const ES_AUTOVSCROLL As Long = &H40&
- Private Const ES_NOHIDESEL As Long = &H100&
- Private Const ES_WANTRETURN As Long = &H1000&
- Private Const WM_GETTEXTLENGTH As Long = &HE
- Private Const WM_GETTEXT As Long = &HD&
- Private Sub Form_Load()
- Dim DefaultText As String
- DefaultText = "1 строка " & vbCrLf & vbCrLf & "2 строка."
- hWndEdit = CreateWindowEx(WS_EX_CLIENTEDGE, StrPtr("EDIT"), StrPtr(DefaultText), _
- WS_CHILD Or WS_VISIBLE Or ES_MULTILINE Or ES_AUTOVSCROLL Or ES_NOHIDESEL Or ES_WANTRETURN, _
- 0&, 0&, Me.ScaleWidth / Screen.TwipsPerPixelX - 200, _
- Me.ScaleHeight / Screen.TwipsPerPixelY, Me.hwnd, 0&, 0&, ByVal 0&)
- lpPrevWndProc = SetWindowLong(hWndEdit, GWL_WNDPROC, AddressOf WndProc)
- End Sub
- Private Sub Form_Unload(Cancel As Integer)
- SetWindowLong hWndEdit, GWL_WNDPROC, lpPrevWndProc
- End Sub
- Private Sub Command1_Click()
- Debug.Print "Hello!"
- End SubOption Explicit
- Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
- Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
- Public Declare Function SetFocus Lib "user32.dll" (ByVal hwnd As Long) As Long
- Public Declare Function SendMessage Lib "user32.dll" Alias "SendMessageW" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
- Public Declare Function PostMessage Lib "user32.dll" Alias "SendMessageW" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
- Public Const WM_SETFOCUS As Long = 7&
- Public Const GWL_WNDPROC As Long = (-4)
- Public Const WM_NEXTDLGCTL As Long = &H28&
- Public lpPrevWndProc As Long
- Public hWndEdit As Long
- Public Function WndProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
- Select Case uMsg
- Case WM_SETFOCUS
- 'Dim oldHandle As Long
- 'oldHandle = SetFocus(hWndEdit)
- 'Debug.Print "WM_SETFOCUS Edit"
- 'Debug.Print "Old handle = " & oldHandle
- 'Debug.Print "New handle = " & hWndEdit
- PostMessage Form1.hwnd, WM_NEXTDLGCTL, hWndEdit, 1
- End Select
- WndProc = CallWindowProc(lpPrevWndProc, hwnd, uMsg, wParam, lParam)
- End Function
Решение задачи: «Как установить фокус ввода на динамически созданный контрол Edit?»
textual
Листинг программы
- Option Explicit
- Private Declare Function SendMessage Lib "user32" Alias "SendMessageW" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
- 'Private Declare Function SetFocus2 Lib "user32" Alias "SetFocus" (ByVal hWnd As Long) As Long
- Private Const WM_NEXTDLGCTL As Long = &H28&
- Private Sub Form_Load()
- Timer1.Interval = 1000
- End Sub
- Private Sub Timer1_Timer()
- SendMessage Me.hWnd, WM_NEXTDLGCTL, 0&, ByVal 0&
- Debug.Print "Worked"
- 'Debug.Print "Old = " & SetFocus2(Command2.hWnd) & ". New = " & Command2.hWnd
- End Sub
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д