none
WinForms采用Aero Glass界面后文本框异常 RRS feed

  • 常规讨论

  • 我在尝试将我的一个程序改成类似于Vista Explorer样式的Aero Glass玻璃界面效果。
    虽然我成功地将玻璃效果应用到程序当中,但是我发现如果在玻璃区域直接放置TextBox文本框控件之后,运行时显示的字的颜色也是透明的,根本看不清。
    类似于以下这个样子:


    我参考了http://msdn.microsoft.com/zh-cn/magazine/cc163435.aspx这篇文章,但是仍然没有解决此问题的头绪。

    请问,这种问题有方法直接解决吗?如果不能直接解决有没有workaround?

    谢谢!

    P.S.
    我很好奇……因为WPF里面就不会有这个问题,而且根据WPF Unleashed的描述,实现这个功能也不像WinForms这样复杂(代码少)。
    不知道它是怎么做到的……
    Xlfdll
    2009年7月15日 16:12

全部回复

  • 你好,

    那篇文章里面不是说了这个问题的原因和workaround吗:

    原因:

    一个特殊问题是使用位模式 0x00000000 以黑色呈现 GDI 项目,在使用 Alpha 管道时也会碰巧出现完全透明的黑色。这意味着如果您使用黑色 GDI 画笔或笔进行绘制,将会得到透明的颜色,而不是黑色。当您尝试使用默认文本颜色控制位于玻璃区域中的文本标签时,这种问题表现得就特别明显。因为默认文本 颜色通常为黑色,DWM 会认为它是透明的,因此文本将错误地写入玻璃区域。图 10 显示了一个这样的示例。第一行使用 GDI+ 编写,第二行是一个使用默认颜色的文本标签控件。可以看出,其中的内容几乎无法辨认,因为它实际上是错误呈现的文件,文本显示为灰色,而不是黑色。

    solution:

    令人欣慰的是,可以通过多种方法解决此问题。其中一种方法是使用所有者描述的控件。另一种方法是呈现到具有 Alpha 管道的位图。但控制文本的最简单方法是让 .NET Framework 2.0 为您使用 GDI+。通过在您的控件上设置 UseCompatibleTextRendering 属性可以很容易地做到这一点。默认情况下,此属性设置为 false,这样,为 .NET Framework 的以前版本编写的控件将以相同的方式呈现。但是,如果将其设置为 true,则文本将正确呈现。您可以使用 Application.SetUseCompatibleTextRenderingDefault 方法在全局设置该属性。如果您使用的是 Visual Studio® 2005,则模板代码将包括一个调用,以便在创建窗体之前在主例程中将兼容文本呈现设置为 false。您可以编辑它,将其设置为 true(如下所示),这时在玻璃窗口中进行编写时,所有控件看上去都会是正确的。
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    2009年7月20日 1:52
    版主
  • 我试过这个方法,设置Application.SetUseCompatibleTextRenderingDefault,但是仍然是这样。

    我应该自己使用GDI+绘制?
    Xlfdll
    2009年7月21日 17:36
  • 路过.


    也没啥说的.有空多来我的Blog看看!专注虚拟化技术! 虚拟化技术百科@http://www.vzpedia.com
    2009年7月21日 17:52
    版主