Страница 1 из 1
Абсолютные координаты поля в окне
Добавлено: 23 Сентябрь 2020, 9:12
Игорь Столяров
Привет всем !
Нужно решить незамысловатую задачу:
- Есть MDI окно MyWindow и в нём поля ввода.
- По нажатию кнопки нужно точно накрыть поле ввода ?MyField другим открывшемся окном.
И вроде бы можно без проблем получить абсолютные координаты поля ?MyField в окне
и установить их как координаты нового окна:
Код: Выделить всё
NewWindow{Prop:XPos} = MyWindow{Prop:XPos} + MyWindow$?MyField{Prop:XPos}
NewWindow{Prop:YPos} = MyWindow{Prop:YPos} + MyWindow$?MyField{Prop:YPos}
И в общем случае - нет.

Новое окно не попадает на поле.
Точнее попадает как-то странно и смещается в зависимости от положения старого окна.

Я опять чего - то не понимаю ? Заранее спасибо за помощь.
Абсолютные координаты поля в окне
Добавлено: 23 Сентябрь 2020, 9:33
gopstop2007
Код: Выделить всё
GetWindowRect(?btn{Prop:Handle},address(loc:Rect)) ! узнать координаты
Абсолютные координаты поля в окне
Добавлено: 23 Сентябрь 2020, 9:48
Yufil
1. Метрики позиций и размеров считаются исходя из размеров шрифта, поэтому такие вещи надо делать в пикселах
Код: Выделить всё
OldWIndowPos Long, dim(4)
OldControlPos Long, dim(4)
...
! 0 - номер контрола окна. Всегда!
! До нажатия кнопки
0{ Prop:Pixels } = 1
GetPosition( 0, OldWindowPos[1], OldWindowPos[2], OldWindowPos[3], OldWindowPos[4] )
GetPosition( OldControl, OldControlPos[1], OldControlPos[2], OldControlPos[3], OldControlPos[4] )
0{Prop:Pixels } = 0
! Нажали кнопку.
Open(NewWindow)
Display()
0{Prop:Pixels} = 1
SetPosition(0, OldWindowPos[1] + OldControlPos[1])
0{Prop:Pixels} = 0
2. Когда новое окно открыто, координаты старого уже недоступны.
Я бы сначала сохранил позиции в старом окне, а потом открывал новое...
3. Возможно, ещё надо учитывать рамку окна.
Свойства Prop:ClientX, Prop:ClientY, Prop:ClientWidth и Prop:ClientHeight покажут позицию не самого окна, а его содержимого, не учитывая рамку. Возможно, вместо позиции окна надо учитывать позицию клиентской области
Абсолютные координаты поля в окне
Добавлено: 23 Сентябрь 2020, 12:00
Игорь Столяров
Yufil писал(а): 23 Сентябрь 2020, 9:48
Возможно, ещё надо учитывать рамку окна. Свойства Prop:ClientX, Prop:ClientY
Вот эта мысль у меня была первой. Но MyWindow{Prop:ClientX/Y} у меня упорно возвращают 0 (ноль).

Абсолютные координаты поля в окне
Добавлено: 23 Сентябрь 2020, 12:38
Дед Пахом
Достаточно взять абсолютные координаты поля (GetWindowRect) и задать их окну (SetWindowPos). Ниже рабочий пример.
Код: Выделить всё
PROGRAM
INCLUDE('winapi.inc'), ONCE
MAP
Open:Window2()
INCLUDE('printf.inc'), ONCE
END
Window1 WINDOW('Window 1'),AT(,,201,109),GRAY,SYSTEM,FONT('Segoe UI',9)
PROMPT('Move here!'),AT(38,23,93),USE(?PROMPT1),FONT(,,COLOR:White), |
COLOR(COLOR:Red)
BUTTON('Open Window 2'),AT(113,81,75),USE(?BUTTON1)
END
Window2 WINDOW('Window 2'),AT(,,80,68),GRAY,SYSTEM,FONT('Segoe UI',9)
END
ctrlWin TWnd
ctrlRect TRect
CODE
OPEN(Window1)
ACCEPT
CASE ACCEPTED()
OF ?BUTTON1
ctrlWin.Init(?PROMPT1)
ctrlWin.GetWindowRect(ctrlRect) !- ctrlRect: координаты PROMPT1 относительно экрана
START(Open:Window2)
END
END
Open:Window2 PROCEDURE()
newWin TWnd
CODE
OPEN(Window2)
newWin.Init(Window2)
newWin.SetWindowPos(0, ctrlRect.left, ctrlRect.top, 0, 0, SWP_NOSIZE) !- меняем положение окна
ACCEPT
END
Абсолютные координаты поля в окне
Добавлено: 23 Сентябрь 2020, 15:19
Yufil
Игорь Столяров писал(а): 23 Сентябрь 2020, 12:00
Yufil писал(а): 23 Сентябрь 2020, 9:48
Возможно, ещё надо учитывать рамку окна. Свойства Prop:ClientX, Prop:ClientY
Вот эта мысль у меня была первой. Но MyWindow{Prop:ClientX/Y} у меня упорно возвращают 0 (ноль).
Я привык ссылаться на реквизиты окна через номер 0. 0{Prop:ClientX} - координата для верхнего
открытого окна в текущем треде, как бы его ни звали.
Причём получить координаты надо только после открытия окна, внутри цикла Accept, в Event:OpenWindow или дальше ( Open(MyWindow) недостаточно )
А MyWindow может быть не открыто или быть открыто в другом треде.
Впрочем, я могу быть абсолютно неправ

Абсолютные координаты поля в окне
Добавлено: 23 Сентябрь 2020, 15:38
kreator
Игорь Столяров, сильно не попадает? Я могу допустить 1-2 пикселя. Может Вы через SetParent делаете? Там есть какие-то накладки.
Абсолютные координаты поля в окне
Добавлено: 23 Сентябрь 2020, 15:56
Игорь Столяров
kreator писал(а): 23 Сентябрь 2020, 15:38
сильно не попадает? Я могу допустить 1-2 пикселя
1-2 пикселя я бы своими глазами и не заметил.

Сдвигает заметно, вроде бы поймал, что сдвиг зависит от рамки окна Double / Resize.
По этому можно корректировать координаты -2/+2, и попробую ещё координаты через WinApi. Спасибо !

Абсолютные координаты поля в окне
Добавлено: 23 Сентябрь 2020, 16:22
Yufil
Как раз ширина рамки и определяется разницей между Prop:Xpos и Prop:ClientX, Prop:Width и Prop:ClientWidth, надо клиентскими координатами пользоваться. Или делать окна без рамок
Кстати, не будет полезно?
?Cancel{Prop:Xpos}=0{Prop:Width}-0{Prop:ClientX}-?Cancel{Prop:Width}
?OK{Prop:Xpos}=?Cancel{Prop:Xpos}-?OK{Prop:Width}