c# .net textbox dwm

c# - Pruebas con TextBox bajo el cristal DWM



.net (1)

Si configura TransparencyKey del formulario con el color de fondo en el área de cristal, puede usar cualquier control sobre él, pero no puede usar el color especificado en TransparencyKey en ninguno de los controles colocados allí.

Este método tiene un inconveniente de permitirle hacer clic a través del cristal en la ventana en el fondo. Pero puede haber una forma de evitar esto también.

EDITAR: He estado buscando esto por un largo tiempo ... entonces debe ser imposible. El carret es administrado por la API de Windows en sí misma, no se puede obligar a que aparezca en la forma que desee. Lo que podría hacer es dibujar todo el cuadro de texto usted mismo ... pero eso sería demasiado trabajo para tan poco.

Resumen: GDI + y DWM no se combinan muy bien. Me doy por vencido.

Estoy tratando de lidiar con el color del texto de TextBox en DWM Glass. Leo mucho material, todavía no hay una solución perfecta.

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 un montón de parpadeo y operaciones 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 se basa en 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 (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; } } } }