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;
}
}
}
}
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
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
Bạn chỉ có thể sử dụng WPF và sống hạnh phúc mãi mãi. –