Требуется перемещать элемент управления так, чтобы он не выходил за границы формы. С левой границей отследить достижение границы оказалось легко:
if (PointToClient(p).X >= 0){/*код*/ }
Но когда я пытаюсь сделать так:
int w = ActiveForm.Size.Width;
if (PointToClient(p).X <= w){/*код*/ }
элемент всё равно уходит за правую границу. Т. е. Size.Width - это не правая граница формы.
В связи с этим вопрос: как определить правую границу?
Ответ
В качестве ответа могу предложить простое, «в лоб», но всё же решение в виде SLN
Там просто на форме бегает панелька, отталкиваясь от краев формы и верхней панели и проверяя, не выходят ли координаты контрола (панели) за установленные границы.
Сам код:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
namespace RightMargin
{
///
public MainForm()
{
InitializeComponent();
MoveActive = false;
deltaX = 1;
deltaY = 1;
}
void buttonCloseClick(object sender, EventArgs e)
{
MoveActive = false;
Close();
}
void ButtonStartClick(object sender, EventArgs e)
{
MoveActive = true;
while (MoveActive)
{
int newX = boxPanel.Left + deltaX;
int newY = boxPanel.Top + deltaY;
int maxX = ActiveForm.ClientSize.Width - boxPanel.Size.Width - 1;
int maxY = ActiveForm.ClientSize.Height - boxPanel.Size.Height - 1;
//Проверка координат
if (newX < 0)
{
newX = 0; deltaX = -deltaX;
}
if (newY < panelMenu.Size.Height)
{
newY = panelMenu.Size.Height; deltaY = -deltaY;
}
if (newX > maxX)
{
newX = maxX; deltaX = -deltaX;
}
if (newY > maxY)
{
newY = maxY; deltaY = -deltaY;
}
boxPanel.Left = newX;
boxPanel.Top = newY;
//Thread.Sleep(2);
Application.DoEvents();
}
}
void ButtonStopClick(object sender, EventArgs e)
{
MoveActive = false;
}
}
}
Комментариев нет:
Отправить комментарий