Абсолютные координаты поля в окне

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4929
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

Абсолютные координаты поля в окне

Сообщение Игорь Столяров »

Привет всем !

Нужно решить незамысловатую задачу:
- Есть MDI окно MyWindow и в нём поля ввода.
- По нажатию кнопки нужно точно накрыть поле ввода ?MyField другим открывшемся окном.

И вроде бы можно без проблем получить абсолютные координаты поля ?MyField в окне
и установить их как координаты нового окна:

Код: Выделить всё

  NewWindow{Prop:XPos} = MyWindow{Prop:XPos} + MyWindow$?MyField{Prop:XPos}
  NewWindow{Prop:YPos} = MyWindow{Prop:YPos} + MyWindow$?MyField{Prop:YPos}
И в общем случае - нет. :( Новое окно не попадает на поле.
Точнее попадает как-то странно и смещается в зависимости от положения старого окна. :(
Я опять чего - то не понимаю ? Заранее спасибо за помощь.
«V» значит Вендетта !

gopstop2007
✯ Ветеран ✯
Сообщения: 1485
Зарегистрирован: 25 Март 2009, 21:55

Абсолютные координаты поля в окне

Сообщение gopstop2007 »

Код: Выделить всё

GetWindowRect(?btn{Prop:Handle},address(loc:Rect))        ! узнать координаты
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп

Yufil
Ветеран движения
Сообщения: 1251
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

Абсолютные координаты поля в окне

Сообщение 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 покажут позицию не самого окна, а его содержимого, не учитывая рамку. Возможно, вместо позиции окна надо учитывать позицию клиентской области

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4929
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

Абсолютные координаты поля в окне

Сообщение Игорь Столяров »

Yufil писал(а):
23 Сентябрь 2020, 9:48
Возможно, ещё надо учитывать рамку окна. Свойства Prop:ClientX, Prop:ClientY
Вот эта мысль у меня была первой. Но MyWindow{Prop:ClientX/Y} у меня упорно возвращают 0 (ноль). :(
«V» значит Вендетта !

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2519
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

Абсолютные координаты поля в окне

Сообщение Дед Пахом »

Достаточно взять абсолютные координаты поля (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
  
С уважением, ДП

Yufil
Ветеран движения
Сообщения: 1251
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

Абсолютные координаты поля в окне

Сообщение 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 может быть не открыто или быть открыто в другом треде.

Впрочем, я могу быть абсолютно неправ :)

kreator
✯ Ветеран ✯
Сообщения: 3989
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Абсолютные координаты поля в окне

Сообщение kreator »

Игорь Столяров, сильно не попадает? Я могу допустить 1-2 пикселя. Может Вы через SetParent делаете? Там есть какие-то накладки.
We are hard at work… for you. :)

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4929
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

Абсолютные координаты поля в окне

Сообщение Игорь Столяров »

kreator писал(а):
23 Сентябрь 2020, 15:38
сильно не попадает? Я могу допустить 1-2 пикселя
1-2 пикселя я бы своими глазами и не заметил. ;)
Сдвигает заметно, вроде бы поймал, что сдвиг зависит от рамки окна Double / Resize.
По этому можно корректировать координаты -2/+2, и попробую ещё координаты через WinApi. Спасибо ! :)
«V» значит Вендетта !

Yufil
Ветеран движения
Сообщения: 1251
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

Абсолютные координаты поля в окне

Сообщение 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}

Ответить