问一个可能比较愚蠢的问题。对于 C#/VB.NET:
我们在使用 .Net 自带控件时,这些控件多是简陋的传统 3D 样式,而不是比较美观的 XP 样式。现在有一些说写个 .manifest 文件的方法可以让编译后的应用程序的某些控件(TextBox, ComboBox,ProgressBar 等等)变成 XP 样式,但是却无法让同样十分常用的 Button 和 CheckBox 等控件变为 XP 样式,这些控件在窗体设计器里仍然是简陋的传统 3D 样式——非常不谐调。当然似乎 VB6 写出来的程序用 .manifest 就可以让所以控件完全 XP 风格化。网上有不少 XP 样式控件,但是使用他人的控件多少有一些不自在——要么要求注册,要么必须在自己的应用程序中加上这些控件;即使提供了源代码让我们可能自己编译到程序里,或者重写 OnDraw 事件可能可以实现 XP 风格化,但是这毕竟要耗费额外的代码。 有没有谁能够提供一个比较好的解决方案,一劳永逸的,只要将控件 VS .NET 默认的窗体控件工具箱内将控件拖到窗体上,那个控件就是 XP 样式;或者让那些控件本来就是 XP 样式(工具栏里显示的就是 XP 风格控件)。听说 VS 2005.Net 用这样的控件库,是真的吗?用 VS 2005.NET 自身控件编译的程序是 XP 样式的吗??怎么让 VS 2003.NET 也实现相同功能?

解决方案 »

  1.   

    Application.EnableVisualStyles();
    只能当程序在xp上运行时才能起作用,如果在win2000上 ,就要自己动手封装了。
    可以到www.codeproject.com上找找,有不少这类控件
      

  2.   

    请问如何“手动封装”?不会是用别的控件或者把别人的代码加进自己的程序吧……
    有没有全局设置效果等同 Application.EnableVisualStyles(); 的?这类控件我有很多……
      

  3.   

    1) Change the control's "Flat Layout" property to "System"
    2) Include the same name manifest file in your project
    3) If above doesn't work, use 3rd party control (no other choice, like NumericUpDown)
      

  4.   

    >Application.EnableVisualStyles();
    >只能当程序在xp上运行时才能起作用,如果在win2000上 ,就要自己动手封装了。
    >可以到www.codeproject.com上找找,有不少这类控件千万不要使用Application.EnableViusalStyles(),这个方法是vs.net中的一个重要bug,网上已经有很多关于这个问题的文章。我就不多说了。
      

  5.   

    ups216(StoneAge) :好像没有 "Flat Layout" 属性,只有 "FlatStlye" 属性。经过测试,Application.EnableVisualStyles() 方法仍然无法让 Button 控件 XP 风格化。
      

  6.   

    在 MSDN 查找到的“临时”解决方案如下:Visual Studio   
      将 Windows XP 可视样式应用于 Windows 窗体应用程序从 System.Windows.Forms.ButtonBase 类派生的控件(Button、RadioButton 和 CheckBox 控件)和 GroupBox 控件具有属性 FlatStyle,该属性指示应该如何绘制控件。如果 FlatStyle 属性被设置为 System,则该控件的外观将由用户的操作系统确定。此设置使具有此属性的控件以 Windows XP 的方式绘制自己。请注意,某些 Windows 窗体控件(Label、LinkLabel、DomainUpDown、NumericUpDown 和 CheckedListBox 控件)在所有操作系统上的外观都是相同的。将可视样式应用于窗体 1、对于具有 FlatStyle 属性的控件(参见上面的解释),将此属性设置为 System。 
    右击该窗体并选择“查看代码”。 2.a、在 Visual Basic 中,将以下代码添加到窗体的类中。以下代码片段假定窗体名称为 Form1。 ' Visual Basic
    Shared Sub Main()
        Application.EnableVisualStyles()
        Application.Run(New Form1)
    End Sub2.b、在 Visual C# 中,找到 Main() 方法并对其进行修改,以便它具有以下一行粗体代码。以下代码片段假定窗体名称为 Form1。 // C#
    static void Main() 
    {
        Application.EnableVisualStyles();
        Application.Run(new Form1());
    }2.c、在 Visual C++ 中,找到 _tWinMain 过程并对其进行修改,以便它具有以下一行粗体代码。以下代码片段假定窗体名称为 Form1。 
    // C++
    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
        System::Threading::Thread::CurrentThread->ApartmentState = System::Threading::ApartmentState::STA;
        Application::EnableVisualStyles();
        Application::Run(new Form1());
        return 0;
    }
    2.d
    注意   如果窗体上有一个 ImageList 控件,则确保在调用 Application.Run() 之前应包括以下一行代码。
    ' Visual Basic
    Application.DoEvents()// C#
    Application.DoEvents();// C++
    Application::DoEvents();3.VB 在 Visual Basic 中: 
    ·在“解决方案资源管理器”中,右击项目并选择“属性”。 
    ·在项目的属性页对话框中,将“启动对象”字段设置为“Sub Main”。 
    ·单击“应用”。 此时,您的窗体和所有其控件都将用运行时应用的可视样式显示。
    经过测试,所有控件都可以 XP 风格化。不过这是权宜之计,我想了解一个一劳永逸的方法。分是会给的,不过要等这个“一劳永逸”的方法出来或者被证明不可能先。