设置时忽略WTL CCommandBarCtrl图像列表(默认和热/禁用)

时间:2018-01-23 06:52:20

标签: ribbon imagelist wtl

我正在尝试修改功能区的快速访问工具栏中的图像,但我的所有尝试似乎都是徒劳的。我让WTL向导创建了一个简单的基于功能区的应用程序。该向导使用类型为“CCommandBarCtrl”的名为“m_CmdBar”的成员var创建一个CMainFrame。

在'CMainFrame :: OnCreate()'中,使用'Create(m_hWnd,rcDefault,NULL,ATL_SIMPLE_CMDBAR_PANE_STYLE)'创建m_CmdBar,并使用'LoadImages(IDR_MAINFRAME)'加载图像。图像来自默认的visual-studio提供的4位Bitmap工具栏资源。如果我保持'LoadImages(IDR_MAINFRAME)'不变,那么在QAT中可以看到蹩脚的4位图标。

现在,通过阅读非常稀疏的唯一可用WTL文档(以及关于图像列表的Win32 API文档),一些人建议更改图像列表。我尝试了以下方法(在评论'LoadImages(IDR_MAINFRAME)'之后开始使用空白平板。)。

第一次尝试(加载带有5个16x15px连续图标的32位位图条带):

CBitmap bmp;
bmp.LoadBitmap( IDB_TEST32BPP );
WTL::CImageList imgList = m_CmdBar.GetImageList();
imgList.Create( 16, 15, ILC_COLOR32, 8, 1 );
imgList.Add( bmp.m_hBitmap, RGB( 255, 255, 255 ) ); // also tried different masks
m_CmdBar.SetImageList( imgList );
imgList.Detach(); // also tried once without detaching

但无济于事。我试图强制使用图像列表:

m_CmdBar.SendMessage( TB_SETIMAGELIST, 0, (LPARAM)imgList.m_hImageList );

但这也不起作用。

第二次尝试非常像第一次,除了这次我将创建调用更改为:

imgList.Create( 16, 15, ILC_COLOR24 | ILC_MASK, 8, 1 );

希望加载代码可能不喜欢32bpp图像...但同样,没有雪茄(LoadBitmap被调整为加载24bpp版本当然)。第三次尝试只是重新加载默认图像(4位),所以我再次将创建调用更改为:

imgList.Create( 16, 15, ILC_COLOR4 | ILC_MASK, 8, 1 );

但你已经猜到了......注意到了。实际上没有任何意思,QuackAccess-Toolbar确实保留了5个按钮的空间(根据XAML功能区配置),但不显示图标/图像。 QAT按钮是白色的,但对交互作出反应。尝试使用提供的WTL-API加载热列表和禁用列表也没有任何作用。

唯一可行的方法是直接手动加载每个位图并将其链接到命令:

CBitmap bmp;
bmp.LoadBitmap( IDB_ICON1_32BPP );
m_CmdBar.AddBitmap( bmp.m_hBitmap, ID_TEST_BTN );
只要XAML配置在ID_TEST_BTN的QAT部分中正确提供了一个条目,

就会起作用。 AddIcon也可以工作但引入了一个工件(黑色垂直  1px-bar,就好像为每个图标绘制了一个右框架。我猜这是16x16与16x15像素的问题。)

我可能倾向于放弃并使用AddBitmap-workaround,但我也希望禁用和热版本也能正常工作,并且看起来没有AddBitmap。另外,我猜有没有办法通过XAML文件强制图像到任何QAT按钮???

0 个答案:

没有答案