gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:15:55 26 4
gpt4 key购买 nike

我试图在 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;
}
}
}
}

最佳答案

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

这种方法有一个不方便的地方,那就是让你在背景窗口的玻璃上点击。但也有办法解决这个问题。

编辑:我已经搜索了很长时间了……那肯定是不可能的。 Carret 由 Windows API 本身管理,您不能强制它以您想要的方式出现。您可以做的是自己绘制整个文本框...但这太少了。

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

关于c# - 在 DWM 玻璃下使用 TextBox 进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4909179/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com