Подтвердить что ты не робот

Тесты с 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;
            }
        }
    }
}
4b9b3361

Ответ 1

Если вы установите TransparencyKey формы в цвет фон в области стекла, тогда вы можете использовать любой элемент управления над ним, но вы не можете использовать указанный цвет в TransparencyKey в любом из элементов управления, размещенных там.

Этот метод имеет неудобство, позволяя вам щелкнуть по стеклу в окне в фоновом режиме. Но может быть и путь вокруг этого.

РЕДАКТИРОВАТЬ: Я искал это уже давно... тогда это невозможно. Карре управляется самим API окон, вы не можете заставить его появляться так, как вы хотите. То, что вы могли бы сделать, это нарисовать весь текстовый ящик самостоятельно... но это слишком тяжело для работы.

I summary: GDI + и DWM не сочетаются очень хорошо. Я сдаюсь.