2010-04-13 25 views
11

Tôi đang cố gắng để có được từ Line # 1 tới Line # 2 trong các mã dưới đây:Không làm mất hiệu lực() cũng không Refresh() gọi OnPaint()

using System; 
using System.Windows.Forms; 

namespace MyNameSpace 
{ 
    internal class MyTextBox : System.Windows.Forms.TextBox 
    { 
     protected override void OnEnabledChanged(EventArgs e) 
     { 
      base.OnEnabledChanged(e); 
      Invalidate(); // Line #1 - can get here 
      Refresh(); 
     } 

     protected override void OnPaint(PaintEventArgs e) 
     { 
      base.OnPaint(e); 
      System.Diagnostics.Debugger.Break(); // Line #2 - can't get here 
     } 
    } 
} 

Tuy nhiên, có vẻ như neiter làm mất hiệu lực() cũng không làm mới() làm cho OnPaint (PaintEventArgs e) được gọi. Hai câu hỏi:

  1. Tại sao nó không hoạt động?
  2. Nếu không khắc phục được: Tôi chỉ muốn gọi OnPaint (PaintEventArgs e) để truy cập đối tượng e.Graphics - có cách nào khác để thực hiện việc này không?

Trả lời

13

Để ghi đè các bản vẽ của các điều khiển, bạn phải thiết lập các phong cách được UserPaint như thế này:

this.SetStyle(ControlStyles.UserPaint, true); 

Xem này để biết thêm thông tin:

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.setstyle.aspx

UserPaint Nếu đúng, kiểm soát tự sơn thay vì hệ điều hành làm như vậy. Nếu sai, sự kiện Paint không được nâng lên. Kiểu này chỉ áp dụng cho các lớp học bắt nguồn từ điều khiển .

+0

Cảm ơn rất nhiều, SLC! Tôi đang làm cho câu trả lời này được chấp nhận. – user181813

0
internal class MyTextBox : System.Windows.Forms.TextBox 
{ 
    public MyTextBox() 
    { 
     this.SetStyle(ControlStyles.UserPaint, true); 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 
    } 
} 
3

Edit: Sau khi đọc comment của Chris Tôi đồng ý có lẽ bạn không nên sử dụng này.


Để trả lời một phần khác của câu hỏi, bạn có thể có được một đồ họa đối tượng cho một điều khiển tùy ý với:

Graphics g = panel1.CreateGraphics(); 

Nhưng khi làm điều đó, bạn cũng chịu trách nhiệm cho việc làm sạch nó lên như vậy biểu mẫu chính xác là:

using (Graphics g = this.CreateGraphics()) 
    { 
    // all your drawing here 
    } 
+0

Nhưng có lẽ không nên làm điều này. Kiểm tra liên kết này: http://www.bobpowell.net/creategraphics.htm –

Các vấn đề liên quan