游戏人生

不积跬步,无以至千里;不积小流,无以成江海。

导航

[百度空间] [原]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跟以前不一样了.

posted on 2015-05-18 18:56  crazii  阅读(911)  评论(0编辑  收藏  举报