Тесты с TextBox под стеклом DWM

Я пытаюсь разобраться с цветом текста TextBox в DWM Glass. Я прочитал много материала, но все еще не нашел идеального решения.

Почти идеальный код результатов, который я нашел здесь: 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;
            }
        }
    }
}

10
задан DxCK 5 February 2011 в 19:34
поделиться