返回首页

{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,不附有任何种类的明示或暗示,包括但不限于适销的担保,为一个特定用途及不侵权的的适用性。在任何情况下,作者或版权持有人承担任何索赔,损害赔偿或其他责任,无论是在合同,侵权行为诉讼或其他方式,所引起,或在与软件或使用,或在其他交易相关软件。

回答

评论会员:qqj1228 时间:2011/12/06
您的代码是巨大的。但是我发现在"wtloutbar.h"上线3340的错误。
} else {

	m_arpFolders[m_uFolderOpen]->m_uOffset = (size_t)((int)(m_arpFolders[m_uFolderOpen]->m_arpItems.GetCount() * OB_VERTICALICONSPACE) - rect.bottom);

 

	bRedrawScrollDown = uOffsetOld != m_arpFolders[m_uFolderOpen]->m_uOffset;

}

"m_arpFolders [m_uFolderOpen] - GT m_uOffset =(为size_t)((INT)(m_arpFolders [m_uFolderOpen] - GT; m_arpItems.GetCount()* OB_VERTICALICONSPACE) - rect.bottom);"worng"m_arpFolders [m_uFolderOpen] - GT m_arpItems.GetCount()* OB_VERTICALICONSPACE"小于"rect.bottom"

所以我修改了它:
} else if (m_arpFolders[m_uFolderOpen]->m_arpItems.GetCount() * OB_VERTICALICONSPACE > (size_t)rect.bottom){

	m_arpFolders[m_uFolderOpen]->m_uOffset = (size_t)((int)(m_arpFolders[m_uFolderOpen]->m_arpItems.GetCount() * OB_VERTICALICONSPACE) - rect.bottom);

 

	bRedrawScrollDown = uOffsetOld != m_arpFolders[m_uFolderOpen]->m_uOffset;

} else

{

	bRedrawScrollDown = FALSE;

	m_arpFolders[m_uFolderOpen]->m_uOffset = 0;

}
工作正常
评论会员:。hkfrank 时间:2011/12/06
!真正伟大的工作

但是任何一个Win2000的计算机上进行测试?
评论会员:free2000fly 时间:2011/12/06
?您好,我喜欢你的greate工作,但MDI样品,当我的"新"10子框架,您的应用程序将崩溃,为什么


工作狩猎
评论会员:xanatos 时间:2011/12/06
最简单的答案是,这篇文章是不是MDI分割(它的明确书面某处)。
硬'n'困难的答案是,并不意味着CSplitter窗口类和MDI窗口类一起使用。 WTL的MDI的实现是基于概念的m_hWndClient的父("灰色"领域的MDI客户窗口去)是主框架窗口。这是错误的,如果有一个在中间的分割窗口。该错误是生成时,在窗口菜单是在第10的时间(更新第10次"特殊",因为它是用不同的方式处理,您可以只有在窗口菜单9"直接链接"到Windows。"第十之一打开一个新的对话框,您可以选择你想要去的地方)。如果你拿走的"窗口"菜单上不会有问题(我的MDI分裂引用文章中的程序不更新"窗口"菜单)
有关于如何搭配WTL和斯普利特在WTL雅虎组的一些建议。
---再见
评论会员:xanatos 时间:2011/12/06
找到一个解决办法... ...这很简单,它似乎工作... ...也许我会写一篇文章就如何做到这一点。我将在一两天后的新的演示。如果你想读它,你可以看一下WTL的雅虎集团(我宁愿等待一些日子,看看我的解决方案有任何问题,然后重新发布一个新的演示)
评论会员:xanatos 时间:2011/12/06
发表一个固定的版本MDI的演示。在XP SP2的测试,并没有主题。
,如果任何人都可以测试对W98,ME和NT4我会很高兴。
---再见
评论会员:nkajale 时间:2011/12/06
我新的WTL的。我想我的MFC应用程序添加Outlook风格的标签。我碰到你的演示,并发现它非常酷。但我不能在我的MFC应用程序中使用WTL的前景吧。
我试图通过对主题的文章(MFC应用程序中使用WTL的)提供的帮助,但仍然获得了很多的错误。你能帮助吗?
评论会员:xanatos 时间:2011/12/06
埃姆...如果你不告诉我,究竟您尝试这样做,我不能尝试修复它。那么你想获得?

---再见
评论会员:xanatos 时间:2011/12/06
你能帮助的错误呢?我使用WTL71。谢谢!

- 修改,2006年5月10点39分(星期日)28