有时候我有在用Win32 API来向窗体上添加控件时,通过CreateWindow或CreateWindowEx创建出来的控件的风格不像XP风格,而是像Windows 2000的风格,界面很难看。注意,是动态调用CreateWindow来创建控件,不是从资源中加载。

这种情况下,我们怎么办呢,通常说来,造成这种情况都是由于没有正确加载资源,我们知道,像button, combobox, listbox等这些控件都是放在comctl32这个DLL里面的,所以有时候在用这些系统自定义的控件时,需要我们首先调用InitCommonControlsEx函数。这个DLL的版本有很多,存放在Windows\winsxs目录下面,或者你直接检索:common control,结果如下:

好了,下面说一下解决方案吧:

这个根本办法就是加一个manifest文件,其内容如下:

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

保存成一个后缀为:.manifest的文件,引入到.res文件中。

这样就行了。

还需要在资源文件中加一行:

       //      
     1 RT_MANIFEST "TestCtrlStyle.manifest"

注意,有时候,加这样一句代码在资源文件中,链接时会出错:

1>Linking...
      1>CVTRES : fatal error CVT1100: duplicate resource.  type:MANIFEST, name:1, language:0x0409
      1>LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt

这个错误是说工程中已经包括了RT_MANIFEST文件。那么此时,就不要加这句话,直接把这个.manifest文件加入到工程中就行了。

修改过后的界面如下:

上面这种方法是用manifest来设定引入的comctl32的版本,但注意上面的manifest,里面指定了这个comctl32的平台:processorArchitecture="x86",如果这个应用程序想在x64下面运行,就会导致一个问题:这个64位的程序链接的是32位的comctl32库,创建控件就会失败。所以最好的解决方案就是下面这种做法:

在头文件里面加入下面的语句:

#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#endif

这里就是根据编译选项来指定链接什么版本的库,这样编译出来的程序就不会有上述的问题。

转自:http://blog.sina.com.cn/s/blog_5f8817250100u2yr.html

【转】Win32 创建控件风格不是Win XP解决方案的更多相关文章

  1. win32创建控件的一些问题

    在我们使用CreateWindow();像一般控件建Windows扩展控件的时候我们会发现控件没有创建成功 这是因为我们没有对Windows扩展控件库进行初始化,这要我们使用InitCommonCon ...

  2. api (二) 创建控件 (转)

    在Win32 SDK环境下,怎么来创建常用的那些基本控件呢?我们知道如果用MFC,简单的拖放即可完成大多数控件的创建,但是我们既然是用Windows SDK API编程,当然是从根上解决这个问题,实际 ...

  3. MFC 动态创建控件

    动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的.   一.创建动态控件:   为了对照,我们先来看一下静态控件的创建.   放置静态控件时必须先建立一个容器,一 ...

  4. Windows常见窗口样式和控件风格

    Windows常见窗口样式和控件风格 王佰营 徐丽红 一.窗口样式 WS_POPUP 弹出式窗口(不能与WS_CHILDWINDOW样式同时使用)WS_CHILDWINDOW 子窗口(不能与WS_PO ...

  5. 【问题解决】线程间操作无效:从不是创建控件“textBox1”的线程访问它

    背景 通过一个辅助线程计算出的一个值赋给textBox1.text: 解决办法 1.直接在窗体的构造函数中添加: System.Windows.Forms.Control.CheckForIllega ...

  6. 关于“线程间操作无效: 从不是创建控件’textBox1‘的线程访问它”异常的解决方法

    线程间操作无效: 从不是创建控件“textBox1”的线程访问它 背景:通过一个辅助线程计算出的一个值赋给textBox1.text;解决办法:1.直接在窗体的构造函数中加:System.Window ...

  7. swift 字符转为类,代码创建控件

    在使用类之前要先获得 命名空间 通过json来获取 字符型的类名 然后创建类对象,这时候就要用到字符转类 // 从info字典中获取到 命名空间 转为字符型 let NS = NSBundle.mai ...

  8. 问题解决——基于MSCOMM32.OCX控件的类在客户机不能创建控件

    大家不要笑我了,我不喜欢用那个人家写的串口类. 所以导出了MSCOMM32.OCX的类,然后在此基础上写了一个串口打印机的小工具类. -------------声明--------------- 本文 ...

  9. bug:C#线程间操作无效: 从不是创建控件" XX" 的线程访问它

    今天遇到这个问题,百度了下,把解决的方法总结出来.我们在ui线程创建的子线程操作ui控件时,系统提示错误详细信息为:线程间操作无效: 从不是创建控件“XXX”的线程访问它. 就我知道的有三种方法,先看 ...

随机推荐

  1. CLightLock:一个简单AutoLock

    原理: 标准的RAII, 利用构造函数进行加锁,利用析构函数进行解锁. #ifndef _C_LIGTHT_LOCK_HPP #define _C_LIGTHT_LOCK_HPP class CLig ...

  2. js判断是否为数组

      js判断是否为数组类型 CreateTime--2018年5月18日14:38:58 Author:Marydon 1.错误方式 使用typeof 返回的是object 2.正确方式 方式一:使用 ...

  3. 用sqldevelop进行连接linux中ret Hat 6.2 中的oracle步骤

    1.下载Oracle Instant Client (32-bit) 因为PL/SQL只支持32位的Oracle,所以必须下载对应的32位的才可以. 只需要下载instantclient-basic- ...

  4. C# 图片转换为base64

    WebRequest webRequest = WebRequest.Create("验证码url"); WebResponse webResponse = webRequest. ...

  5. ref与out区别(ref有进有出,而out只出不进)

    ref与out区别(ref有进有出,而out只出不进)   C#基础:ref和out的区别 ref和out的区别在C# 中,既可以通过值也可以通过引用传递参数.通过引用传递参数允许函数成员更改参数的值 ...

  6. 微信公共服务平台开发(.Net 的实现)1-------认证“成为开发者”

    这些代码也就开始认证的时候用一次,以后就不用了: const string Token = "XXXXX";//你的token protected void Page_Load(o ...

  7. C# ManualResetEvent

    文章转载自:C# ManualResetEvent ManualResetEvent被用于在两个或多个线程间进行线程信号发送. 多个线程可以通过调用ManualResetEvent对象的WaitOne ...

  8. 关闭危害的端口DOS命令(转载)

    rem ipseccmd -w REG -p "HFUT_SECU" -r "Block UDP/137" -f *+0:137:UDP -n BLOCK -x ...

  9. mybatis 映射器

    1 映射器 Mapper 是由java接口和 XML 文件共同组成.它的作用如下 1)定义参数类型 2)描述缓存 3)描述 SQL 语句 4)定义查询结果和POJO的映射关系 2 SqlSession ...

  10. 从JSON数据中取出相关数据

    参考: http://www.cnblogs.com/shuilangyizu/p/6019561.html JSON数据如下: { "total": 1, "rows& ...