Показать все ControlTipText в пользовательской форме при нажатии «Alt» - PullRequest
1 голос
/ 12 марта 2019

Я пытаюсь добавить ControlTipText ко всем MSForms.Control во всех пользовательских формах, которые могут отображаться.

После того, как все они добавлены, я хочу показать все ControlTipText при нажатии «Alt», чтобы я мог легко редактировать Controltips на листе Excel.

Принимая Baby-Steps, я сначала «попытался» мгновенно сделать ControlTip видимым при добавлении в него значения.

Что у меня сейчас есть:

Dim tips As Worksheet
Set tips = Worksheets("CONTROLTIPS")

Dim i As Integer
Dim ctrl As MSForms.Control

i = 0
For Each ctrl In uf.Controls        
    ctrl.ControlTipText = tips.Cells(i + 3, 2).Value        
   ' ctrl .... ("TIPTEXT").Visible = True ?!?        
    i = i + 1        
Next ctrl

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Нет прямого способа показать всплывающую подсказку элемента управления.Единственный способ - симулировать mouse hover с помощью API.Вот очень простой пример.Не стесняйтесь вносить изменения в соответствии с вашими потребностями.

Prep :

  1. Создайте пустую пользовательскую форму
  2. Поместите командную кнопку на пользовательскую форму иустановите для его текста подсказки все, что вам нужно.

Логика :

Когда нажата клавиша ALT , наведите курсор мыши насоответствующий элемент управления, таким образом вызывая текст подсказки элемента управления

Код

Вставьте этот код в форму пользователя

Option Explicit

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long

Private Declare Function GetDeviceCaps Lib "Gdi32" _
(ByVal hDC As Long, ByVal nIndex As Long) As Long

Private Declare Function ReleaseDC Lib "user32" _
(ByVal hwnd As Long, ByVal hDC As Long) As Long

Private Declare Function ClientToScreen Lib "user32" _
(ByVal hwnd As Long, lpPoint As POINTAPI) As Long

Private Declare Function SetCursorPos Lib "user32" _
(ByVal X As Long, ByVal Y As Long) As Long

Private Const Xindex = 88
Private Const Yindex = 90

Private Type POINTAPI
    X As Long
    Y As Long
End Type

'~~> Trap the Alt key in the keydown eveent
Private Sub CommandButton1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 18 Then MoveMouseOnTopOf Me, CommandButton1
End Sub

'~~> Simulate mouse hover
Public Sub MoveMouseOnTopOf(frm As Object, ctl As Object)
    Dim P As POINTAPI
    Dim usrfrmHwnd As Long
    Dim hDC As Long
    Dim X As Double, Y As Double

    hDC = GetDC(0)
    X = 72 / GetDeviceCaps(hDC, Xindex)
    Y = 72 / GetDeviceCaps(hDC, Yindex)
    ReleaseDC 0, hDC

    P.X = (ctl.Left + (ctl.Width \ 2)) / X
    P.Y = (ctl.Top + (ctl.Height \ 2)) / Y

    usrfrmHwnd = FindWindow(vbNullString, frm.Caption)
    ClientToScreen usrfrmHwnd, P

    SetCursorPos P.X, P.Y
End Sub

Вы можете прочитать и понять оAPI, используемые выше на сайте AllAPI .

1 голос
/ 12 марта 2019

Я хочу показать все ControlTipText при нажатии 'Alt'

Насколько я могу судить, похоже, это причина того, что вы начали эту тему.

Значения из подсказок управления сохраняются в функции .ControlTipText.AFAIK кнопка ALT не покажет все подсказки управления, и нет аналогичной альтернативы.Что вы МОЖЕТЕ сделать, так это показать все подсказки управления вместе с соответствующими им элементами управления в окне сообщения:

Private Sub UserForm_Initialize
    Dim ctrl As Control
    For Each ctrl In Me.Controls
        txt = txt & ctrl.Name & ": " & ctrl.ControlTipText & vbNewLine
    Next ctrl
    MsgBox txt
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...