{A}
{S0}记住
英语/中美。英语不是我的第一语言。我是意大利人。给别人解释的事情,是不是我的职业,我是一个神秘的程序员:-) ...我住在一个黑暗的地牢独自:-)我是有点讽刺,但然后,我一个疯狂的程序员:-)。简介
我爱的Outlook风格的控制... ...我非常爱他们... ...我的问题是,它很难找到一个XP的主题之一。所以,一天大约一年前,我决定建立一个... ...我反对穷人的主题文档,在最后,我赢得了这场战争的胜利。这是我的胜利的结果... ...不好的东西
它不支持小图标,省略号按钮,拖放,项目的就地编辑,整理的项目,运动项目,好和易于扩展的事件模型,所有者绘制项目,非- pushable图标(现在推的图标,记住它被推倒,并绘制在不同的风格... ...通常这是一个OutBar,而不是默认样式的扩展样式),禁用主题的一部分(OutBar将工作W95 / W98/NT等)。我什至不知道它会与非默认的主题(我试过的所有默认的XP主题,但我没有StarDock或类似的计划)正确绘制。美好的事物
它的快速,以重绘它使用双缓冲技术,双重接口:基于消息(OBM_ *)和方法的基础(你知道,一个围绕消息的薄包装像的ATL和WTL的,做与Windows ,单行组成的许多方法:SendMessage消息(m_hWnd,OBM_something的lParam,wParam参数)),它有一个发现方法(技术上两个,一个文件夹,一个的项目之一),它的花哨,制定与所有权绘制滚动(尝试伸展的宽度和长度)和所有者绘制ListIcon(从头开始建立的第一个版本使用一个ListView,但我打了一场针对其滚动的败仗,因为我想是水平居中的图标,所以我决定以创造从零它),它完全支持键盘和鼠标箭头,PGUP / PgDown键/首页/结束/轮,的热门货是制定不同的只有当你使用的主题,它的Unicode和W64准备,下编译W4警告。在SO"N"这样的事情
在MIT许可下(一个简化的BSD许可证)的授权,它使用许多Windows控件(一个为自己,为每个文件夹之一,为一个图标)。最后一个项目是因为我认为OutBar的每个部分可以单独控制(和程序可以GetFocus()/ SetFocus的()正确一件好事),用户可以TAB / SHIFT的SO"N",使类别标签之间的部分OutBar,而它的坏,它消耗了许多控制。我如何使用它呢?
记住:此代码是用VC 8.0/WTL 7.5测试!!告诉你,你可以发现,只需打开wtlOutBarDemo项目(提示:所有"; importantquot;线/ / WTLOUTBAR标记,以便您可以轻松地搜索)自己的事情,我不想写了三页。如果你知道如何工作的一个CListViewCtrl的,那么你知道如何使用一个CWtlOutBarImpl(是的,我quot; borrowedquot; ListView的界面)。最终,最困难的事情可能是创建将包含图标的ImageList。这样做有两种方式:你可以有单独的ico文件中的所有图标和做一次LoadIcon / AddIcon,或者可以起到一点疯狂的科学家和保险丝一个位图中的所有图标,然后使用。 CreateFromImage。小记:wtlOutBarMDIDemo是分割MDI的事情不OutBar和演示。我希望它的工作,但我不是很清楚。分割窗口和MDI框架窗口是复杂的论点,他们喜欢的quot;未被发现landquot的WTL。什么是所有类?CWtlOutBarTlt; Tbasegt;其中99%的时间,TBASE = CWindow的,周围的OutBar瘦包装。它是由许多行的方法,简单地调用正确的信息。除非你想要做奇怪的事情,你不需要直接使用这个类。CWtlOutBarImplTlt; TBasegt;其中99%的时间,TBASE = CWtlOutBarTlt; CWindowgt; "; meatquot;类。您可能会宣布它的地方在您的主要形式,它会坐在那里。如果你来自CWtlOutBarTlt; CWindowgt;,你可以很容易地使用它的方法(这样你就可以AddFolder的AddItem,GetSelectedFolder,GetSelectedItem等)CMemoryStripDC是一个实用工具类。我需要一个可重复使用的CMemoryDC的,所以我创建了一个(绘制OutBar是在quot; stripsquot,其描述的每个图标是一个带)。是否有一些奇怪的事情,在你的OutBar神奇的东西吗?
MMM ...是的... ...类支持两种风格(他们quot; basicquot;风格,而不是扩展)。OBS_SHAREIMAGELISTS(相同LVS_SHAREIMAGELISTS,所以我不会在这里解释... ...好... ...我将解释):如果你不使用样式OutBar认为有所有权的ImageList,它OutBar被销毁时会破坏它。如果您使用的样式,OutBar会不会破坏其生命结束的ImageList。OBS_FORCESELECT:如果设置了此风格,OutBar将永远有一个选定的项目(除非有任何项目)。如果您删除选定的项目,其他项目将被选中(一种智能的方式... ...它会首先尝试走下来,然后尝试从以前选定的项目中去)。
有三个通知,类将抛出:OBN_FOLDEROPEN,OBN_ITEMSELECT,并OBN_ITEMSELECTAUTO。OBN_FOLDEROPEN很明确:它的触发当用户打开一个文件夹。OBN_ITEMSELECT触发,当用户选择一个项目(按一下就可以了,或使用键盘)。OBN_ITEMSELECTAUTO触发程序时,选择的项目(使用SetSelectedItem或触发OBS_FORCESELECT的影响,例如)。嘿,但我想一些文件
你是幸运的,你很幸运。我决定学习如何使用doxygen的,所以我评价所有"; userquot源(你知道,没有内部的一部分)的一部分。你可以阅读HTML格式或CHM格式(Windows HTML帮助格式)...当你在看源(因为意见源,你可以读取它,在doxygen的简单提取,并创建一个易于阅读的文件)... ...所以,在离开之前,你有点莫名其妙,我教你一个单一的东西(我写的OutBar后发现的事情)。m_wtlOutbar.GetHWNDHandle(-1).ModifyStyleEx(0, WS_EX_STATICEDGE);
m_wtlOutbar OutBar名称。这将使OutBar的ListView部分静态的边缘(更多的3D方面)。嘿,但我有点懒,我真的想一些例子
OK??我会解释的wtlOutBarDemo例如吗??创建一个基于对话框WTL的项目。复制wtloutbar.h和项目文件夹中的stringcex.h,并添加到项目中。一些图标添加到项目,并给他们喜欢IDI_ICON1的ID吗??IDI_ICONx。在stdafx.h中,加入这行的#define WINVER线附近:{C}
为主题的支持。
#后的LT; atlwin.hgt;,添加:#include <atlcoll.h>
#include <atltheme.h>
#include <tmschema.h>
#include "wtloutbar.h"
(atlcoll.h)是因为我使用ATL的集合。第二个(atltheme.h)的主题。第三个(tmschema.h)是因为微软决定,这是一件好事,分裂的主题和头,它包含了所有的quot的基头; codesquot;必要写为主题的应用程序。第四(wtloutbar.h)OutBar库(它会自动包括stringcex.h)。
现在,你应该去你的项目的属性,并在链接- GT;输入页面,添加到附加依赖和uxtheme.dll delayimp.lib延迟加载的DLL。这样,你的程序将兼容XP系统没有COMCTL32.DLL V6库(为主题的库... ...是... ...我知道,这是不完全正确我已经写了... ...这是过于简单了... ...所以拍我:-)).
现在,去为MainFrm.h文件,并后的#pragma一次线,添加:#define IDC_OUTBAR 10000
这将是控件的ID(是的,10000是一个随机数,它不应该被任何人使用,那么,ID是当地,所以它不会是一个问题,但如果你不喜欢它,改变它!)。根据市民:行,地址:CWtlOutBarImpl m_wtlOutbar;
这是控制。很简单。现在,走在OnInitDialog (???.前返回TRUE,添加:CImageList il;
il.Create(32, 32, ILC_COLOR8|ILC_MASK, 6, 1);
CIconHandle ico;
ATLVERIFY(ico.LoadIcon(IDI_ICON1));
ATLVERIFY(il.AddIcon(ico) != -1);
ATLVERIFY(ico.Detach());
ATLVERIFY(ico.LoadIcon(IDI_ICON2));
ATLVERIFY(il.AddIcon(ico) != -1);
ATLVERIFY(ico.Detach());
这将创建一个ImageList与六个图标(可以使用不同的值)的基础空间和成长在一个时间一个图标。然后,它会开始加载图标,并将其添加到ImageList。我们加载的exe文件的图标,所以你没有真正quot; freequot;后,将它们添加到ImageList(所以使用ico.Detach())。您可以添加更多的图标??简单地重复过去的三线。RECT rect;
GetClientRect(&rect);
rect.right /= 3;
这样就可以计算客户端的矩形区域(窗口宽度的三分之一)。ATLVERIFY(m_wtlOutbar.Create(m_hWnd, &rect, NULL,
WS_CHILD|WS_VISIBLE|OBS_FORCESELECT, 0, IDC_OUTBAR));
这将创建OutBar。我们正在使用的OBS_FORCESELECT风格。m_wtlOutbar.SetImageList(il, OBSIL_NORMAL);
我们设置的OutBar的ImageList。请注意,OBSIL_NORMAL是支持的唯一的图像列表样式。请注意,我们正在创建的ImageList quot; locallyquot;(ImageList中的范围是OnInitDialog方法)。这是确定的,因为OutBar将采取的ImageList(我们还没有使用OBS_SHAREIMAGELIST风格)的所有权。ATLVERIFY(m_wtlOutbar.SetFolderCount(10));
我们准备10文件夹(我们将不会使用他们)的内存。ATLVERIFY(m_wtlOutbar.AddFolder(OBFF_TEXT|OBFF_PARAM, _T("[2]"), 3) != -1);
ATLVERIFY(m_wtlOutbar.InsertFolder(0, OBFF_TEXT|OBFF_PARAM, _T("[1]"), 5) != -1);
我们添加两个文件夹(在技术上,我们添加一个文件夹,然后我们刚刚添加的文件夹之前插入另一个文件夹)。我们设置标题的文件夹(,3和5的params。的InsertFolder 0的位置将被插入的文件夹的PARAM。m_wtlOutbar.AddItem(0, OBIF_TEXT|OBIF_IMAGE|OBIF_PARAM, _T("[1-1]"), 1, 10);
m_wtlOutbar.AddItem(1, OBIF_TEXT|OBIF_IMAGE|OBIF_PARAM, _T("[2-2]"), 2, 20);
m_wtlOutbar.InsertItem(0, 1, OBIF_TEXT|OBIF_IMAGE|OBIF_PARAM, _T("[1-2]"), 3, 30);
m_wtlOutbar.InsertItem(0, 2, OBIF_TEXT|OBIF_IMAGE|OBIF_PARAM, _T("[1-3]"), 4, 40);
我们增加了两个项目(一个为每个文件夹),然后我们插入另外两个(在技术上,我们使用添加(从技术上来说,添加仅仅是一个快捷的插入)插入)。我们设置的文本,图像(1,2,3和4的图标数字,零基)和参数(10,20,30和40)。第一个数字(0,1,0,0)的项目将被添加的文件夹的数量。 InsertItem方法所使用的第二个数字是该项目将被插入的位置。
完成!!
现在,你已经创造了OutBar ...您可以尝试编译,然后打开字典,并寻找一些新的不好的话(因为可以肯定,一些小的错误,在程序蠕变),正确的一切,然后重试:-)
在这个例子中,我什至用在OnSize事件处理程序:m_wtlOutbar.SetWindowPos(NULL, 0, 0, LOWORD(lParam) / 3,
HIWORD(lParam), SWP_NOMOVE|SWP_NOZORDER);
(其中lParam是窗口的新宽度)。 OutBar这样,永远是成正比的窗口。现在,你可以添加通知处理程序... ...这些BEGIN_MSG_MAP():NOTIFY_HANDLER(IDC_OUTBAR, OBN_FOLDEROPEN, OnFolderOpen)
NOTIFY_HANDLER(IDC_OUTBAR, OBN_ITEMSELECT, OnItemSelect)
NOTIFY_HANDLER(IDC_OUTBAR, OBN_ITEMSELECTAUTO, OnItemSelectAuto)
然后,创建三个通知处理程序。要搞清楚什么是新的文件夹打开,请使用:int iFolder = m_wtlOutbar.GetOpenFolder();
找出哪个项目被选中,使用:int iFolder = m_wtlOutbar.GetSelectedFolder()
int iItem = m_wtlOutbar.GetSelectedItem()
真正完蛋了!! :-)历史
wtloutbar.h - 1.0 - 2005年5月 - 初始版本(未出版)。
wtloutbar.h - 1.1 - 2006年5月 - 小的改进,补充意见。wtloutbar.h - 1.11 - 2006年5月 - 在WM_DESTROY / WM_NCDESTROY处理程序的错误修复。把CMemoryStripDC在另一头。wtloutbar.h - 1.12 - 2006年6月 - 修正小的内存泄漏(HRGN不释放)。改变在销毁过程中释放的内存。wtloutbar.h - 1.12R2 - 2007年11月 - 固定的MDI演示。最后,它似乎正常工作。如何做到这一点的好主意感谢雷纳德。许可
我是BSD的家伙,所以我将这个库在MIT许可下(一个简化的BSD许可证)许可。
版权所有(c)2005年,2006年Massimiliano阿尔贝蒂xanatos(AT)geocities.com
权限特此授权,免费,任何人获得本软件和相关文档文件(quot; Softwarequot;)副本,在软件处理,不受任何限制,包括但不限于使用权,复制,修改,合并,发布,分发,再许可,和/或出售本软件的副本,并允许该软件的提供,这样做,符合以下条件的工作的人:
上述版权声明和本许可声明应包括在所有的副本或软件的主要部分。
软件提供quot; ISquot,不附有任何种类的明示或暗示,包括但不限于适销的担保,为一个特定用途及不侵权的的适用性。在任何情况下,作者或版权持有人承担任何索赔,损害赔偿或其他责任,无论是在合同,侵权行为诉讼或其他方式,所引起,或在与软件或使用,或在其他交易相关软件。