2012-02-10 1 views
1

У меня есть приложение VB.NET WinForms. Я рисую кучу фигур на панели программно с GDI +. Теперь я хочу каким-то образом выделить небольшую прямоугольную часть этой панели. Выделенная область будет перемещаться вокруг. Я не хочу перерисовывать всю панель, потому что слишком много обработки, и это вызывает мерцание. Что это лучший способ сделать это?Выделение области панели

Спасибо.

+0

Что вы имеете в виду под «выделенной области будет двигаться вокруг много»? Это какой-то фиксированный прямоугольник, который полупрозрачен, вы захватите мышью? Или вы выделяете область через действия mousedown-mousemove-mouseup? Больше контекста, пожалуйста. – LarsTech

ответ

1

Можете ли вы добавить прозрачную панель в качестве дочернего элемента вашей существующей панели (и ее док-станцию), а затем сделать свои основные моменты на прозрачной панели?

Вот очень рудиментарные пример:

public partial class Form1 : Form 
{ 
    private Panel pan = new Panel(); 
    private Panel trans = new Panel(); 

    private bool clicked { get; set; } 
    private Point mouse { get; set; } 

    public Form1() 
    { 
     InitializeComponent(); 
     this.Load += new EventHandler(Form1_Load); 
    } 

    public void Form1_Load(object sender, EventArgs e) 
    { 
     pan.Dock = DockStyle.Fill; 
     pan.BackColor = Color.White; 

     trans.Dock = DockStyle.Fill; 
     trans.BackColor = Color.FromArgb(0, 0, 0, 0); 

     pan.Paint += new PaintEventHandler(DrawSomeShapes); 
     trans.MouseClick += new MouseEventHandler(trans_MouseClick); 
     trans.Paint += new PaintEventHandler(DrawHighlight); 

     pan.Controls.Add(trans); 
     this.Controls.Add(pan); 

     trans.BringToFront(); 
    } 

    public void DrawSomeShapes(object sender, PaintEventArgs e) 
    { 
     var g = e.Graphics; 

     var p = new Pen(Color.Black, 1F); 
     g.DrawRectangle(p, new Rectangle(0, 0, 100, 100)); 
     g.DrawRectangle(p, new Rectangle(20, 20, 50, 50)); 
     g.DrawRectangle(p, new Rectangle(10, 50, 100, 25)); 
     g.DrawRectangle(new Pen(Color.Red, 1F), new Rectangle(new Point(50, 50), new Size(50, 50))); 
    } 

    public void DrawHighlight(object sender, PaintEventArgs e) 
    { 
     if (clicked) 
     { 
      var g = e.Graphics; 
      var b = new SolidBrush(Color.FromArgb(50, 50, 50, 50)); 
      g.FillRectangle(b, mouse.X, mouse.Y, 50, 50); 

      clicked = false; 
     } 
    } 

    public void trans_MouseClick(object sender, MouseEventArgs e) 
    { 
     mouse = e.Location; 
     trans.Invalidate(); 
     clicked = true; 
    } 
} 
+0

Это сработало. Спасибо. – mcu

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