10

我正在尝试在 DWM Glass 下处理 TextBox 文本的颜色。我阅读了很多材料,仍然没有完美的解决方案。

我在这里找到了几乎完美的结果代码: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;
            }
        }
    }
}
4

1 回答 1

1

如果您将窗体的TransparencyKey设置为玻璃区域中的背景色,那么您可以对其使用任何控件,但您不能在放置在那里的任何控件中使用 TransparencyKey 中指定的颜色。

此方法的不便之处在于您可以通过背景窗口中的玻璃进行点击。但也可能有办法解决这个问题。

编辑:我一直在寻找这个很长一段时间......那一定是不可能的。carret 由 Windows API 本身管理,您不能强制它以您想要的方式出现。您可以做的是自己绘制整个文本框......但这对于这么少的工作来说太多了。

我总结:GDI+和DWM结合得不是很好。我放弃。

于 2011-04-26T14:36:49.953 回答