返回首页


{S0}简介
每个人使用的工具栏的全彩色图像已经面临着创建禁用/活动影像的问题。无论你从一个专业的艺术家图像,或让他们从WINXP SHELL32.DLL,在大多数情况下,你只需要正常的图像。常用的方法是准备使用一个简单的图像编辑器的禁用/活动字形的位图的副本。例如,我已经使用编辑功能。但这种方法有几个缺点 - 你必须存储多个图像,这使得您的应用程序做大,最重要的,如果你决定添加/修改工具栏的图像后,你将不得不做大量繁琐的工作。
另一种方法是自动生成子图像从原始图片。我惊讶的是,我没有在CodeProject上发现的任何准备使用的解决方案,所以我结合了几种现有技术从其他作者。背景
本文中的代码是基于以下文章从CodeProject上: 基督教Rodemeyer,RGB,HLS转换(color.cpp,color.h)。由丹尼尔龙芯,为位图的像素由像素处理(enbitmap.cpp,enbitmap.h)。
我不得不承认,这些作者自己的增加不超过10行代码,但我还是希望你能找到有用的结果。我也删除所有未使用的东西从两个源代码,以尽量减少由此产生的独立组件的大小。使用代码
在所有其他作者的源代码顶部坐在CToolBar24 - 一个下拉更换CToolBar类在你的代码。对于一个MDI / SDI应用程序,只需更换您的CMainFrame类型:m_wndToolBar成员CToolBar24(enbitmap.h宣布),使一个附加的呼叫:/ /标准向导生成的工具栏初始化如果(m_wndToolBar.CreateEx(TBSTYLE_FLAT,WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC)| | !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)){ TRACE0("无法创建工具栏"\ nquot"); 返回-1; / /未能创建}  0; / /这里,我们去:m_wndToolBar.SetFullColorImage(IDR_MAINFRAME_24,RGB(255,0,255));
只要一功能添加:无效CToolBar24:SetFullColorImage(UINT ID,COLORREF rgbBack),其中ID是全彩色位图资源ID和rgbBack是位图的背景颜色(在我的范例,这是RGB (255,0,255))。
其结果是,你将有一个全彩色的工具栏,与非活动按钮看起来有点轻,禁用的按钮变灰。
当然,你不喜欢的外观和感觉的特殊状态图像。由于模块化结构,可以很容易地修改无效/禁用图像生成。只要阅读下一节。幕后
图像处理本身是由CEnBitmap的类,它可以修改通过使用特殊的ImageProcessor类像素。两个处理器都提供了这个项目:CImageGrayer,灰色的图片;和CImageHigh,它可以使图像显得更亮或更暗。寻找的CEnBitmap:MakeDisabled和CEnBitmap:MakeNotActive功能,修改相应的按钮的外观。例如,这里是如何在当前的MakeDisabled工程:BOOL CEnBitmap::MakeDisabled(COLORREF BK){ R = GetRValue(BK); G = GetGValue(BK); INT B = GetBValue(BK); CImageHigh高(0.08f); high.SetBkColor(R,G,B);  0;CImageGrayer灰色; gray.SetBkColor(R,G,B); & #160; C32BIPArray aProcessors; aProcessors.Add(AMP;灰色); (I = 0; ILT; 3;我) aProcessors.Add(放大器;高); 返回ProcessImage(aProcessors);
正如你可以看到,处理器阵列是准备和处理。处理器执行的详细信息,我建议你检查原。但在大多数情况下,你会发现通过合理的画面效果,玩2处理器,就像我一样。
不要错过CImageHigh构造函数参数(浮动弗卢姆= 0.1)。弗卢姆是亮度,这是适用于每次CImageHigh处理器使用时的偏移。弗卢姆应该是-1和1之间,负值使图像显得更暗。 HLS模型的详细描述,看到这一点。

回答

评论会员:DiomidisSpinellis 时间:2011/11/29
发布本文!需要注意的是原代码假定按钮有24像素大小的24。
下面的变化解决了这个问题。
diff -u -r1.2 EnBitmap.cpp

--- EnBitmap.cpp	23 Jan 2009 08:10:04 -0000	1.2

+++ EnBitmap.cpp	23 Jan 2009 09:29:24 -0000

@@ -388,19 +388,22 @@

 void	CToolBar24::SetFullColorImage(UINT ID, COLORREF rgbBack)

 {

 	m_bmToolbar.LoadBitmap(ID);

-	m_imgToolbar.Create(24, 24, ILC_COLOR24|ILC_MASK, 1, 1);

+	BITMAP bmp;

+	m_bmToolbar.GetBitmap(&bmp);

+	int nimg = this->GetToolBarCtrl().GetImageList()->GetImageCount();

+	m_imgToolbar.Create(bmp.bmWidth / nimg, bmp.bmHeight, ILC_COLOR24|ILC_MASK, 1, 1);

 	m_imgToolbar.Add(&m_bmToolbar, rgbBack);

 	GetToolBarCtrl().SetHotImageList(&m_imgToolbar);

 

 	m_bmToolbarDis.LoadBitmap(ID);

 	m_bmToolbarDis.MakeDisabled(RGB(255, 0, 255));

-	m_imgToolbarDis.Create(24, 24, ILC_COLOR24|ILC_MASK, 1, 1);

+	m_imgToolbarDis.Create(bmp.bmWidth / nimg, bmp.bmHeight, ILC_COLOR24|ILC_MASK, 1, 1);

 	m_imgToolbarDis.Add(&m_bmToolbarDis, rgbBack);

 	GetToolBarCtrl().SetDisabledImageList(&m_imgToolbarDis);

 

 	m_bmToolbarNA.LoadBitmap(ID);

 	m_bmToolbarNA.MakeNotActive(RGB(255, 0, 255));

-	m_imgToolbarNA.Create(24, 24, ILC_COLOR24|ILC_MASK, 1, 1);

+	m_imgToolbarNA.Create(bmp.bmWidth / nimg, bmp.bmHeight, ILC_COLOR24|ILC_MASK, 1, 1);

 	m_imgToolbarNA.Add(&m_bmToolbarNA, rgbBack);

 	GetToolBarCtrl().SetImageList(&m_imgToolbarNA);

 }


评论会员:thready 时间:2011/11/29
!我绝对喜欢这个工具栏 - 非常感谢你

麦克
评论会员:拉詹卡帕迪亚 时间:2011/11/29
!我太
再次感谢您!

基思李K. S.
在台湾
评论会员:LStewart 时间:2011/11/29
。任何一个可以帮助我在exising工具栏添加新形象
当我打开MS。NET 2003环境中的工具栏编辑器现有的24位与24位图像中添加新的工具栏按钮的工具栏修改退出8 bit.can图像任何一个可以帮助我吗?这些


拉詹卡帕迪亚
评论会员:LStewart 时间:2011/11/29
喜拉詹

首先 - 你是想指出的是一个问题。说到这是一个问题 - 笔者提出一个可行的解决方案。此外,他还提出了一个真彩工具栏Inactive和残疾人士的图像。

如果您有运行由作者提供的演示,您已经看到,他已经到工具栏上显示真彩色图标。

为了得到一个背景材料这一切的工作(24位(或更多)的工具栏上的图标) - 如何请浏览到;

心连心

最好的问候,
Yogesh Dhakad
评论会员:hakers 时间:2011/11/29
这可以通过API AfxGetGrayBit​​map(完成)

萨拉。
"寄予厚望,使一切伟大的可能" - 本杰明富兰克林
我的博客 - {A}
评论会员:vt1234567890 时间:2011/11/29
我是用24位的工具栏类似的方法来发现此代码之前,却发现我自己的实现和这一个共享相同的错误。有没有人遇到这个问题,并希望找到一个解决方法吗?这里的问题是:

1。创建一个或多个"复选框"式的工具栏上的按钮,通过设置一些按钮TBSTYLE_CHECK标志。
2。出于测试目的,有一个简单的方法,导致这些按钮来启用/禁用。
3。禁用按钮,并注意运用得当,残疾人的形象。
4。重新启用的按钮。
5。现在点击的TBSTYLE_CHECK按钮,使他们压下来,并再次禁用按钮。

嗯哦:现在你注意到,虽然按钮被禁用(它们不能被点击或切换),使用的图像,而不是残疾人的常规。 {S2}

我已经测试在几个方面,而事实证明,它显然与图像是否是24位或无关。简单地说,如果你调用CToolBarCtrl::SetDisabledImageList指定一个工具栏CTRL的禁用图像列表,然后这些图像将呈现一个推下来,但残疾人TBSTYLE_CHECK式按钮时使用。如果你只是让Windows自己的残疾(看起来蹩脚的,当你实际的图像是24位),那么至少它绘制在这种情况下,残疾人士的版本。

有没有人注意到了这个问题,或为它找到一个解决方法吗?? {S3}
评论会员:基督教Graus 时间:2011/11/29
更新:更多的信息。我发现了此Microsoft知识库文章中,我想这是一个已知的问题,但他们显然没有关注修复:

因此,是否有人知道如何你可以去定制绘图工具栏按钮(当他们俩都TBSTATE_CHECKED!TBSTATE_ENABLED)为了解决这个问题?我真的不知道如何开始,一个。有人指出正确的方向,我的感谢。
评论会员:马库斯Kitzig 时间:2011/11/29
我编程的课程广泛的方式。问题没有,但是,问题的危害,从而改变图像的大小插入下面的代码。

m_wndToolBar.SetSizes(CSIZE(55,55),CSIZE(55-7,55-6))

但图像不会改变,它做的如何?
评论会员:伊戈尔绿色 时间:2011/11/29
我可以工作
评论会员:马库斯Kitzig 时间:2011/11/29
这是一个C progject。它不能在VB.NET中使用,除非它可以打开到一个托管C项目。如果你是新的编程,你会做的更好学习你的语言,比试图整合关闭网页,在这一点上的代码片段。你做得更好放弃对C#VB.NET,但这是另一个故事。


基督教

我有几个朋友是纽约人的终身,但我一直朝着怪人的被吸引。理查德 - 斯金格
评论会员:伊戈尔绿色 时间:2011/11/29
喜有
。我刚刚创建了一个工具栏,并添加CImageList的它,为了我自己的位图设置Diasabled的按钮。当我打电话EnableButton功能的按钮仍然启用,并且仍然使用的命令ID。如何禁用一个按钮,在这里完全?

这里的代码从我的衍生工具栏:BOOL CBar::CreateEx(的CWnd * pParentWnd)
{
(CToolBar::CreateEx(pParentWnd,TBSTYLE_FLAT,WS_CHILD | WS_VISIBLE | CBRS_ALIGN_ANY | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC,CRECT(0,0,0,0),ID_TOOLBAR_​​CHARTOPTIONEN))
返回FALSE;
返回的Create()
}

布尔CBar:创建()
{
(m_ilToolbar.GetSafeHandle()== NULL)
m_ilToolbar.Create(16,15,ILC_MASK | ILC_COLOR32,14,0);
(m_ilToolbarDisabled.GetSafeHandle()== NULL)
m_ilToolbarDisabled.Create(16,15,ILC_MASK | ILC_COLOR32,14,0);
m_bitmapTB.LoadBitmap(IDB_TB_CHART_OPTIONS);
m_bitmapTBDisabled.LoadBitmap(IDB_TB_CHART_OPTIONS_DISABLED); m_ilToolbar.Add(m_bitmapTB,RGB(192,192,192));
m_ilToolbarDisabled.Add(m_bitmapTBDisabled,RGB(192,192,192));
GetToolBarCtrl()SetImageList(m_ilToolbar);
GetToolBarCtrl()SetDisabledImageList(m_ilToolbarDisabled); SetWindowText函数("图表Funktionen");
EnableDocking(CBRS_ALIGN_TOP | CBRS_ALIGN_LEFT | CBRS_ALIGN_RIGHT); SetButtons(NULL,16); SetButtonInfo(0,0 IDC_TBCHOPT_BIDASK,TBSTYLE_CHECK,);
SetButtonInfo(1 IDC_TBCHOPT_MARKTTIEFE,TBSTYLE_CHECK,1);
SetButtonInfo(2 IDC_TBCHOPT_PIVOT,TBSTYLE_CHECK,2);
SetButtonInfo(3 IDC_TBCHOPT_HANDELSSPANNE,TBSTYLE_CHECK,3);
SetButtonInfo(4 IDC_TBCHOPT_MARKIERUNGEN,TBSTYLE_CHECK,4);
SetButtonInfo(5 IDC_TBCHOPT_VORTAG,TBSTYLE_CHECK,5);
SetButtonInfo(6 IDC_TBCHOPT_VOLUMEN,TBSTYLE_CHECK,6);
SetButtonInfo(7 IDC_TBCHOPT_STOPZIEL,TBSTYLE_CHECK,7);
SetButtonInfo(8 IDC_TBCHOPT_UEBERWACHUNG,TBSTYLE_CHECK,8);
SetButtonInfo(9,NULL,TBBS_SEPARATOR,5);
SetButtonInfo(10 IDC_TBCHOPT_CHARTARTLINIEN,TBBS_CHECKGROUP,9);
SetButtonInfo(11 IDC_TBCHOPT_CHARTARTBALKEN,TBBS_CHECKGROUP,10);
SetButtonInfo(12 IDC_TBCHOPT_CHARTARTKERZEN,TBBS_CHECKGROUP,11);
SetButtonInfo(13 IDC_TBCHOPT_CHARTARTSTUFEN,TBBS_CHECKGROUP,12);
SetButtonInfo(14,NULL,TBBS_SEPARATOR,5);
SetButtonInfo(15 IDC_TBCHOPT_EINSTELLUNGEN,TBSTYLE_BUTTON,13);

返回TRUE;

在大型机呼吁禁用它是这样的:
这是这是由
调用的函数BOOL的CMainFrame::按需(WPARAM WPARAM,LPARAM的lParam)
功能。有一个开关的WPARAM。所以没有improtant 无效的CMainFrame::UpdateToolbars(BYTE的lParam)
{
EnableButton m_wndChartFunktionenBar.GetToolBarCtrl()(IDC_TBCHOPT_BIDASK,FALSE)

m_wndChartFunktionenBar.GetToolBarCtrl()不确定(IDC_TBCHOPT_BIDASK,TRUE);}
按钮是灰色(由于不确定的函数),但它仍然是启用的,而EnableButton函数返回成功。 ?
命令ID(IDC_TBCHOPT_BIDASK)仍是处理。我在这里做什么?

问题的工具栏位图?当创建一个默认项目MFC使用的是
m_wndToolBar.LoadToolBar(IDR_MAINFRAME)
和所有被处理的文件的实施意见。因此,任何人都可以帮助我在这里呢?
评论会员:zhxih 时间:2011/11/29
其实我从来没有试图与工具栏这样的工作。常见的MFC的方法是使用ON_UPDATE处理程序。
评论会员:伊戈尔绿色 时间:2011/11/29
好了,在这里我有一个解决方案,但它不是很大的"解释"对我来说。火焰我,我不与它经历。 {S2} {S2}

我只是做了简单覆盖头:
保护:
AFX_MSG无效OnUpdateCmdUI(CFrameWnd的pTarget,布尔bDisableIfNoHndler);

和实施以下...什么...
无效CBar::OnUpdateCmdUI(CFrameWnd的pTarget,布尔bDisableIfNoHndler)
{
}
现在我可以启用/禁用按钮,点击它并没有明显推的按钮,也没有将消息发送到主机。工作得很好,但我现在做u有一个简单的解释soultion?我想现在ü无论是在衍生工具栏类需要一个单独的消息处理程序,所有ID的使用,或使用我上面使用的实施,一般捕获所有CommandUI消息。

但是,为什么大型机得到的消息,当按钮被激活,虽然我在CBar做什么::OnUpdateCmdUI是我的神秘。但是,也许我没有足够的经验理解。
评论会员:zhxih 时间:2011/11/29
请注意,您不使用工具栏的处理建议的方法。你如何处理命令?我可以解释一下是怎么回事 - 在每一个空闲周期框架要求每个ID OnUpdateUI处理程序。如果你还没有进行ON_UPDATE处理程序,则使用默认值,使按钮。这是你做了什么提供空的处理程序,。
评论会员:gettercomic 时间:2011/11/29
我的4个文件复制到我的项目
但是:

MainFrm.obj:错误LNK2001:无法解析的外部符号"公众:虚拟__thiscall CEnBitmap:〜CEnBitmap(无效)"(?1CEnBitmap @ @阿联酋@ XZ)
MainFrm.obj:错误LNK2001:无法解析的外部符号"公众:__thiscall CEnBitmap:CEnBitmap(无符号长)"(?0CEnBitmap @ @ QAE @ K @ Z)
MainFrm.obj:错误LNK2001:无法解析的外部符号"公共的:void __thiscall CToolBar24:SetFullColorImage(无符号整型,无符号长)"
(SetFullColorImage @ CToolBar24 @ @ QAEXIK @ Z?) 为什么??
评论会员:WindSeven 时间:2011/11/29
您已添加cpp文件项目通过项目/添加文件"命令。?什么是你的VS版本?

伊戈尔绿
http://www.grigsoft.com
比较一下!同步它!文件和文件夹比较从来都不是容易
评论会员:绿色伊戈尔 时间:2011/11/29
哎呀,对不起,你是正确的
我已经忘了thatnbsp;
谢谢!
评论会员:schmurgulum 时间:2011/11/29
首先,感谢您的精彩CToolBar24类
但我这是问题。

我的程序的工具栏使用CToolBar24在我的电脑看上去是完美的。
但在工具栏位图的位置是错误的,当我运行相同的程序在另一台机器

我能做些什么?

感谢

评论会员:WindSeven 时间:2011/11/29
对不起,我错过了你的文章的通知
什么是Windows版本在这两种情况下吗?又是怎样的形象有什么不同?
也许你可以直接联系我讨论这个问题。
伊戈尔绿

比较一下!同步它! :文件和文件夹比较,从来都不是容易!
评论会员:Kaylene泰勒 时间:2011/11/29
好文章。但是,当我在我的应用程序中使用它,我发现tolbar位图背景颜色(RGB(192,192,192))是不是透明的。 NoActive模式,背景是一个小打火机,并在禁用模式,背景为白色。我特林寻找到代码,但我还没有想出什么是错还。请问有人能帮我吗?非常感谢。