2015-10-22 4 views
1

Я написал этот код, который создаст закругленную угловую границу вокруг панели.Графика при перетаскивании за пределы экрана

public void DrawRoundRect(Graphics g, Pen p, float X, float Y, float width, float height, float radius) 
{ 
    GraphicsPath gp = new GraphicsPath(); 
    //Upper-right arc: 
    gp.AddArc(X + width - (radius * 2), Y, radius * 2, radius * 2, 270, 90); 
    //Lower-right arc: 
    gp.AddArc(X + width - (radius * 2), Y + height - (radius * 2), radius * 2, radius * 2, 0, 90); 
    //Lower-left arc: 
    gp.AddArc(X, Y + height - (radius * 2), radius * 2, radius * 2, 90, 90); 
    //Upper-left arc: 
    gp.AddArc(X, Y, radius * 2, radius * 2, 180, 90); 
    gp.CloseFigure(); 
    g.DrawPath(p, gp); 
    gp.Dispose(); 
} 

private void panel_Paint(object sender, PaintEventArgs e) 
{ 
    Graphics v = e.Graphics; 
    DrawRoundRect(v, Pens.White, e.ClipRectangle.Left, e.ClipRectangle.Top, e.ClipRectangle.Width - 1, e.ClipRectangle.Height - 1, 10); 
    base.OnPaint(e); 
} 

Он отлично работает, пока не погаснет экран, и это происходит: enter image description here

Кто-нибудь знает, что я сделал неправильно, или как решить проблему?

ответ

3

Вы неправильно понимаете, что означает ClipRectangle.

Это не говорит вам, насколько велика панель - она ​​сообщает вам, какая часть панели перерисовывается. Когда вы перемещаете форму вне экрана, ей нужно перерисовать части, которые меняли мониторы, но не те, которые остаются на исходном. Поэтому вместо перерисовки всей панели (когда ClipRectangle - это вся область панели, и ваш код работает), она говорит вам только перерисовать ее часть - и ClipRectangle намного меньше, чем панель, которую вы пытаетесь нарисовать.

ClipRectangle действительно функция оптимизации. Если вас это не волнует, вы можете полностью игнорировать его полностью - просто используйте 0, 0, panel.Width, panel.Height.

+0

Просто нужно было взять 1 от ширины и высоты, и это сработало, как чудо, спасибо за помощь и объяснение – TheHornyDonut

3

У вас есть две проблемы. Сначала полагается на e.ClipRectangle, то есть не размер панели. Вместо этого вам нужно использовать panel.ClientRectangle. Вот что вызывает размытие, когда вы перетаскиваете его с экрана и обратно.

Вы еще не нашли следующего, это гораздо более тонкий. Панель была разработана как контейнерный контроль и оптимизирует ее окраску. Перерисовывание только тех частей, которые обнаруживаются при изменении размера. Довольно важно, сделать изменение размера окна более терпимым. Это, однако, не будет хорошо работать для таких деталей, закругленные углы не будут правильно перекрашены. Похоже на эффект размазывания, менее выраженный, чем у вас сейчас. Это произойдет, когда вы измените размер панели, как правило, с помощью свойства Dock или Anchor.

Правильный способ сделать это - вывести свой собственный класс из Panel, установить для свойства ResizeRedraw значение true в конструкторе. Обычно вы почти всегда хотите установить DoubleBuffered на true, чтобы подавить видимое мерцание, которое у вас сейчас есть. Или используйте событие Resize панели, панель вызова. Invalidate().

+0

Спасибо, это очень помогло! :) – TheHornyDonut

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