c# – 在DWM玻璃下使用TextBox进行测试

c# – 在DWM玻璃下使用TextBox进行测试,第1张

概述我正在尝试处理DWM Glass下的TextBox文本的颜色. 我读了很多材料,还没有完美的解决方案. 几乎完美的结果代码我发现这里:http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/316a178e-252b-480d-8cc9-85814c2073d8/,但它有很多轻d和事件特定的 *** 作(例如:键入一些文本,并按下主页按 我正在尝试处理DWM Glass下的TextBox文本的颜色.
我读了很多材料,还没有完美的解决方案.

几乎完美的结果代码我发现这里:http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/316a178e-252b-480d-8cc9-85814c2073d8/,但它有很多轻d和事件特定的 *** 作(例如:键入一些文本,并按下主页按钮).

我试图解决这些问题.

以下代码是原始代码的突变,但它不依赖于任何事件,只是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;            }        }    }}
解决方法 如果将窗体中的TransparencyKey设置为玻璃区域中的背景颜色,则可以对其使用任何控件,但不能使用放置在其中的任何一个控件中的TransparencyKey中指定的颜色.

这种方法不方便您在后台点击窗口上的玻璃.但也可能有一种方法.

编辑:我一直在寻找这个很长一段时间,这一定是不可能的. Carret由windows API本身管理,您不能强制它以您想要的方式显示.你可以做的是自己绘制整个文本框,但是这么多工作太少了.

我的总结:GDI和DWM并没有很好的结合.我放弃.

总结

以上是内存溢出为你收集整理的c# – 在DWM玻璃下使用TextBox进行测试全部内容,希望文章能够帮你解决c# – 在DWM玻璃下使用TextBox进行测试所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1236913.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存