2011-02-05 25 views
10

Tôi đang cố xử lý màu văn bản của TextBox trong DWM Glass. Tôi đọc rất nhiều tài liệu, vẫn không có giải pháp hoàn hảo.Thử nghiệm với TextBox dưới kính DWM

Mã kết quả gần như hoàn hảo tôi tìm thấy ở đây: http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/316a178e-252b-480d-8cc9-85814c2073d8/, nhưng có rất nhiều thao tác cụ thể và sự kiện (Ví dụ: nhập một số văn bản và nhấn nút Trang chủ).

Tôi đang cố giải quyết những vấn đề đó.

Mã sau đây là một đột biến của mã gốc, nhưng mã này không dựa trên bất kỳ sự kiện nào, chỉ WM_PAINT. Nó vẫn còn flicking, và caret (con trỏ văn bản) biến mất bằng cách nào đó!

Làm thế nào để tránh nhấp nháy và cách lấy lại dấu nháy (con trỏ văn bản)?

Cảm ơn.

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Windows.Forms; 
using System.Drawing; 
using System.Drawing.Imaging; 
using System.Diagnostics; 

namespace AeroWindowsFormsApplication 
{ 
    public class AeroTextBox : TextBox 
    { 
     private const int WM_PAINT = 0xf; 

     private bool _aeroFix; 

     public AeroTextBox() 
     { 
      SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true); 
     } 

     protected override void WndProc(ref Message m) 
     { 
      if (_aeroFix) 
      { 
       switch (m.Msg) 
       { 
        case WM_PAINT: 
         RedrawAsBitmap(); 
         m.Result = new IntPtr(1); 
         break; 

        default: 
         base.WndProc(ref m); 
         break; 
       } 
      } 
      else 
      { 
       base.WndProc(ref m); 
      } 
     } 

     private void RedrawAsBitmap() 
     { 
      using (Bitmap bm = new Bitmap(this.Width, this.Height)) 
      using (Graphics g = this.CreateGraphics()) 
      { 
       this.DrawToBitmap(bm, this.ClientRectangle); 
       g.DrawImageUnscaled(bm, -1, -1); 
      } 
     } 

     public bool AeroFix 
     { 
      get { return _aeroFix; } 
      set 
      { 
       if (_aeroFix != value) 
       { 
        Invalidate(); 
       } 

       _aeroFix = value; 
      } 
     } 
    } 
} 
+0

Tôi đã bắt đầu một tiền thưởng để cải thiện phương pháp chung. Chủ yếu là tránh flicking, tránh vô hiệu hóa, vv Tôi không thực sự nhớ như thế nào xấu xí mã phải được. – Lazlo

+0

Một điểm khác: Tôi không biết AeroFix làm gì trong mã này, vì nó chưa bao giờ được thiết lập. Nhưng xin vui lòng tham khảo các mã ban đầu trong VB (liên kết trong bài) mà chỉ ra một mã hiệu lực cho mỗi sự kiện. – Lazlo

+1

Bạn chỉ có thể sử dụng WPF và sống hạnh phúc mãi mãi. –

Trả lời

1

Nếu bạn đặt TransparencyKey dạng đến nền màu trong vùng kính sau đó, bạn có thể sử dụng bất kỳ kiểm soát nó, nhưng bạn không thể sử dụng các màu sắc được xác định trong TransparencyKey trong bất kỳ một các điều khiển được đặt ở đó.

Phương pháp này không thuận tiện cho phép bạn nhấp qua kính trên cửa sổ ở chế độ nền. Nhưng có thể có một cách xung quanh điều này quá.

CHỈNH SỬA: Tôi đã tìm kiếm điều này trong một thời gian dài ... bây giờ không thể thực hiện được. Carret được quản lý bởi chính API cửa sổ, bạn không thể ép buộc nó xuất hiện theo cách bạn muốn. Những gì bạn có thể làm là tự vẽ toàn bộ hộp văn bản ... nhưng điều đó có thể là quá nhiều công việc cho quá ít.

Tôi tóm tắt: GDI + và DWM không kết hợp rất tốt. Tôi từ bỏ.

+1

Phương pháp này cũng có một bất tiện khác khi hiển thị màu của TransparencyKey thay vì kính bên trong Hình ảnh với kênh alpha dần dần. – DxCK

+0

Đồng ý với DxCK. Và cách xung quanh vấn đề nhấp qua là đặt giá trị thành các byte khác nhau (200, 200, 201). Không có bất kỳ ý nghĩa nào để làm suy giảm câu trả lời của bạn, tôi hy vọng điều này sẽ không nhận được tiền thưởng theo mặc định. Nó trông giống như một câu trả lời "thợ săn tiền thưởng". Edit: Lol, tiền thưởng đã kết thúc vài phút trước. Tôi có thể chọn người nhận được nó. – Lazlo

+0

@Lazlo: tiền thưởng chỉ dành cho một người tự động khi có ít nhất 2 phiếu bầu. –

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