2009-06-03 27 views
5

Tôi đang cố gắng vẽ văn bản trên bảng điều khiển (Bảng điều khiển có hình nền).Tại sao văn bản được vẽ trên bảng điều khiển biến mất?

Nó hoạt động rực rỡ, nhưng khi tôi thu nhỏ và sau đó tối đa hóa ứng dụng, văn bản đã biến mất.

Mã của tôi:

using (Graphics gfx = Panel1.CreateGraphics()) 
{ 
    gfx.DrawString("a", new Font("Tahoma", 5), Brushes.White, new PointF(1, 1)); 
} 

Làm thế nào để giữ cho nó tĩnh vì vậy nó không bị lạc?

Trả lời

2

Nếu bạn không sử dụng sự kiện Paint, bạn chỉ vẽ trên màn hình nơi điều khiển xảy ra. Kiểm soát không nhận thức được điều này, do đó, không có ý tưởng rằng bạn dự định để văn bản ở lại đó ...

Nếu bạn đặt giá trị bạn muốn vẽ trên bảng điều khiển trong thuộc tính Tag, bạn có thể sử dụng cùng xử lý sự kiện sơn cho tất cả các bảng.

Ngoài ra, bạn cần phải vứt bỏ đối tượng Phông chữ đúng cách hoặc bạn sẽ có rất nhiều người trong số họ chờ đợi để được hoàn thành trước khi họ trả lại tài nguyên của họ cho hệ thống.

private void panel1_Paint(object sender, PaintEventArgs e) { 
    Control c = sender as Control; 
    using (Font f = new Font("Tahoma", 5)) { 
     e.Graphics.DrawString(c.Tag.ToString(), f, Brushes.White, new PointF(1, 1)); 
    } 
} 
4

Chỉ cần thêm một handler cho sự kiện Sơn:

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.DrawString("a", new Font("Tahoma", 5), Brushes.White, new PointF(1, 1)); 
} 
+0

Vâng, tôi không nói tất cả mọi thứ. Tôi có 62 bảng và tôi phải viết số nguyên khác nhau trên mỗi người, có cách nào khác hoặc bạn sẽ đề xuất điều đó như thế nào? –

+0

@John: Tôi khuyên bạn nên tạo điều khiển kế thừa từ Bảng điều khiển và tạo thuộc tính cho văn bản. Chỉ cần ghi đè lên OnPaint trong điều khiển của bạn để viết chuỗi (sử dụng cùng một mã). –

+0

Có, nhưng điều đó có nghĩa là 60 sự kiện OnPaint - bằng tay. : ( –

0

Khi bạn vẽ một cái gì đó, nó chỉ còn lại cho đến khi thời gian tiếp theo các hình thức được làm mới.

Khi biểu mẫu được làm mới, sự kiện Paint được gọi. Vì vậy, nếu bạn muốn đảm bảo văn bản của bạn không biến mất, bạn cần phải bao gồm mã rút ra nó trong sự kiện Paint.

Bạn có thể kích hoạt bản sao bằng cách sử dụng Control.Invalidate, nhưng bạn không thể dự đoán thời điểm chúng sẽ xảy ra.

+0

Vấn đề mới là tôi không phải viết "a", nhưng một số nguyên cụ thể và bảng điều khiển không phải là một, là cách duy nhất paintEvent để thực hiện việc này? –

+0

Biến nó thành tài sản của lớp học của bạn và chỉ đơn giản là rút ra giá trị của tài sản nói trên OnPaint –

9

Kế thừa từ Panel, thêm một tài sản mà đại diện cho văn bản mà bạn cần phải viết, và ghi đè lên OnPaintMethod():

public class MyPanel : Panel 
{ 
    public string TextToRender 
    { 
     get; 
     set; 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 
     e.Graphics.DrawString(this.TextToRender, new Font("Tahoma", 5), Brushes.White, new PointF(1, 1)); 
    } 
} 

Bằng cách này, mỗi Panel sẽ biết những gì nó cần để render, và sẽ biết làm thế nào để vẽ chính nó.

+0

+1: Đánh tôi theo giây :) –

+0

Chỉ cần một câu hỏi, tôi nên gọi "TextToRender =" myText "" hoặc nó sẽ tự nó? –

+1

John: Bạn sẽ cần đặt myPanel1.TextToRender = "a"; myPanel2.TextToRender = "b"; Ngoài ra, chúng sẽ "chỉ hoạt động" –

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