2010-11-08 56 views
6

tôi đã rút ra một vòng tròn ở dạng cửa sổLàm thế nào để xóa một vòng tròn được vẽ ở dạng C# windows?

Pen pen = new Pen(Color.Black, 3); 
Graphics gr = this.CreateGraphics(); 
gr.DrawEllipse(pen, 5,5,20,20); 

Làm thế nào để xóa nó ...

+0

Hoặc sử dụng Graphics.Clear() với một màu mong muốn, sử dụng logic tôi đăng tải như một câu trả lời, hoặc thực hiện this.Invalidate(). Cuối cùng sẽ chỉ đơn giản là buộc các hình thức để vẽ lại khu vực khách hàng mà có hiệu quả sẽ xóa vòng tròn. –

+0

Vì bạn đang sử dụng 'this.CreateGraphics', bạn có thể không vẽ nó trong sự kiện Paint. Điều đó có nghĩa là bất kỳ lúc nào biểu mẫu của bạn được vẽ lại (hoặc vì bạn gọi phương thức 'Invalidate' hoặc vì Windows gửi một thông báo' WM_PAINT'), vòng kết nối của bạn sẽ bị xóa. Nếu bạn muốn các vòng tròn được bán vĩnh viễn (ít nhất là ở lại đó cho đến khi bạn xóa nó một cách rõ ràng), bạn cần phải chắc chắn rằng bạn vẽ nó trong xử lý sự kiện Paint cho biểu mẫu của bạn, bằng cách sử dụng đối tượng Graphics được truyền vào 'PaintEventArgs' cho sự kiện. –

+0

Chỉ cần thu nhỏ cửa sổ và khôi phục lại cửa sổ. –

Trả lời

10

Bạn có thể vô hiệu hóa các khu vực bốc thăm bạn muốn làm mới ví dụ:

this.Invalidate(); 

về hình thức ...

15

Bạn cần phải rõ ràng đồ họa của bạn:

Graphics.Clear(); 

Nhưng tất cả số liệu rút ra sẽ bị xóa. Đơn giản, sau đó bạn sẽ cần phải vẽ lại tất cả các con số ngoại trừ vòng tròn đó.

Ngoài ra, bạn có thể sử dụng phương pháp làm mất hiệu lực:

Control.Invalidate() 

Nó cho thấy một khu vực phải vẽ lại bên trong đồ họa của bạn. Nhưng nếu bạn có số liệu giao nhau, bạn sẽ phải vẽ lại các hình bạn muốn hiển thị bên trong vùng ngoại trừ vòng tròn.

Điều này có thể trở nên lộn xộn, bạn có thể muốn xem cách thiết kế control graph hoặc sử dụng bất kỳ bố cục biểu đồ nào library.

+0

Tôi không thấy biểu đồ điều khiển (còn gọi là sơ đồ khối) phải làm gì với câu hỏi này. –

+0

Biểu đồ kiểm soát thường là cơ sở của cách xây dựng công cụ bố cục đồ họa. Do đó, nó có thể giúp xác định những gì cần phải được rút ra hoặc vô hiệu. Nó chỉ là một mở trên các chủ đề ... –

+2

không có Graphics.clear, và nếu bạn làm đồ họa gr; gr = ....; gr.clear() nó đưa ra một lỗi vì nó cần một đối số, một màu – barlop

5

Giả sử bạn đang đăng ký vào các sự kiện Paint hay trọng thói quen OnPaint bảo vệ, sau đó bạn sẽ cần phải thực hiện một cái gì đó như thế này:

bool paint = false; 

protected override void OnPaint(object sender, PaintEventArgs e) 
{ 
    if (paint) 
    { 
    // Draw circle. 
    } 
} 

sau đó, khi bạn muốn dừng vẽ một vòng tròn:

paint = false; 
this.Invalidate(); // Forces a redraw 
+0

Điều này có lợi ích của việc cho phép các hình thức để vẽ lại khu vực khách hàng của nó. Sử dụng Graphics.Clear sẽ vẽ trên khu vực khách hàng với một màu đồng nhất. –

+0

Nếu một hình vuông nằm trong vòng tròn và bạn làm mất hiệu lực vùng xung quanh vòng tròn, hình vuông cũng sẽ bị vô hiệu. Sử dụng kỹ thuật này, bạn sẽ phải vẽ bất kỳ thứ gì bên trong vùng mà bạn muốn hiển thị. –

+0

Có thể dễ dàng thực hiện nếu bạn chỉ cần đặt logic đó bên ngoài kiểm tra có điều kiện và vô hiệu lực khi bạn muốn biểu mẫu được vẽ lại. Logic OnPaint được gọi là mỗi lần biểu mẫu vô hiệu hóa một vùng (hoặc toàn bộ vùng máy khách biểu mẫu). –

2

Bạn không "xóa" nó mỗi lần, không có gì để xóa. Đó là một bản vẽ, bạn vẽ một cái gì đó khác trên nó hoặc bạn có thể gọi Graphics.Clear()method.

+0

Bạn chính xác, nhưng nếu anh ta vẽ trong Paint/OnPaint thì anh ta có thể chỉ đơn giản bao gồm một lá cờ để vẽ một vòng tròn hay không, sau đó vô hiệu hóa biểu mẫu. Logic nội bộ của biểu mẫu sẽ vẽ lại khu vực khách hàng của nó mà không có vòng tròn. –

2

Bạn có thể làm cho một con số của cùng một kích thước bằng cách sử dụng BackColor tầm kiểm soát của bạn mà bạn đang vẽ

sử dụng sau khi mã của bạn để xóa hình của bạn.

Pen p = new Pen(this.BackColor); 
gr.DrawEllipse(p, 5,5,20,20); 
-4

Việc xóa vòng tròn được vẽ từ c là rất đơn giản.

Chỉ có bốn bước: -

  1. ứng dụng mở tuabin
  2. đi đến lệnh mà bạn đã vẽ vòng tròn
  3. kéo lệnh
  4. nhấp chuột vào nút delete
2

Nếu bạn đang sử dụng Invalidate() và không hoạt động, hãy tạo panel.Refresh().

Điều đó sẽ hiệu quả với bạn.

+0

Tôi nghĩ rằng ý kiến ​​này là giải pháp ..... Vô hiệu hóa bảng điều khiển (hình thức, tab, ......) không phải là một ý tưởng tốt ....đặc biệt khi cần thay đổi đồ họa sau khi nhấp chuột hoặc bất kỳ sự kiện thay đổi thường xuyên nào ..... –

0

Trong thực tế, bạn có thể xóa vòng kết nối của bạn và không có gì trừ vòng kết nối của bạn.

Mọi thứ bạn cần đều giống như ảnh chụp màn hình của "trước trạng thái" của khu vực bạn muốn xóa, để tạo TextureBrush từ đó. Bạn có thể đạt được bước đó bằng một cái gì đó như thế này:

Bitmap _Background = new Bitmap(this.Width, this.Height); 
Graphics.FromImage(_Background).CopyFromScreen(this.Left, this.Top, 0, 0, this.Size); 

Dòng đầu tiên sẽ cung cấp cho bạn một bitmap trong kích thước biểu mẫu cửa sổ của bạn. Dòng thứ hai sẽ lưu một ảnh chụp màn hình của nó trong _Background-bitmap.

Bây giờ bạn tạo một TextureBrush ra khỏi nó:

Brush brsBackground = new TextureBrush(_Background); 

Điều tiếp theo bạn cần là kích thước của vòng tròn của bạn, vì vậy bạn nên lưu chúng vào một biến, nếu họ không phải là một giá trị cố định. Khi bạn nhận được chúng trong tầm tay, bạn có thể xóa khu vực cụ thể như sau:

Graphics gr = this.CreateGraphics(); 
gr.FillEllipse(brsBackground, 5, 5, 20, 20); // values referred to your example 

Xong!

số liệu Thậm chí phức tạp có thể bị xóa bằng cách này, giống như một GraphicsPath ví dụ:

GraphicsPath gp = new GraphicsPath(); // any kind of GraphicsPath 
gr.FillRegion(brsBackground, new Region(gp)); 
Các vấn đề liên quan