[百度空间] [原]CImageList支持32位透明位图

32位的位图主要是包含Alpha值(0-255)可以有半透效果的.
之前用FreeImage加载 的DIB, CImageList直接绘制会有黑色背景.
即便用了ILC_MASK,也创建了mask map, 这种是旧式的图标/光标透明效果, 遮罩透明, 没有alpha通道和渐变,效果仍然很差.
所以以前的toolbar/menu/tab control 都是ownerdraw, 先ExtractIcon,用DrawStat (DST_ICON)来绘制图标,这样绘的制是支持32位图标的.
但是最近给toolbar加了下拉功能,自绘感觉很麻烦,所以想让控件自己绘制.

最后发现之前不能绘制半透是因为ILC_COLOR32只有在comctl32 6.0以上版本才支持.

http://msdn.microsoft.com/en-us/library/windows/desktop/bb761522(v=vs.85).aspx

When you finish using the image list, destroy it by calling the ImageList_Destroy function.

Note  Comctl32.dll version 6 is not redistributable but it is included in Windows XP or later. To use Comctl32.dll version 6, specify it in a manifest. For more information on manifests, see Enabling Visual Styles.

-_-! 以上是MSDN链接和说明,只提到如何使用6.0, 但对于ILC_COLOR32 必须用6.0这一点,好像只字未提, 我在google group讨论组搜到的结果是这么说的.感觉被M$坑的好苦.

如何使用6.0版本的common control库呢?

http://msdn.microsoft.com/en-us/library/windows/desktop/bb773175(v=vs.85).aspx
可以手写manifest,或者用VC的pragma,比如:

#pragma comment(linker,"\"/manifestdependency:type=‘win32‘ name=‘Microsoft.Windows.Common-Controls‘ version=‘6.0.0.0‘ \

processorArchitecture=‘*‘ publicKeyToken=‘6595b64144ccf1df‘ language=‘*‘\"")

会通知链接器将6.0的依赖信息添加到manifest. 上面提到XP以后系统就带了6.0的common control了,据说这也是XP/2000 才开始支持图标半透的原因,所以基本上不用担心系统的comctl32版本太低.启用以后发现视觉样式也开启了,很明显的toolbar和tab control跟以前不一样了.

时间: 2024-10-08 09:45:05

[百度空间] [原]CImageList支持32位透明位图的相关文章

驱动级多开工具,支持32位和64位

标题:[原创]驱动级多开工具,支持32位和64位 作者:绿林科技 时间:2015-5-16 链接:http://blog.csdn.net/o6108/article/details/47790019 作者QQ:1473656864 技术交流群1:177822108 技术交流群2:177822398 通用驱动级多开器,可多开市面上的90%的程序. PS:本来想弄个收费版本的,后来想了想,决定弄成免费.店铺为更新软件版本用的. 软件的About页面有我的QQ和Q群号,请大家把使用过程中遇到的BUG

iOS 11确认将完全停止支持 32 位应用

苹果正在逐渐淘汰 32 位应用,而且会在今年秋天完成.根据知名开发者 Steven Troughton-Smith 透露,苹果会在 iOS 11 发布后,停止支持 32 位应用.这意味着 App Store 中所有的 32 位应用将无法正常运行. 当然,对于开发者和用户来说,苹果这个决定并不是太意外.从 iOS 10.3 开始,当用户打开 32 位应用后,苹果已经开始提醒用户,应用需要升级,否则可能无法在未来 iOS 版本中运行. 2013年9月,苹果发布了 iPhone 5s,这也是首款搭载

[百度空间] [原]跨平台编程注意事项(三): window 到 android 的 移植

大的问题 先记录一下跨平台时需要注意的大方向. 1.OS和CPU 同一个操作系统, CPU也可能是不一样的, 比如windows也有基于arm CPU的版本,而android目前有x86,arm,mips几种. 即便是同一种CPU架构系列, 细节特性也不一样. 所以目前个人准备了3个宏开关来判断目标平台. OS, CPU, CPUbits OS对应不同的操作系统, CPU对应不同的CPU架构(比如x86和arm), CPU-bits目前是32和64, 比如CPU是x86时, CPUbits是64

[百度空间] [原]跨平台编程注意事项(二): windows下 x86到x64的移植

之前转的: 将程序移植到64位Windows 还有自己乱写的一篇: 跨平台编程注意事项(一) 之前对于x64平台的移植都是纸上谈兵,算是前期准备工作, 但起码在写代码时,已经非常注意了.所以现在移植起来相对很顺利.昨天用了一天时间把自己代码添加了x64支持.贴一下遇到的问题,就作为注意事项吧,以下文字来自我的cnblogs博客的另一文章,有修改 1.指针到数值的转换.  指针 (如void*)转到数值,要用intptr_t或者uintptr_t (用Win32的INT_PTR也可以,当然用C/C

如何同时支持32位和64位组件自动安装

weboffice论坛 ActiveX可以通过浏览器自动从服务器安装到客户端,但是IE目前有32位版本和64位版本,对应的ActiveX也分为32位版本和64位版本:由于是两个版本的两个不同的ocx或者dll,如何同一套代码实现自动识别浏览器安装对应的版本?因为版本升级需要进行修改代码中的版本号,所以我们从不把自动安装组件的代码直接写到前台页面中,而是写一个公用的js文件“Loadweboffice.js”,所有需要使用组件的页面直接引用即可.更新新版本时也只需要修改这一个js即可,减少以后的维

[百度空间] [原]跨平台编程注意事项(一)

好久没有写东西了,先写一点,以后再扩充. 1.使用平台编译器预定义的宏.比如在windows下,有这样一个宏WIN32.或者_WIN32.linux下有__linux__等等. 比如OGRE的OgrePlatform.h中的定义: #if defined( __WIN32__ ) || defined( _WIN32 )#   define OGRE_PLATFORM OGRE_PLATFORM_WIN32 #elif defined( __APPLE_CC__)#   define OGRE_

[百度空间] [原]android下的各种坑

一堆so文件安装不正确: apk里面都是全的, 但是安装完后/data/data/$pkg/lib下面就没有 google了好长时间没有结果.最后发现是因为没库有加lib前缀(当时想了一下觉得不加更好,更合胃口)....现在加上lib前缀OK了. 怀疑package manager在安装apk的时候把所有没有lib prefix的so给忽略了这种剧情设定太坑爹了.不使用官方mk真是吃尽苦头啊. ndk上坑太多: dlopen()还不支持RTLD_NODELETE,又得黑代码了. apk源的/li

IOS 其他 - 如何让 app 支持32位和64位

让App支持32-bit和64-bit基本步骤 1.确保Xcode版本号>=5.0.1 2.更新project settings, minimum deployment target >= 5.1.1 3.改变Architectures为 Standard architectures(include 64-bit) 4.运行测试代码,解决编译warnings and errors,对照本文档或者官方文档 64-Bit Transition Guide for Cocoa Touch对相应地方做

[百度空间] [原]再谈静态变量的初始化顺序

有一段时间我被静态变量的初始化顺序搞的焦头烂额,因为我用了singleton的懒惰初始化(lazy initialization)方式,即不需要显式创建singleton,在getsignleton的时候自动创建,并且在最后销毁对象..比如singleton使用了内存分配对象,如果这个对象先于singleton析构(后于singleton构造),那么singleton析构的时候内存分配器已经不存在了.最后发现我忽略了effctive C++的条款47,看来很多细节还是不是很深入的领悟. 关于其中