我正在尝试在 DWM Glass 下处理 TextBox 文本的颜色。我阅读了很多材料,仍然没有完美的解决方案。
我在这里找到了几乎完美的结果代码:http: //social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/316a178e-252b-480d-8cc9-85814c2073d8/,但它有很多闪烁和特定于事件的操作(例如:输入一些文本并按下主页按钮)。
我试图解决这些问题。
以下代码是原始代码的突变,但它不依赖任何事件,只是 WM_PAINT。它仍在闪烁,插入符号(文本光标)不知何故消失了!
如何防止闪烁,以及如何恢复插入符号(文本光标)?
谢谢。
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;
}
}
}
}