我读了很多材料,还没有完美的解决方案.
几乎完美的结果代码我发现这里: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进行测试所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)