65.9K
CodeProject 正在变化。 阅读更多。
Home

Application.EnableVisualStyles 错误

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (37投票s)

2003年10月26日

2分钟阅读

viewsIcon

228404

调用 Application.EnableVisualStyles 会阻止来自 ImageList 的图像在 Windows 通用控件上显示

引言

.NET framework 1.1 版本引入了方法 System.Windows.Forms.Application.EnableVisualStyles。 在创建任何窗体或控件之前调用此方法,将导致 Windows XP 在渲染 Windows 通用控件和许多本机 .NET 控件(如按钮和复选框)时应用主题。

使用 .NET 1.0、MFC、WTL 或 VB6 时,需要包含一个清单文件,要么与可执行文件位于同一目录中,要么编译到其中作为资源,才能使用 Windows XP 视觉样式。 虽然这并不难,但为创建的每个可执行文件提供清单文件很繁琐,而且 Visual Studio 对帮助您执行此操作的支持非常有限。

EnableVisualStyles 引入到框架的 v1.1 版本是一个不错的补充,因为它允许 WinForms 应用程序轻松采用 Windows XP 样式的全新外观和感觉。

该错误

问题在于 EnableVisualStyles 的实现中存在一个错误,该错误会干扰存储在 ImageList 组件中的 Images 以及 Windows 通用控件,例如 TreeView Toolbar 类。 结果是,如果您调用 EnableVisualStyles,所有图像都将从您的工具栏、树形视图和列表视图中消失。

重现错误

  1. 在 VS.NET 2003 中创建一个 WinForms 应用程序
  2. Toolbar ImageList 添加到 Form1
  3. 将图像添加到 ImageList 并将按钮添加到 Toolbar
  4. 将图像分配给按钮
  5. Main 方法中,在调用 Application.Run 之前添加对 Application.EnableVisualStyles 的调用

当您在 Windows XP 上运行该应用程序时,并且启用了视觉样式,工具栏按钮上将不会显示任何图像。

解决方法

搜索 Google 群组 之后,我发现了一些关于此问题的讨论以及一个似乎有效的解决方法,并且没有在我的应用程序中引起任何问题。(要了解有关该解决方法的更多信息,请访问 此处

EnableVisualStyles 之后调用 Application.DoEvents,似乎可以解决问题。 它是如何或为什么工作的,谁知道呢。 很可能它会导致通过 PostMessage 发送的一些消息被刷新到正确的位置,然后再创建第一个基于 WinForms 的窗口。

因此,解决方法代码如下所示

void Main() 
{ 
  Application.EnableVisualStyles(); 
  Application.DoEvents(); 
  Application.Run(new Form1()); 
}

到目前为止,我还没有看到该解决方法产生任何不良影响,并且它似乎始终有效。

© . All rights reserved.