返回首页


{S0}目录表 0; 简介
近日,一个客户要求为他的WTL项目中的Outlook 2003风格的导航栏。没有找到一个适合在WTL控制在CodeProject上,我决定创建一个。我希望你觉得这是为自己的项目非常有用的控制,信贷适当的归属,将不胜感激。
的Outlook 2003的导航栏是相当于一个选项卡式窗口系统变化一次的意见。它可以容纳任意数量的"标签",虽然它的工作原理最好的一个比较平庸的数额。
这个项目要求:WTL的7.5或更高版本。atlgdix.h从。 GDI从Microsoft。该功能
Outlook风格的视图之间切换 - 展望妥善处理工具提示,窗口大小调整,粘分离器,等我试图实现这些功能的细节的巨大数量,以及他们在一些情况下,改善。
雪佛龙菜单 - Outlook的版本一样,有一个人字形菜单命令栏上(它是,但是,没有主题... ...这可能是在未来的版本中添加)。它不适合命令栏上,或作为一个大按钮的按钮被放置在下方的导航窗格选项。
导航窗格选项 - 导航窗格选项对话框允许您交换和灭活按钮从您的看法,以定制你的布局,你最喜欢什么。导航窗格选项已全面投入使用(除热键系统的工作原理,就像所有其他的Windows列表框的同类... ...这不是一件好事),悬停和适当的选择。其列表视图自定义,并且可以在ChecklistView.h访问。
主题支持 - 这项计划已基本主题支持。这里不多说,除了它的变化的基础上的Windows主题,您可能会发现有用到您的程序申请额外养眼。这其中大部分是从罗杰Headrick的主题化代码同化。如何使用它必要的代码
这段代码是把你所有的状态栏,并更新了布局。首先,我们需要得到客户端RECT,设置的参数创建窗口之前,必须设置,然后创建window.RECT​​ ClientRect;GetClientRect(AMP; ClientRect);/ /设置按钮的参数。您必须设置/ /这些之前创建navwindow。/ /如果你不,不要期望它的工作;)/ /按钮的高度是高度/ /大按钮和命令栏m_navwindow.SetButtonHeight(31);/ /小按钮的宽度是宽度/ /命令栏上的小按钮。m_navwindow.SetSmallButtonWidth(24);/ /砸在我们的控制。m_hWndClient = m_navwindow.Create(m_hWnd,ClientRect   ; Lquot; Nav_Mainquot;,WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
然后,我们设置按钮,开始大跌眼镜(这样你就不能掩盖重要的东西)从顶部的距离。这可以设置在程序的任何地方,它总是默认为0,如果没有设置(事实上,你可以编辑标签的按钮,使设置弹出什么看法显示不同的)。下面的for循环是定义的窗口和其HWNDs的卡式按钮/ /设置从客户端顶部的距离/ /矩形的按钮启动弹出窗口。/ /如果没有设置或设置为0,按钮会弹出回/ /窗口顶部的按钮时过去推。m_navwindow.SetPopBack(150);/ /对于榜样的缘故,所有的按钮只有一个采样窗口。/ /如果你想为每个按钮的不同窗口(你可能),/ /你会希望有一个不同的线路,为您的主机中的每个窗口和类。/ /由于这些例如,下面的两行/ /循环被删除,换成任何你想要的。button_view.resize(9);button_view_top.resize(9);(为size_t view_increment = 0; view_increment LT; & #160;button_view.size(); view_increment){ button_view [view_increment]。创建(m_navwindow,rcDefault, & #160; NULL,WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN); button_view_top [view_increment]。创建( m_navwindow.m_Horizo​​ntalSplitter,rcDefault, &# 160; NULL,WS_CHILD | WS_VISIBLE | & #160; WS_CLIPSIBLINGS | WS_CLIPCHILDREN);   ; STD:wostringstream vertical_caption; vertical_caption LT,LT; Lquot;垂直quot; LT,LT; view_increment; button_view [view_increment] window_caption = vertical_caption.str(); button_view [view_increment] is_horizo​​ntal = FALSE; STD:wostringstream horizo​​ntal_caption; horizo​​ntal_caption LT,LT; Lquot水平quot; LT,LT; view_increment; button_view_top [view_increment]。window_caption =   ; horizo​​ntal_caption.str(); button_view_top [view_increment] is_horizo​​ntal = TRUE; button_view_top [view_increment]。pop_back_amount = m_navwindow.m_Horizo​​ntalSplitter.pop_back_y;}/ /不要删除任何过去这里... ...它包含/ /其余所需的参数;)
然后我们设置按钮的字体,然后,最重要的是,创建它们。第一个参数按钮的标题,的第二个图像的路径作为一个大按钮使用的第三图像路径作为命令栏上的按钮使用,以及过去两年,分别,是的,以HWNDs的什么会出现上对面竖线右侧什么会出现在整个单杠顶偏。
然后,我们设置了垂直分离器分离器的位置所选择的宽度,默认的按钮,我们希望看到什么... ...与AddButtonWithView命令栏显示其他五个顶部添加一个值为5的手段,我们将看到的第一个四个按钮。对于一个备用的例子,如果你SetDefaultButtons(4),你会看到持有其他6 / /设置按钮字体命令栏上的三个大按钮。m_navwindow.SetButtonFont(Lquot; Arialquot;,8,FontStyleBold);/ /添加我们所有的按钮,我们的按钮查看。/ /使用for循环,如果你有/ /必要的字符串数组。m_navwindow.AddButtonWithView(Lquot; Printquot; &# 160;Lquot; RolloutIcons \ \ Print_2.tifquot; Lquot; RolloutIcons \ \ Print_2_Small.tifquot;  0; button_view [0],button_view_top [0]);m_navwindow.AddButtonWithView(Lquot; Addquot; Lquot; RolloutIcons \ \ Add_2.tifquot; &# 160; Lquot; RolloutIcons \ \ Add_2_Small.tifquot; button_view [1],button_view_top [1]);m_navwindow.AddButtonWithView(Lquot; Editquot;  0; Lquot; RolloutIcons \ \ Edit_2.tifquot; Lquot; RolloutIcons \ \ Edit_2_Small.tifquot; button_view [2],button_view_top [2]);m_navwindow.AddButtonWithView(Lquot; Deletequot; Lquot; RolloutIcons \ \ Delete_2.tifquot; Lquot; RolloutIcons \ \ Delete_2_Small.tifquot;   ; button_view [3],button_view_top [3]);m_navwindow.AddButtonWithView(Lquot; Searchquot; & #160; Lquot; RolloutIcons \ \ Search_2.t​​ifquot; & #160; Lquot; RolloutIcons \ \ Search_2_Small.tifquot; button_view [4],button_view_top [4]);m_navwindow.AddButtonWithView(Lquot; Backquot;  60; Lquot; RolloutIcons \ \ Back_2.tifquot; Lquot; RolloutIcons \ \ Back_2_Small.tifquot; button_view [5],button_view_top [5]);m_navwindow.AddButtonWithView(Lquot; Forwardquot; Lquot; RolloutIcons \ \ Forward_2.tifquot; Lquot; RolloutIcons \ \ Forward_2_Small.tifquot;   ; button_view [6],button_view_top [6]);m_navwindow.AddButtonWithView(Lquot; Savequot;   ; Lquot; RolloutIcons \ \ Save_2.tifquot;   ; Lquot; RolloutIcons \ \ Save_2_Small.tifquot;  ; button_view [7],button_view_top [7]);m_navwindow.AddButtonWithView(Lquot; Exitquot;   ; Lquot; RolloutIcons \ \ Exit_2.tifquot;  ; Lquot; RolloutIcons \ \ Exit_2_Small.tifquot; button_view [8],button_view_top [8]);/ /设置,这是地方的垂直/ /分配器将位于你的窗口。m_navwindow.SetSplitterPos(242);/ /设置这是1比更高的按钮/ /你要初步显示。如果没有,在所有/ /把1。如果连命令栏,把0。m_navwindow.SetDefaultButtons(5);杂记如果你没有设置默认的按钮,它会默认为0。如果你不指定一个较大的图像路径​​,只会有按钮上的文本,它将与左侧的按钮视图对齐。如果你不指定一个较小的图像路径​​,按钮仍然会显示命令栏上的,但他们不会被人眼可见的,不移动鼠标。 ButtonView_Tabbed是作为一个垂直分割处理。图标将不会被涂上了吧,如果规模太小。指出,虽然有些是可选的,有些是绝对必要的程序有几件。位于ButtonView项目和所需物品过滤器/文件夹的绝对必要的代码。 ButtonView卡式版本有实际使用中,正好说明了如何使用我的代码(通过继承和一些必要的压倒一切的的),并增加新的功能,如果你想。但是,如果您选择使用不同的类,实施ButtonView模板,你必须提供水平和垂直分割的支持,否则的ButtonView是行不通的。如果你想的不作为标签的按钮列表,只是开放的意见,而不是功能,覆盖功能的onSelect。它需要一个整数参数,而0是最上面的一个,它是按钮的ID。然后,您可以检查和运行基于我的各种功能。文档
下面是函数的文档,你可以使用从ButtonView_Tabbed。还有其他的功能,但他们服务的内部功能。这些都是你会使用的。AddButtonWithView(STD::wstring的标题,性病:wstring的的ImagePath,性病:wstring的imagepath_small right_side的HWND的HWND top_side) - 底部的"清单"按钮添加一个按钮。标题是不言自明的,并到该按钮的工具提示进行时,在命令栏上的;的ImagePath和imagepath_small是不言自明的,和right_side和top_side的,将出现在右边和上面的按钮视图的窗口句柄。AddButton(STD::wstring的标题,性病:wstring的的ImagePath,性病:wstring的imagepath_small) - ButtonView的核心功能。 AddButtonWithView相同,但不添加意见。 AddButtonWithView呼吁这个问题,然后将在自己的线。SetButtonFont(STD::wstring的类型,Gdiplus:实际规模,诠释风格) - 设置按钮的风格(类型是字体,大小的字体大小,风格是大胆的添加按钮,如) 。SetDefaultButtons(int i)以 - 设置的数量(I - 1,命令栏被认为是在此设置下的按钮)按钮,你会看到窗口启动时。SetPopBack(INT pop_back_amount) - 设置在像素的距离从客户端窗口的顶部。默认为0,客户端窗口的顶部,如果没有设置。SetButtonHeight(int i)以 - 设置像素高度的大按钮和命令栏。SetSmallButtonWidth(int i)以 - 设置命令栏上的按钮的像素宽度。雪佛龙公司始终保持在24个像素宽。的onSelect(int i)以 - ButtonView的核心功能。一个按钮被选中时调用的函数。目的地,这是空白的,是要在每一个类,它使用ButtonView模板重写。如果您设置ButtonView的button_is_selected等于i的参数,您将收到选定的选项卡上的"打印"按钮效果。如果没有,然后按一下按钮,将只是想点击一个正常的按钮... ...它会闪烁,当你点击它,然后恢复正常释放后。Swap_Buttons(INT,INT十) - ButtonView的核心功能。它是已修改时的导航窗格的选项,在这里我是老的按钮和j是新的按钮,即所谓的功能。这是故意留下空白,默认情况下,作为必要的交换是事前。你应该重写此方法并添加必要的行交换的职能和意见和按钮的东西。 ButtonView_Tabbed覆盖和替换代码开关按钮。积分
我想他的颜色主题的代码,特里德纳姆他的管理单元分离器关闭屏幕绘图(无闪烁的按钮或我的样本EXE和它的样本窗口),罗杰Headrick感谢他atlgdix.h Viksoe ,最后,Firefox和供应的图标,我是能够改变和适应我的示例程序。我也想感谢的人,我忘了感谢名称。历史版本1.0 - 导航侧边栏公布!

回答

评论会员:ishwarh 时间:2011/12/06
我清新,我创建了一个asp.net应用程序,如一些文字,..我想补充的领域,我在我按一下按钮图标将添加到数据库text.if,输入。帮我遐
我需要的,
代码

评论会员:布雷克赫德 时间:2011/12/06
我不明白你想要做什么。如果我想,你想要的是在方案的设计,你就会有它自己的代码。如果你想添加一个按钮,呼叫AddButton (...).然后,如果你要检测的按一下按钮,你需要找到的onSelect功能,并确定该怎么做,当你收到INT一而标新立异的一步,我做了这么当我== 0没有按钮被选中,而当我> 0,然后选择一个按钮。你应该使用按钮[I - 1]中的onSelect功能的按钮获得的数据。

如果你想从列表中删除的按钮,我不相信,我所做的,可能。理论上你可以从视线中删除按钮,然后执行类似数组的去除 - 覆盖其下的按钮。

____________________________________________________________{ BR}没有上帝的生活将是一个悲哀的生活确实
评论会员:。hahahua 时间:2011/12/06
我得到了很多的错误,当我在VS2005建立
评论会员:布雷克赫德 时间:2011/12/06
你的VS设置而定。你得到什么样的错误呢?

____________________________________________________________{ BR}〜没有神的生命将是一个悲哀的生活确实
评论会员:游客 时间:2011/12/06
haha​​hua
的错误我看起来像这些:

derror C2504:'COffscreenDrawRect":基类未定义
错误C2143:语法错误:缺少","前'<'
没有发现错误C3861:'的OnPaint":标识符
错误C2065:'COffscreenDrawRect":未声明的标识符
错误C2275:'CToolTipWindow":非法使用这种类型的表达式
错误C2039:"ProcessWindowMessage":不是"`全局命名空间''
的成员错误C2660:'SetWindowPos':功能不采取6个参数
顺便说一下,这是一个真正伟大的工作。多谢了!
评论会员:布雷克赫德 时间:2011/12/06
嗯。对于初学者来说,它看起来像你没有atlgdix.h挂钩。现在我的新版本(对不起,还是没有上传,希望本周)只使用WTL的CDoubleBufferImpl照顾这个

无论如何,在这个版本中绕过它,复制atlgdix.h,并把它在一个包含在你的VS的文件夹中。我只是将它复制到我的WTL的文件夹,它的采摘与其他一切从那里。

____________________________________________________________{ BR}没有上帝的生活将是一个悲哀的生活确实
评论会员:。hahahua 时间:2011/12/06
我复制该文件到WTL的文件夹。但它不工作。
评论会员:布雷克赫德 时间:2011/12/06
WTL /包括哪些内容?

____________________________________________________________{ BR}〜没有上帝的生活将是一个悲哀的生活确实
评论会员:。hahahua 时间:2011/12/06
是的,正是!
评论会员:游客 时间:2011/12/06
haha​​hua
解决现在的问题是

我添加了



在tooltip.h

感谢
评论会员:cleanripple 时间:2011/12/06
在这,我真的很感兴趣,但我没有得到任何线索经过几个引擎搜索
这是哪里?

主要土木工程;
新的MFC,
备用一些感兴趣的ASP.NET
评论会员:。布雷克赫德 时间:2011/12/06
这是一个黑客工具,有些可以让您获得Windows XP主题的颜色,使用WTL的CTheme能力。它返回一个主题色,它不完全匹配到Microsoft Office Outlook 2003的主题颜色,但您认为合适时梯度的,你可以修改颜色。我寻求最终坐下来写我自己的版本,但很可惜我没有能够的。无论如何,我发现它在WTL雅虎集团

我对本集团签订和检查,并出现文件消失。它看起来像他们擦洗前一阵子了大量的文件丢失。你可以找到源zip主题化的代码。这就是所谓的"xp2003colors.h"。



____________________________________________________________{ BR}没有上帝的生活将是一个悲哀的生活确实
评论会员:cleanripple 时间:2011/12/06
我也注意到了xp2003colors.h
多谢了!

主要土木工程;
新的MFC,
备用一些感兴趣的ASP.NET
评论会员:。lowca 时间:2011/12/06
布雷克,

近去年11月底,你的评论,你会释放一个版本的工具栏,不会要求viksoe.dk的atlgdix.h。多远你能得到与?

谢谢!
评论会员:布雷克赫德 时间:2011/12/06
我已经完成,但我必须重新上传的代码,这是我没有到几个月做:X使用WTL的内部CDoubleBufferImpl唯一的问题是,它并没有收到无效矩形,必须重绘整个程序。然而,这是我做什么,此刻,无论如何,因为我无法找到一个正确的方法无效rects,这样的转换是很容易的。如果不过,我想使我的GUI稍快无效rects,我想回迁atlgdix.h。
  ; - 修改于11点42分,2007年4月16日(星期一)

____________________________________________________________{ BR}没有上帝的生活将是一个悲哀的生活确实
评论会员:cleanripple 时间:2011/12/06
错误说的CString不能分配到std::wstring的;
 0;和"dynamic_cast的"多态类型"ButtonView_impl与/ GR -;不可预知的行为可能会导致

我新,人能解释这个吗?

此外,作者表示,文件已经更新,但他们似乎仍然是旧的。

主要土木工程;
新的MFC,
腾出一些利益,以ASP.NET
评论会员:布雷克赫德 时间:2011/12/06
/ GR -是一个在Visual Studio的设置。你可能想看看它。我认为它可能是"配置属性>> C / C>>高级>>电话公约",它是根据到VS2005反正。 __fastcall / GR,所以我以为,可能是什么问题。您可以将它更改为__cdecl(/ GD)。至少,这是什么我用它的编译罚款。

____________________________________________________________{ BR}没有上帝的生活将是一个悲哀的生活确实
评论会员:。cleanripple 时间:2011/12/06
感谢很多
我什至是可行的VC6.0的

主要土木工程;
新的MFC,
腾出一些利益,以ASP.NET
评论会员:Hmarik 时间:2011/12/06
。0x77e55dea未处理的异常在Navigation_Sidebar.exe:微软C异常:__non_rtti_object @ 0x0012ccf4
线T *我(){返回的dynamic_cast();}
评论会员:ackerman81 时间:2011/12/06
- GR是需要eabled项目运行时类型信息

项目设置GT,GT,C / C + + GT,GT;语言GT GT;启用运行时所属类别(是/ GR)的
评论会员:空军基地 时间:2011/12/06
我们可以写在视觉basic.I的意思是,我上网整个网站truying搜索的任何组件,可以帮助我这个导航栏问题,实在是杀了我,我发现了一个组件bitlaboratory.com.Its amazing.Just我也llking for.It费用80元。我买它的思想..老实说,真的是杀me.If任何知悉任何resourses .. DLL的..在VB组件ü名称(经典VB或vb.net请与我联系,我想原因; LLY明白.. )
评论会员:布雷克赫德 时间:2011/12/06
这是前一段时间,但如果你阅读 - 我不认为我将永远写这个程序在一个VB变种。 VB是相当困难的使用越来越复杂的任务,它不是设置做。不过,如果你申请的C#代码工作,你将能够重新翻译成我的程序。如果我会不知道,但它绝对有可能的。

____________________________________________________________{ BR}没有上帝的生活将是一个悲哀的生活确实
评论会员:regman 时间:2011/12/06
在某些机器上,会出现一个黑色矩形在底部的按钮区域,命令栏上 - 尤其是在Windows Vista在我的测试。

问题的关键在于,水平分割是硬编码在Snap_Splitter.h 4像素,而分离器的实际大小为8像素。
更换分离器的实际高度的硬编码值,似乎为了解决这个问题。
snap_splitter.h(5次):

基类:SetSplitterPos(rect.bottom - (m_desired)* button_height - 4);



基类:SetSplitterPos(rect.bottom - (m_desired)* button_height - m_cxySplitBar)

这个很好的文章,

雷金纳德


评论会员:布雷克赫德 时间:2011/12/06
感谢,指出这一点!我想Vista中必须改变分离器的大小,因为分配器一直高4 PX,对我来说,但这种改变应在长期运行工作。我会上传修复的下一个版本。

____________________________________________________________{ BR}〜没有上帝的生活将是一个悲哀的生活确实
没有咖啡的生活将是一个疲惫的生活确实
评论会员:。Klinkby 时间:2011/12/06
我有一个托管版本的Outlook 2007功能的实现。更多信息