Тема: Как пересчитать экранные коорд. в коорд. MS Form (диал. окон)

Возможно кто-то уже встречался со следующей проблемой, если да, то подскажите пожалуста как её решить.
В AutoCAD свойства приложения application.left или Top. а так же значения ширины и высоты приложения имеют тип Integer и дают значения в колличестве пикселей экрана.
А аналогичные свойства Form (диалоговых окон) в VBA имеют тип Singl и выдаются в десятичных значениях.
Суть задачи: спозиционировать диалоговое окно к правой стороне окна самого приложения AutoCAD.
Проблема в том, что не понятно по какому алгоритму и в каких единицах Microsoft расчитывает координаты положения диалоговых окон и как их согласовать с координатами экрана.

Re: Как пересчитать экранные коорд. в коорд. MS Form (диал. окон)

Вот метод как я позиционирую форму, одна сторона прилегает к правой стороне экрана с отступлением равным ширине скролбара, снизу прилегает к таскбару

Private Sub Form_Resize()
'    fX = GetSystemMetrics(SM_CXFULLSCREEN)
'    fY = GetSystemMetrics(SM_CYFULLSCREEN)
    lngTemp = GetWindowLong(Me.hWnd, GWL_EXSTYLE)
    lngTemp = lngTemp Or WS_EX_LAYERED
    SetWindowLong Me.hWnd, GWL_EXSTYLE, lngTemp
    SetWindowPos Me.hWnd, HWND_TOPMOST, GetSystemMetrics(SM_CXFULLSCREEN) - (Me.Width) / 15 - 18, GetSystemMetrics(SM_CYFULLSCREEN) - (Me.Height) / 15 + 22, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOSIZE
    SetLayeredWindowAttributes Me.hWnd, 0, 235, LWA_ALPHA
End Sub

пользуйтесь ;)

Re: Как пересчитать экранные коорд. в коорд. MS Form (диал. окон)

последняя строка будет работать начиная с win2k ее можно удалить, она не имеет ни какого одношения к Вашему вопросу

Re: Как пересчитать экранные коорд. в коорд. MS Form (диал. окон)

Большое спасибо за помощь, буду разбираться что к чему.
До сих пор я использовал более примитивный код.
Но у него серьёзный недостаток, чтобы VBA определил
координаты центра формы, её необходимо обязательно вывести
на экран.

Private Sub UserForm_Initialize()
   With UserForm1
      FHeight = .Height: .Height = 0: Height0 = .Height
      FWidth = .Width: .Width = 0: Width0 = .Width
'Позиция: 1 цент относительно ызвавшего приложения, 2 центр экрана
      .StartUpPosition = 1
      .Show False: .Hide
      CenterOwnerLeft = .Left + .Width / 2
      CenterOwnerTop = .top + .Height / 2
      .StartUpPosition = 0
      .Height = FHeight: .Width = FWidth
      .top = Application.WindowTop + 62.5
      .Left = CenterOwnerLeft * 2 - FWidth - 30
      .Show
   End With
End Sub

Первые две строки приходится использовать для определения
минимального размера окна, чтобы в случае программного изменения
высоты формы она нормально отображалась и в Win2k и в WinXP, то есть
определяем поправку за разницу размера, не знаю как её правильно,
верхней информационной полосы формы.

Re: Как пересчитать экранные коорд. в коорд. MS Form (диал. окон)

Ещё раз спасибо SmeL за идею, всё прекрасно работает.
Если кого интерисует более подробная информация по
приведённым SmeL API функциям, лезьте суда, найдёте
разное полезное по API под VBA, с готовыми примерами:
http://citforum.ru/programming/vb/vba_winapi/
Но есть одна проблема, VBA для приложений не позволяет получить
идентификатор окна формы, у его форм просто нет такого свойства.
Поэтому для его получения необходимо использовать одну из следующих
API функции: FindWindow, FindWindowEx, GetWindow, GetTopWindow или GetActiveWindow.
Проблема же возникает когда загружено более одного окна с одинаковым
названием, причём найти нужно идентификатор скрытой формы, да ещё на
момент её инициализации. Решил её путём замены названия окна формы, перед
поиском идентификатора, на некий большой шестнадцатеричный код, который и задаю на поиск.
Но может всё же есть возможность получить идентификатор окна формы
на прямую по объекту: типа GetHandleInformation(UserForm1)