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

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

10 голосов
/ 05 февраля 2011

Я пытаюсь разобраться с цветом текста 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;
            }
        }
    }
}

1 Ответ

1 голос
/ 26 апреля 2011

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

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

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

Я подытожил: GDI + и DWM плохо сочетаютсяЯ сдаюсь.

...