- Код: Выделить всё
Private Declare Function GetCaretPos Lib _
"user32" (lpPoint As POINTAPI) As Long
О ней ничего внятного даже API-Guide сказать не может.
На самом деле, она бывает очень полезна и позволяет получить... позицию каретки (или символа вставки) в текстовом поле или RichTextBox'е.
Это может очень помочь при проектировании, скажем, приложений с функцией предикативного ввода - чтобы точно отпозиционировать список вариантов рядом с местом ввода текста. Вот!
А теперь пример:
- Код: Выделить всё
Public Sub PosList(ListObject As Control, RelativeObject As Control)
On Error Resume Next
Dim pt As POINTAPI
GetCaretPos pt
ListObject.Move pt.X * Screen.TwipsPerPixelX + _
RelativeObject.FontSize + 300, pt.Y * Screen.TwipsPerPixelY + _
RelativeObject.FontSize * 2 * Screen.TwipsPerPixelY + 150
If ListObject.Left + ListObject.Width >= _
RelativeObject.Width Then
ListObject.Move RelativeObject.Left + _
RelativeObject.Width - ListObject.Width
End If
If ListObject.Top + ListObject.Height >= _
RelativeObject.Height - 1000 Then
ListObject.Move ListObject.Left, _
RelativeObject.Top + RelativeObject.Height - _
ListObject.Height
End If
End Sub
Здесь RelativeObject - это элемент, относительно которого надо позиционировать список, а ListObject - элемент, который необходимо переместить.
Если на форме слева или сверху находятся дополнительные элементы, то, вполне возможно, что позиционирование немного "съедет". Чтобы этого не происходило, просто включите высоту (Height) и ширину (Width) в соответствующие формулы для высчитывания расстояния сверху (Top) и слева (Left).