Estoy tratando de lidiar con el color del texto de TextBox en DWM Glass. He leído mucho material, todavía no hay una solución perfecta.Pruebas con TextBox en cristal DWM
El código de resultados casi perfecto que encontré aquí: http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/316a178e-252b-480d-8cc9-85814c2073d8/, pero tiene muchas operaciones rápidas y específicas de un evento (Por ejemplo: escriba un texto y presione el botón de inicio).
Estoy tratando de resolver esos problemas.
El siguiente código es una mutación del código original, pero no depende de ningún evento, solo WM_PAINT. Todavía parpadea, ¡y el cursor (cursor de texto) ha desaparecido de alguna manera!
Cómo evitar el parpadeo y cómo recuperar el cursor de texto (cursor de texto)?
Gracias.
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;
}
}
}
}
Empecé una recompensa para, en general, mejorar el método. En general evito parpadear, evitar invalidaciones, etc. No me importa lo feo que sea el código. – Lazlo
Otro punto: no sé lo que AeroFix incluso hace en este código, ya que nunca se establece. Pero consulte el código original en VB (vinculado en la publicación) que indica un código de invalidación por evento. – Lazlo
Puedes usar WPF y vivir feliz para siempre. –