博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】Win32 创建控件风格不是Win XP解决方案
阅读量:5240 次
发布时间:2019-06-14

本文共 2157 字,大约阅读时间需要 7 分钟。

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

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

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

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

      
      
      
          
            
              
            
          
       

    保存成一个后缀为:.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

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

 

转自:

转载于:https://www.cnblogs.com/xiaoyusmile/p/4290309.html

你可能感兴趣的文章
μC/OS-III---I笔记13---中断管理
查看>>
:after,:before,content
查看>>
FTTB FTTC FTTH FTTO FSA
查看>>
OpenAI Gym
查看>>
stap-prep 需要安装那些内核符号
查看>>
网易杭研后台技术中心的博客 -MYSQL :OOM
查看>>
第二章 数据通信的基础知识 计算机网络笔记 学堂在线 2.1 数据传输系统 2.2 信号...
查看>>
如何解决click事件的重复触发问题
查看>>
2016寒假自学笔记
查看>>
VC++2012编程演练数据结构《21》二叉排序树
查看>>
ZOJ 3537 Cake(凸包+区间DP)
查看>>
Java中常见的集合类比较
查看>>
python - 内置函数
查看>>
HTML 表单 / HTML5 表单元素datalist
查看>>
List<>集合
查看>>
python 全栈开发,Day71(模型层-单表操作)
查看>>
javascript函数编程与currying
查看>>
淘宝首页上的一个设计
查看>>
回忆(四):通过反射获得私有构造实例化得到对象
查看>>
移动安全漏洞分析报告(转)
查看>>