zoukankan      html  css  js  c++  java
  • 【转】Win32 创建控件风格不是Win XP解决方案

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

        Win32 <wbr>创建控件风格不是Win <wbr>XP解决方案

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

        Win32 <wbr>创建控件风格不是Win <wbr>XP解决方案

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

        这个根本办法就是加一个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文件加入到工程中就行了。

        修改过后的界面如下:

        Win32 <wbr>创建控件风格不是Win <wbr>XP解决方案

    上面这种方法是用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

  • 相关阅读:
    标准输出stdout、标准错误stderr 分类: python python基础学习 2013-06-17 18:08 308人阅读 评论(0) 收藏
    python数据持久存储:pickle模块的基本使用 分类: python python基础学习 python 小练习 2013-06-17 14:41 209人阅读 评论(0) 收藏
    解析XML文件总结 分类: python基础学习 python 2013-06-17 12:04 232人阅读 评论(0) 收藏
    使用set()求出列表交集 分类: python基础学习 2013-06-16 17:00 241人阅读 评论(0) 收藏
    [搜索][51nod] 1268 和为K的组合
    [51nod] 1279 扔盘子
    [记忆化搜索] [洛谷] P1464 Function
    [贪心][51nod] 1133 不重叠的线段
    [二分] [51nod]1010 只包含因子2 3 5的数 lower_boud
    万年历查询 c++ 黑窗
  • 原文地址:https://www.cnblogs.com/xiaoyusmile/p/4290309.html
Copyright © 2011-2022 走看看