2009-08-26 34 views
18

Có rất nhiều bài viết giải quyết nhấp nháy trong Windows Forms. Phần lớn khuyên bạn nên đặt DoubleBuffered = true hoặc đặt một loạt các cờ ControlStyle. Tuy nhiên, không ai trong số này giúp giảm một TextBox nhấp nháy.Làm thế nào để ngăn chặn một Windows Forms TextBox từ nhấp nháy trên thay đổi kích cỡ?

Dưới đây là một vài câu hỏi liên quan:

Để mô phỏng vấn đề, tạo một dự án WinForms mới, thêm một TextBox, cho phép nhiều dòng, vô hiệu hóa word-wrap, thêm một bó văn bản, đặt Anchor sang Trái + Phải + Trên cùng + Dưới cùng. Bây giờ chạy và thay đổi kích thước. Văn bản nhấp nháy. Đối với các hộp văn bản bên trong một vài cú nhấp nháy TableLayoutPanel s nhấp nháy khi đổi kích thước thậm chí còn tồi tệ hơn.

Áp dụng các giải pháp được đề xuất trong các câu hỏi trên ở mức tốt nhất không được sửa lỗi; nếu tôi được thử nghiệm và đặt ControlStyle được bảo vệ trên TextBox Tôi có thể phá vỡ hoàn toàn (bằng cách bật UserPaint) nhưng không loại bỏ nhấp nháy.

Vì vậy, có cách nào để sửa lỗi nhấp nháy của văn bản trong Hộp văn bản không?

+1

Thú vị đăng bài, tôi có vấn đề tương tự với một điều khiển nhãn, nhưng trên cơ sở mà tôi đọc DoubleBuffer chỉ nên được thiết lập với AllPaintInWmPaint mà chỉ nên được thiết lập với UserPaint tôi đã không đệm đôi nó ... – Ian

+0

@romkyns, tôi đã cập nhật ans của tôi wer với một giải pháp tôi đã sử dụng trong quá khứ. – Ash

Trả lời

15

Tôi thường sử dụng một RichTextBox thay vì một textbox. Bằng cách đặt DetectUrls- và ShortcutsEnabled-properties thành false RTB hoạt động rất giống với TextBox và ... nó là nhấp nháy miễn phí.

+0

Đây chắc chắn là giải pháp nhanh nhất và dễ nhất. Tôi đã kiểm soát tùy chỉnh dựa trên TextBox và chỉ cần thay đổi cha mẹ để RichTextBox và - vấn đề được giải quyết. – Andy

+0

Đây không phải là câu trả lời được chấp nhận? Nó hoàn toàn chính xác, cảm ơn! (Cấp, nó sẽ không giúp các vấn đề nhấp nháy cho điều khiển con không phải là hộp văn bản, nhưng đó không phải là câu hỏi.) – neminem

0

Chúng tôi đã gặp phải cùng một loại vấn đề trong quá khứ và nó đi ra được sử dụng của quá nhiều docking và bảng bố trí bảng. Tôi sẽ đề nghị, nếu có thể, hãy thử xây dựng lại giao diện người dùng bằng cách sử dụng tối thiểu docking (vì bảng bố cục bảng cũng sử dụng kết nối nội bộ).

+0

Tôi cũng đã quan sát thấy nhấp nháy trở nên tồi tệ hơn khi số lượng điều khiển liên quan đến bố cục tăng lên. Thật không may là vẫn còn nhấp nháy ngay cả với bố trí tối thiểu nhất cần thiết để đạt được kích thước cơ bản - như trong ví dụ của tôi. –

4

Trong Windows Forms, thuộc tính DoubleBuffered không ảnh hưởng đến điều khiển con như hộp văn bản. Thay vào đó nó chỉ ảnh hưởng đến biểu mẫu hoặc Bảng điều khiển mà nó được đặt cho.

Nếu bạn muốn đệm đôi cho các phần tử con trên biểu mẫu, bạn sẽ cần phải thực hiện đệm đôi thủ công.

Bob Powell đã viết good article (và những người khác) về cách thực hiện việc này.

Ngoài ra, từ một forum answer Bob cũng nói:

Quyền sở hữu của một cửa sổ có nghĩa là họ sẽ nhấp nháy không kiểm soát được bởi vì bạn không thể kích đúp đệm ngoài khu vực cửa sổ mục tiêu. Bảng điều khiển có điều khiển con không thể là được thực hiện để tự đệm đôi bộ đệm đó là trẻ em chẳng hạn.

Cách duy nhất để thực hiện việc này là để tạo một điều khiển duy nhất thực hiện tất cả bản vẽ sử dụng dạng hệ thống đồ họa được giữ lại.

Do đó, để thay đổi kích thước hộp văn bản tự do bằng cách sử dụng bộ đệm đôi thủ công, bạn cần phải hiển thị hộp văn bản đó trở lại bộ đệm sau và hiển thị nó như một phần của bản cập nhật được lưu vào bộ đệm. Nếu thậm chí có thể, tôi không mong đợi điều này sẽ dễ dàng.

[Cập nhật]

Một số câu trả lời khác cho biết đây là vấn đề với Windows Forms cụ thể. Điều này là không chính xác, nó thực sự là sâu hơn sau đó và được gây ra bởi Windows GDI. Ví dụ, mở Notepad/Wordpad vv và dán một đoạn văn bản lớn, thay đổi kích thước cửa sổ và thông báo cùng một vấn đề nhấp nháy.

Đây là giải pháp cơ bản mà tôi đã sử dụng cách đây nhiều năm để làm điều tương tự. Nó là một biểu mẫu đơn giản có chứa một hộp văn bản nhiều dòng và một lớp tùy chỉnh kế thừa từ Bảng điều khiển. Cả hai điều khiển đều có cùng vị trí và kích thước. Nó sử dụng các hình thức ResizeBegin và ResizeEnd để hiển thị bảng điều khiển khi thay đổi kích thước, và hộp văn bản khác. Nó không hoàn hảo nhưng nó loại bỏ sự nhấp nháy.

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     Bitmap bm = null; 

     private void textBox1_Resize(object sender, EventArgs e) 
     { 

      Graphics g = textBox1.CreateGraphics(); 

      if (g.VisibleClipBounds.IsEmpty == false) 
      { 
       bm = new Bitmap((int)g.VisibleClipBounds.Width, (int)g.VisibleClipBounds.Height); 

       textBox1.DrawToBitmap(bm, new Rectangle(0, 0, (int)g.VisibleClipBounds.Width, (int)g.VisibleClipBounds.Height)); 

      } 

      g.Dispose(); 


     } 

     private void panelDB1_Paint(object sender, PaintEventArgs e) 
     { 
      if (bm != null) 
      { 
       e.Graphics.DrawImageUnscaled(bm, 0, 0,bm.Width,bm.Height); 
      } 
     } 

     private void Form1_ResizeBegin(object sender, EventArgs e) 
     { 
      panelDB1.BringToFront(); 
     } 

     private void Form1_ResizeEnd(object sender, EventArgs e) 
     { 
      panelDB1.SendToBack(); 
     } 
} 

class PanelDB : Panel 
{ 
    public PanelDB() 
    { 
     this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer,true);  
     //this.DoubleBuffered = true; 

    } 

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

Cảm ơn. Bài viết này có thể hữu ích đối với những người không quen với các kỹ thuật đệm kép, nhưng không thực sự giúp giải quyết câu hỏi. Về quyền sở hữu cửa sổ - Tôi nhận được cảm giác rằng TextBox gốc trên các cửa sổ vốn đã nhấp nháy và điều này là không thể khắc phục được mà không cần hack ... –

+0

Tôi đã thêm bản cập nhật cho câu hỏi của mình. Thật không may câu trả lời cho câu hỏi của bạn chỉ đơn giản là "bạn không thể", howver tôi nghĩ rằng một số thông tin cơ bản sẽ hữu ích. – Ash

+0

Khi kiểm tra một số mã cũ của tôi, tôi thấy nó đơn giản để hiển thị một hộp văn bản mà không nhấp nháy, sử dụng phương thức DrawToBitmap() vào một bitmap trong bộ nhớ. Nhưng điều này sẽ chỉ đơn giản là tạo ra một hình ảnh trên màn hình của hộp văn bản của bạn mà không bao giờ nhấp nháy khi thay đổi kích thước nhưng hoàn toàn vô dụng vì nó không cho phép bạn nhập văn bản. – Ash

-2

CHỨC NĂNG LockWindow AS DÀI KIỂM SOÁT GỬI ghDlg,% TEXT_UPPER,% WM_SETREDRAW, 0,0 CLEARBuffers END CHỨC NĂNG

CHỨC NĂNG UnlockWindow AS DÀI ClearBuffers KIỂM SOÁT GỬI ghDlg,% TEXT_UPPER,% WM_SETREDRAW, 1, 0 FUNCTION END

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