Точное положение окна

Стивен Дел Ри (Stephen Del Rea)

Вопрос. Как вывести второе окно поверх существующего так, чтобы нижняя кромка второго окна была расположена точно на кромке первого окна (используя MOVE WINDOW в FPW 2.5b)?

Ответ. Я обнаружил, что ключ к достижению точного положения окна при исполнении команды MOVE WINDOW зависит от шрифта, используемого FoxPro по умолчанию в основном окне, а не в том, которое перемещается. Следовательно, если шрифты умолчания в окнах использованы разные, вам необходимо скорректировать отличия с использованием функции FONTMETRIC для учета высоты и средней ширины символов двух шрифтов. В начале вашего приложения или в блоке Setup первого по порядку окна определите глобальные (PUBLIC) переменные Mainheight и Mainwidth, которые хранят информацию о высоте и средней ширине символов шрифта главного окна. Обратите внимание, что пустое имя окна в вызове функции WFONT возвращает шрифт для основного окна:

mainheight = FONTMETRIC;
  (1,WFONT(1,""),WFONT(2,""))
mainwidth = FONTMETRIC;
  (6,WFONT(1,""),WFONT(2,""))

Затем, в блоке Setup второго (дочернего) окна определите координаты и высоту первого (родительского) окна, которые поместите в глобальные переменные:

w1wlrow = WLROW()
w1wlcol = WLCOL()
w1wrows = WROWS()

В коде Activate второго (дочернего) окна определите координату строки посредством вычитания высоты строки второго окна из координаты нижней кромки первого (родительского) окна. Координаты столбцов будут теми же самыми при совмещении левых кромок окон. Приведите обе координаты к системе координат основного экрана, умножив их на коэффициент пересчета, учитывающий различия в размерах шрифтов. И переместите второе окно в расчетную координату:

w2wlrow = (w1wlrow+w1wrows-WROWS('WINDOW2'))
* FONTMETRIC(1) / mainheight
w2wlcol = w1wlcol
* FONTMETRIC(6) / mainwidth
MOVE WINDOW WINDOW2 TO w2wlrow,w2wlcolSo

Независимо от используемых шрифтов (шрифты, установленные на машине пользователя, могут отличаться от указанных вами) окна должны быть организованы правильно. (Я предполагаю, что для родительского окна установлен тот же шрифт, что и для дочернего). При тестировании я обнаружил нечто, по-моему являющееся ошибкой в FPW 2.5b и, возможно, других версиях. Если первое (родительское) окно расположено в координатах (-1,-1), второе (дочернее) располагается со смещением от нижней кромки и смещение по вертикали равно примерно одной строке, а по горизонтали - примерно 1/4 строки. Перемещение первого окна по диагонали из координаты (-1,-1) приводит к тому, что второе окно позиционируется нормально. Я вношу компенсацию, помещая в блок Window Activate родительского окна следующий код:

r = WLROW()
c = WLCOL()
IF (r = -1) OR (c = -1)
   r = IIF(r = -1,0,r)
   c = IIF(c = -1,0,c)
   MOVE WINDOW WINDOW1 TO r,c
ENDIF
Hosted by uCoz