Вычисление координат для контекстного меню

MrShin
Дата: 04.03.2016 11:46:05
Хочу сделать, чтобы контекстное меню появлялось по нажатию кнопки. По умолчанию оно появляется в координатах текущего положения курсора, мне нужно, чтобы оно появлялось прямо под кнопкой.
Есть у кого-нибудь под рукой формулы пересчета относительных координат объекта на форме в координаты, необходимые для задания положения контекстного меню? Я так понимаю, там абсолютные координаты на экране.
MrShin
Дата: 04.03.2016 13:25:01
Может хотя бы формула преобразования относительных координат контрола в абсолютные у кого-то есть? Желательно без использования API
guest_rusimport
Дата: 05.03.2016 00:40:49
MrShin,
совсем без API, наверное, не получиться :)
MrShin
Дата: 06.03.2016 06:53:58
Спасибо большое, то что надо!
Диам
Дата: 09.03.2016 12:07:29
MrShin, у вас в коде обязательно переставлять фокус на элемент управления, к которому хотим вывести меню.
Вот функция, которая определяет прямоугольник для любого объекта на форме, даже для Label
Public Sub GetLeftBottom(ctrl As control, frm As Form, ByRef r2 As RECT)
'Определяет левый нижний угол контрола в экранных координатах
  Dim rFPW As RECT 'прямоугольник формы
  Dim rFPC As RECT 'прямоугольник клиентского окна формы
  Dim RecSel As Long 'учитывает, если есть выделение записи у формы
  Dim Zagolov As Long 'учитывает заголовок формы
  
  Dim BorderWidth As Long 'ширина границы
  Dim BorderHeight As Long 'высота границ
  
  With frm
    GetWindowRect .hWnd, rFPW
    GetClientRect .hWnd, rFPC
    RecSel = .CurrentSectionLeft / 15
    Zagolov = .CurrentSectionTop / 15
  End With
  BorderWidth = (rFPW.Right - rFPW.Left - rFPC.Right) / 2 'ширина границы формы-владельца
  BorderHeight = rFPW.Bottom - rFPW.Top - rFPC.Bottom - BorderWidth 'высота границы сверху (снизу =BorderWidth)
  r2.Left = rFPW.Left + BorderWidth + RecSel + ctrl.Left / 15
  r2.Right = r2.Left + ctrl.Width / 15
  r2.Top = rFPW.Top + BorderHeight + Zagolov + ctrl.Top / 15
  r2.Bottom = r2.Top + ctrl.Height / 15
End Sub
13-й квартал
Дата: 09.03.2016 13:33:27
Диам,

как минимум:
1) намертво зашита (hardcoded) магическая константа 15, в то время как это не константа (и, формально, два разных параметра);
2) не учитывается наличие полос прокрутки и их положение.


MrShin,
есть альтернатива - использовать интерфейс IAccessible (подключить библиотеку типов MS Office, в Object Browser включить Show Hidden Members, чтобы увидеть). Тулзу из Windows SDK, демонстрирующую возможности, прилагаю.