2010-07-13 2 views
1

Это мой код ... curX и curY - это мои текущие координаты X и Y, а tmpX и tmpY - относительные значения X и Y (насколько перемещена мышь).Как сохранить координаты в пределах экрана?

curX:= curX+tmpX; 
curY:= curY+tmpY; 

Я использую эти значения для перемещения/управления своей формой в форме курсора.
Как я могу держать курсоры внутри экрана?

Я попытался ограничить значения до тех пор, пока Screen.Height и Screen.Width ... вот код.

if(curX>Screen.Width) then 
    curX:=Screen.Width; 
if(curY>Screen.Height) then 
    curY:=Screen.Height; 

но это не сработало.


Решено! (Сорт):

curX:= max(0, min((curX+tmpX), Screen.Width)); 
curY:= max(0, min((curY+tmpY), Screen.Height)); 

Единственная проблема у меня есть, что (0,0), по-видимому, не верхний самый левый (очень близко, хотя, только пару пикселей прочь я думаю) и (Screen. Width, Screen.Height) не самый верхний правый (также закрывается, курсор исчезает справа, но я думаю, что один из них должен вести себя таким образом).

+0

Как вы его ограничили, разместите свой код. –

ответ

2

Вы можете создавать периодические граничные условия, вычисляя (curX + tmpX) mod (screenSizeX) или ограничивая значения curX с помощью curX:= min(curX+tmpX, screenSizeX).

+0

Спасибо за ответ. По какой-то странной и забавной причине, когда я использую решение мод и перемещаю мышь в крайнее правое положение, курсоры исчезают справа и выходят влево, а когда я перемещаю его снизу, он выходит вверху (хотя это не так когда я перемещаю его в крайнее левое или верхнее). Есть ли способ сделать это согласованным со всех сторон? – Dian

+0

Это «периодическое» граничное условие. Вы должны использовать второе решение с функцией min(). – zoli2k

+0

Да, спасибо, я использовал min и max (потому что только мин не останавливал курсор от исчезновения сверху и слева). Странно, что я не знаю правильных координат границ. : D – Dian

1

Если вы ограничиваете его должным образом, он не выходит за пределы вашего диапазона. Отправьте свой код, если вы хотите узнать, почему он сломан.

var1 := Inc(var1,amt); 
var2 := Inc(var1,amt); 
if var1 > limit1 then 
    var1 := limit1; 
if var2 > limit2 then 
    var2 := limit2; 

Вы должны быть осторожны, если ваш лимит отключен от всех экранов вашей системы, а не только текущего экрана. не у всех есть только один экран. У некоторых людей есть несколько экранов.

+0

Это очень похоже на мое решение, но я не знаю, почему это не сработало. Курсор все еще исчез. Благодарим за ответ, но я буду держать это в виду в нескольких экранах. – Dian

+0

Попробуйте вычесть немного из ваших пределов. Помните, что когда курсор находится в большой степени экрана, положение, которое вы устанавливаете, является видимым концом курсора, который, вероятно, является верхним левым углом. Эрго, ты ничего не видишь. Или один пиксель, который является концом курсора. –

Смежные вопросы