Как установить фокус ввода на динамически созданный контрол Edit? - VB

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Создаю через CreateWindowEx контрол EDIT со стилем ES_MULTILINE. Все работает нормально. Можно вводить текст, по нажатию ENTER - переход на новую строку. НО, если добавить на форму стандартную кнопку, она получает "частичный" фокус ввода и получается, что текст с клавиатуры вводится в EditBox, а нажатие ENTER - отправляется кнопке. Как передать контролу EDIT полный фокус ввода при нажатии ЛКМ по нему? Я пробовал получать оповещение WM_SETFOCUS, устанавливая затем фокус через функцию SetFocus или WM_NEXTDLGCTL, но это не помогло:
Листинг программы
  1. Option Explicit
  2. 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
  3. Private Const WS_EX_CLIENTEDGE As Long = &H200&
  4. Private Const WS_CHILD As Long = &H40000000
  5. Private Const WS_VISIBLE As Long = &H10000000
  6. Private Const ES_MULTILINE As Long = 4&
  7. Private Const ES_AUTOVSCROLL As Long = &H40&
  8. Private Const ES_NOHIDESEL As Long = &H100&
  9. Private Const ES_WANTRETURN As Long = &H1000&
  10. Private Const WM_GETTEXTLENGTH As Long = &HE
  11. Private Const WM_GETTEXT As Long = &HD&
  12.  
  13. Private Sub Form_Load()
  14. Dim DefaultText As String
  15. DefaultText = "1 строка " & vbCrLf & vbCrLf & "2 строка."
  16. hWndEdit = CreateWindowEx(WS_EX_CLIENTEDGE, StrPtr("EDIT"), StrPtr(DefaultText), _
  17. WS_CHILD Or WS_VISIBLE Or ES_MULTILINE Or ES_AUTOVSCROLL Or ES_NOHIDESEL Or ES_WANTRETURN, _
  18. 0&, 0&, Me.ScaleWidth / Screen.TwipsPerPixelX - 200, _
  19. Me.ScaleHeight / Screen.TwipsPerPixelY, Me.hwnd, 0&, 0&, ByVal 0&)
  20. lpPrevWndProc = SetWindowLong(hWndEdit, GWL_WNDPROC, AddressOf WndProc)
  21. End Sub
  22. Private Sub Form_Unload(Cancel As Integer)
  23. SetWindowLong hWndEdit, GWL_WNDPROC, lpPrevWndProc
  24. End Sub
  25. Private Sub Command1_Click()
  26. Debug.Print "Hello!"
  27. End SubOption Explicit
  28. 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
  29. Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  30. Public Declare Function SetFocus Lib "user32.dll" (ByVal hwnd As Long) As Long
  31. 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
  32. 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
  33. Public Const WM_SETFOCUS As Long = 7&
  34. Public Const GWL_WNDPROC As Long = (-4)
  35. Public Const WM_NEXTDLGCTL As Long = &H28&
  36. Public lpPrevWndProc As Long
  37. Public hWndEdit As Long
  38.  
  39. Public Function WndProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  40. Select Case uMsg
  41. Case WM_SETFOCUS
  42. 'Dim oldHandle As Long
  43. 'oldHandle = SetFocus(hWndEdit)
  44. 'Debug.Print "WM_SETFOCUS Edit"
  45. 'Debug.Print "Old handle = " & oldHandle
  46. 'Debug.Print "New handle = " & hWndEdit
  47. PostMessage Form1.hwnd, WM_NEXTDLGCTL, hWndEdit, 1
  48. End Select
  49. WndProc = CallWindowProc(lpPrevWndProc, hwnd, uMsg, wParam, lParam)
  50. End Function

Решение задачи: «Как установить фокус ввода на динамически созданный контрол Edit?»

textual
Листинг программы
  1. Option Explicit
  2.  
  3. 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
  4. 'Private Declare Function SetFocus2 Lib "user32" Alias "SetFocus" (ByVal hWnd As Long) As Long
  5.  
  6. Private Const WM_NEXTDLGCTL     As Long = &H28&
  7.  
  8. Private Sub Form_Load()
  9.     Timer1.Interval = 1000
  10. End Sub
  11.  
  12. Private Sub Timer1_Timer()
  13.     SendMessage Me.hWnd, WM_NEXTDLGCTL, 0&, ByVal 0&
  14.     Debug.Print "Worked"
  15.     'Debug.Print "Old = " & SetFocus2(Command2.hWnd) & ". New = " & Command2.hWnd
  16. End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.583 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы