На стороне клиента у вас есть полупрозрачная серая форма (Form2), которая имеет размер экрана.Поверх этой формы у вас есть непрозрачная белая форма (Form3), центрированная на экране.В Form3
у вас есть прямоугольное отверстие в Top = Y
и Left = X
с координатами Form3
.
Я понимаю, что ваша проблема в том, что вы хотите нарисовать отверстие в Form2, которое выровнено поОтверстие в форме 3.
Вам необходимо преобразовать систему координат Form3
в Form2
с простым добавлением:
Form2.Hole.Left := Form3.Left + Form3.Hole.Left;
Form2.Hole.Top := Form3.Top + Form3.Hole.Top;
Это выровняет отверстия.Кажется, вы пытаетесь сделать что-то подобное в своих вычислениях, но вы ссылаетесь на Form2.Left
и Form2.Top
, которые бесполезны, поскольку они оба равны 0.
Если я неправильно понял ваш вопрос, и вы на самом деле хотели бы Form3
отверстие должно быть выровнено с отверстием Form2
, тогда вам нужно переместить Form3
в верхнюю левую часть экрана и не центрировать его ...
... Или, учитывая ваш комментарий: , если я рисую на стороне сервера в области, далекой от Form3
(клиент), например, больше на левой стороне экрана, нарисуйте только отверстие Form2
, а если я рисую больше в середине экрана, нарисуйтевыравнивание по обеим дырам будет выполнено простым заменой терминов:
Form3.Hole.Left := Form2.Hole.Left - Form3.Left
Form3.Hole.Top := Form2.Hole.Top - Form3.Top
Это преобразует Form2
координаты в Form3
координаты, которые могут стать отрицательными значениями (т.е. вне формы) вситуации, подобные вашему примеру.
Адаптируя вышеприведенное к вашему коду, вам нужно сначала обработать область формы 2 с полученными Form2.Hole
координатами, затем вычесть Form3
координаты (Left
а также Top
) из X1..Y2 и , затем обработайте область формы 3 *.
X1 := Round(StrToIntDef(List[0], 0) - Form2.Left); // Form2 props can be removed as hardcoded to 0
Y1 := Round(StrToIntDef(List[1], 0) - Form2.Top); // -"-
X2 := Round(StrToIntDef(List[2], 0) - Form2.Left); // -"-
Y2 := Round(StrToIntDef(List[3], 0) - Form2.Top); // -"-
FormRegion := CreateRectRgn(0, 0, Form2.Width, Form2.Height);
HoleRegion := CreateRectRgn(X1, Y1, X2, Y2);
CombineRgn(FormRegion, FormRegion, HoleRegion, RGN_DIFF);
SetWindowRgn(Form2.handle, FormRegion, true);
X1 := X1 - Form3.Left;
Y1 := Y1 - Form3.Top;
X2 := X2 - Form3.Left;
Y2 := Y2 - Form3.Top;
FormRegion := CreateRectRgn(0, 0, Form3.Width, Form3.Height);
HoleRegion := CreateRectRgn(X1, Y1, X2, Y2);
CombineRgn(FormRegion, FormRegion, HoleRegion, RGN_DIFF);
SetWindowRgn(Form3.handle, FormRegion, true);
Редактировать
Появляетсянелогично, что ваш Server.Form2
отличается от размера экрана (и, следовательно, Client.Form2
).Но, может быть, я так и не понял, для каких целей используется установка.
В любом случае, с одинаковыми по размеру центрированными Form3
, но с разными размерами экрана на сервере и на клиенте, вам нужно настроитьForm3.Hole
координаты на клиенте с половиной разницы между размерами экрана сервера и клиента, или, поскольку формы Form3
центрированы, вы можете рассчитать горизонтальную и вертикальную коррекцию, как
ResolutionCorrectionX := Server.Form3.Left - Client.Form3.Left;
ResolutionCorrectionY := Server.Form3.Top - Client.Form3.Top;
, что вы затемдобавьте к X- и Y-координатам для HoleRegion
Form3.
X1 := X1 - Form3.Left + ResolutionCorrectionX; // and similar for X2, Y1 and Y2
Кстати, просто из любопытства, почему вы используете Round()
для расчетов, основанных на целых числах?