每一个C#的Winform项目的Main方法里,都有这么一行代码,那么它究竟是用来做什么的呢?

Application.EnableVisualStyles();

从注释来看,这是一行用作设置样式的代码,那么它究竟设置了哪些样式呢?

源码浅析

public static void EnableVisualStyles() {
string assemblyLoc = null; // SECREVIEW : This Assert is ok, getting the module path is a safe operation,
// the result is provided by the system.
//
FileIOPermission fiop = new FileIOPermission(PermissionState.None);
fiop.AllFiles = FileIOPermissionAccess.PathDiscovery;
fiop.Assert();
try {
assemblyLoc = typeof(Application).Assembly.Location;
}
finally {
CodeAccessPermission.RevertAssert();
}
// Pull manifest from our resources
if (assemblyLoc != null) {
EnableVisualStylesInternal(assemblyLoc, 101);
}
}

从代码来看,最关键的也就是最后那句

EnableVisualStylesInternal(assemblyLoc, 101);

在这句代码里,将本地GAC_MSIL文件夹里的System.Windows.Forms.dll路径和一个“101”传了进去,用于设置所谓的样式。

当我们进入到CreateActivationContext方法里后,会看到如下代码:

[ResourceExposure(ResourceScope.None)]
[ResourceConsumption(ResourceScope.Process, ResourceScope.Process)]
public static bool CreateActivationContext(string dllPath, int nativeResourceManifestID)
{
lock (typeof(ThemingScope))
{
if (!contextCreationSucceeded && OSFeature.Feature.IsPresent(OSFeature.Themes))
{ enableThemingActivationContext = new ACTCTX(); enableThemingActivationContext.cbSize = Marshal.SizeOf(typeof(ACTCTX));
enableThemingActivationContext.lpSource = dllPath;
enableThemingActivationContext.lpResourceName = (IntPtr)nativeResourceManifestID;
enableThemingActivationContext.dwFlags = ACTCTX_FLAG_RESOURCE_NAME_VALID; hActCtx = CreateActCtx(ref enableThemingActivationContext);
contextCreationSucceeded = (hActCtx != new IntPtr(-1));
} return contextCreationSucceeded;
}
}

在设置了一通ACTCTX的属性后,将它传入了CreateActCtx方法内,用于创建ActivationContext。

而那个“101”则被赋值给了lpResourceName ,那么我们如果想搞懂那个“101”是做什么的,就要先看懂lpResourceName 是什么意思。

在微软官方文档里找到了答案:

ACTCTXA结构

在这里我们可以看到lpResourceName指的是和dll或者exe同级目录的资源,接下来我们只需要用vs打开一下上文提到的dll,就可以真相大白了。

这下我们明白了,所谓的资源就是清单文件(manifest文件),也就是说这个所谓的EnableVisualStyles方法其实设置的并不是我们常规意义上的样式,而是设置的程序应用信息,比如引用dll、注册路径、版本号等。

这是清单文件的内容。

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<description>Windows Forms Common Control manifest</description>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*" />
</dependentAssembly>
</dependency>
</assembly>

从这里我们可以看到,这里映射到了name叫“Microsoft.Windows.Common-Controls”的文件夹,果不其然,我在C:\Windows\WinSxS找到了它。

这里可以看到版本号也是一致的,接下来我们看一下里面记录的哪些东西?

随机点开一个

看到这里我们就明白了,这个 comctl32.dll里面记录的是一些常用的图标之类的资源文件,而这个Application.EnableVisualStyles();设置的也是这些。

浅析Winform的可视样式的更多相关文章

  1. Winform自定义窗体样式,实现标题栏可灵活自定义

    最近在编写C/S结构应用程序时,感觉窗体的标题栏样式太死板了,标题文字不能更改大小.颜色.字体等,按钮不能隐藏等问题,在网上也查找了许多相关的资料,没有找到合适的解决方案,发现许多人也在寻求这个问题, ...

  2. winform npoi excel 样式设置

    IWorkbook excel = new HSSFWorkbook();//创建.xls文件 ISheet sheet = excel.CreateSheet("sheet1") ...

  3. 浅析WINFORM工具条的重用实现

    一直以来,我都想看看别人家的工具栏重用(图1)到底是如何实现的,但在网上搜索了很久都没有找到过,即使找到一些程序,要么就是把这个工具栏写在具体的画面(图2),要么就是没有源代码的, 我在想,是否别人也 ...

  4. winform设置DataGridView样式 (蓝色)

    本文转载:http://www.cnblogs.com/hailexuexi/archive/2012/04/23/2466398.html 代码: #region DataGridVeiw Styl ...

  5. Java进击C#——应用开发之WinForm环境

    本章简言 上一章笔者讲到关于IO文件操作类,了解如何处理文件流.从这一章开始笔者将讲解相对比较高级的知识点.而本章笔者就对WinForm开发的知识点进行讲解和引导.现在很多业务都是面向于B/S模式的开 ...

  6. 浅析c#中登录窗体和欢迎窗体关闭的问题

    第一次在cnbogs发文章,这次来个很基础的,主要给小白看. 在c#的winform编程中,我们经常会做登录窗体或欢迎窗体,并把他们作为启动窗体. 但是,我们有可能会遇到一些问题. 请看下面的代码: ...

  7. 应用开发之WinForm环境

    本章简言 上一章笔者讲到关于IO文件操作类,了解如何处理文件流.从这一章开始笔者将讲解相对比较高级的知识点.而本章笔者就对WinForm开发的知识点进行讲解和引导.现在很多业务都是面向于B/S模式的开 ...

  8. WinForm数字小键盘/WPF数字小键盘

    模仿原本的WinForm触摸屏小键盘制作WPF触摸屏小键盘 原WinForm触摸屏小键盘样式(WinForm采用Krypton系列控件)如下图: Designer代码如下: // // BtnNum1 ...

  9. WinForm 应用程序禁止多个进程运行

    方法一: 禁止多个进程运行 using System; using System.Collections.Generic; using System.Linq; using System.Window ...

  10. 设置DatagridView的列头样式

    设置DataGridView.ColumnHeaderDefaultCellStyle的BackColor属性会发现没有效果.这是因为在启动了可视样式的时候,BackColor和ForeColor的值 ...

随机推荐

  1. xmind使用分享

    Xmind 介绍 1. 特点 是表达发散性思维的有效工具,图文并重,把各主题的隶属关系和相关的层级表现出来,把关键字与图像,文字,颜色建立起链接记忆. 2.安装,下载与破解 参考:https://bl ...

  2. MFC中的RTTI(Runtime Type Identification, 运行时类型识别)详解(参考《深入浅出MFC》)

    在MFC中的RTTI的实现,主要是利用一个名为CRuntimeClass的结构来链接各个"有关系的类"的信息来实现的.简单来说,就是在需要用到RTTI技术的类内建立CRuntime ...

  3. 【译】.NET 7 中的性能改进(三)

    原文 | Stephen Toub 翻译 | 郑子铭 PGO 我在我的 .NET 6 性能改进一文中写了关于配置文件引导优化 (profile-guided optimization) (PGO) 的 ...

  4. 一个基于 gin+ grpc + etcd 等框架开发的小栗子

    一.标准的项目结构 首先我们看一个标准的项目结构是什么样子的,github 上给出的一个示例:golang-standards/project-layout 二.服务注册与发现流程 三.示例代码 项目 ...

  5. 如何设置VBA代码的密码?如何取消VBA代码的密码?

    经常有网友问,用Access把软件开发好了,怎么样设置VBA代码的密码?以保护自己的代码不被同事修改.这里简单整理了一下.设置VBA代码的密码及取消VBA代码的密码步骤如下:1.打开任意一个窗体,进入 ...

  6. JDK8在xp安装办法

    jdk默认不支持xp,用到了后来的api,直接没法安装. 具体安装步骤: 1.用7-zip打开jdk8的版本8u231之前的版本. 2.导航到 .rsrc\1033\JAVA_CAB10\111把里面 ...

  7. 关于浏览器缓存造成的bug解决方法(页面跳转缓存,刷新生效)

    1.在执行操作时带上一个随机数/时间戳,表示每一次的都是独一无二的

  8. ABAP 写入批次特征值以及更新批次特征值

    需求 SAP启用了批次,需要在特征值中写入物料类型,区分该物料批次是用于研发的亦或是量产的,关于研发和量产标识我是坐在采购订单行项目增强中了,这里就不多赘述了,参考https://www.cnblog ...

  9. VIT论文笔记

    VIT An image is worth 16x16 words: transformers for image recognition at scale 将transformer首次应用在视觉任务 ...

  10. go项目,出现too many open files

    刚开始碰到这种异常,以为是代码写的有问题,准备抽时间去改,等有时间正式此问题的时候,发现这种问题一般只会在linux系统上出现,原因如下:linux系统限制了文件打开的最大文件句柄数,系统默认一般是1 ...