MFC工具栏图标的更高色深度?

10

我想知道如何在MFC中制作使用24位或256色位图而不是可怕的16色位图的工具栏。

有没有人可以指导我一些简单代码的方向?

谢谢

2个回答

11
这种情况发生的原因是MFC CToolbar类在内部使用一个只初始化为使用16种颜色的图像列表。解决方法是创建自己的图像列表并告诉工具栏使用它。我知道这对256种颜色有效,但我尚未测试过更高位深度的情况:
首先,从资源中加载一个256色位图:
HBITMAP hBitmap = (HBITMAP) ::LoadImage(AfxGetInstanceHandle(),
    MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_BITMAP,
    0,0, LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS);
CBitmap bm;
bm.Attach(hBitmap);

接下来,创建一个256色图像列表,并将我们的位图添加到它中:

CImageList m_imagelist.Create(20, 20, ILC_COLOR8, 4, 4);
m_imagelist.Add(&bm, (CBitmap*) NULL);

最后,我们需要告诉工具栏使用新的图像列表:

m_toolbar.GetToolBarCtrl().SetImageList(&m_imagelist);

可能新的 VS2008 中的 MFC 版本已经解决了这个问题,因为我知道许多 UI 元素已经得到更新。 我还没有实际尝试使用它,所以不能确定。


你在项目中创建了一个合适大小的位图资源,并使用适当的参数调用了CImageList::Create函数吗? - Stu Mackellar
当然,我理解了。我的图标是16、15,我已经更改了(抱歉忘记提到),我知道位图是256色(8位)。让我困扰的是如何使其与声明一起工作: - Konrad
@gbjbaanb,没有重载LoadBitmap函数接受HBITMAP参数 - 只有接受资源ID或资源名称的函数。 - Stu Mackellar
谢谢你,它让我今天摆脱了一个棘手的情况。 - Adam Pierce
1
这对我有用,使用ILC_COLOR32替换ILC_COLOR8来处理32位颜色位图!不错。;) - Mordachai
显示剩余6条评论

0

这个解决方案完美地运行了,你只需要稍微修复一下它:

CImageList m_imagelist;
m_imagelist.Create(20, 20, ILC_COLOR8, 4, 4); 
m_imagelist.Add(&bm, (CBitmap*) NULL); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接