返回首页

{A}
简介Bwahahahhah ...我的第二条/库/程序!这个库(ATL库和基于WTL的库支持)将使您的Windows自动调整大小的控制。他们会适应窗口的大小。
库​​是相当先进... ...它支持透明控制,嵌套组的控制,控制跨越多个行和列,滚动窗口,自动设定的最小和最大大小的窗口和许多其他的事情... ...但它的相当公测的材料... ...我没有测试所有可能的组合中的所有功能。
库​​需要VC(我已经测试它与VC 8.0,但它应该与早期版本的工作... ...我不是很肯定的要早得多,因为我用很多quot;奇怪tricksquot; VC),ATL (可能至少7.0),它支持WTL的库(编译AutoSizeScroll你需要一个最新版本的WTL,WTL的7.5是最近的... ...还有什么是不是!)注释如果你是一个纯粹的C库,你SHOUDN'T看看...我做了这么多的错误的东西,你会生病成为只看到他们:-)我已经使用了相当宽松的_alloca quot; functionquo​​t;即使在数组初始化中,使用的quot;,quot;运营商,和太许多其他quot; wrongquot;东西...但我有评论与Doxygen的主要方法和常量,所以你可以quot; compilequot;文件(已在HTML和CHM格式编译的。)。该库不使用堆内存。它只使用堆栈....它使用相当多... ... (第..你将不再需要兆字节的栈... ...只有一个千字节或可能) 库是如何工作的
{S2}
(注意,这个形象是非常相似 ...但抄袭是一种奉承)
观察,我们分为COLS行(橙色线)我们的窗口。浅灰色的矩形窗口ctrls。白色矩形是一个ctrlless面积。
我们ctrls可以跨越多个列/行(例如CTRL 6和9跨度2和第3列,8跨度2行)。
CTRL甚至可以ctrls汇总组(嵌套面积)(见11-12-13-14 ctrls下有一个浅灰色的矩形,跨越三列和两行)。
ctrls汇总组依次分列和行(3列两排,暗灰色矩形)。现在我们将学习如何来形容这个库。使用图书馆
,你需要包括后atlwin.h包括(可能在stdafx.h)atlautosizedlg.h。在stdafx.h中前第一个#包括把这个:

#define WINVER 0x0500

#define _WIN32_WINNT 0x0500

然后添加DLG /窗口类的声明:
我们看到了什么?我们看到,我们已经开始与BEGIN_WINDOW_MAP()。第一个参数是类的名称,那么我们有一个左/右边距,上/下的保证金,ctrls和控制之间的垂直的差距之间的水平差距。然后我们有一个列标题。每一列是描述这种格式:。WMB_COL(大小)
记住:以上尺寸可以是在对话框单位表示(看在MSDN一个DLGUnit是什么,并请记住,它的的测量单位用于由Visual Studio )或以像素为单位。使用像素数负。所以60是60 DLGUnits,-60是60像素。如果您有特殊标志传递给宏,你可以做这样的事情:60 | FLAG1或-60 ^ FLAG1(你必须使用负数的XOR运算符(^))。为空ID2的,我们使用一个单一的下划线(_)(甚至双下划线(_)将工作)。
请注意,并非所有的行需要"completequot;最后一行(与ID10)是不完整的,一切正常。
我们使用_r和_D一个CTRL跨越多个列和行(_r =右,_D =向下)。 _exp手段,而不是一个固定的宽度/高度的行/列将扩大到尽可能大。
我们没有ctrls 11-14。现在,我们将包括他们...而是
WMB_ROW(_exp, _d), 

WMB_ROW(15,   ID10), 

把这个:
WMB_ROW(_exp, _d,     WMB_HEAD(     WMB_COL(35), WMB_COL(_exp), WMB_COL(30)),

                      WMB_ROW(_exp, ID12,        ID13,          ID14), 

                      WMB_ROW(30,   ID15,        _r,            _r), 

                      WMB_END()),        

                                  _r, _r), 

WMB_ROW(15,   ID10,   _d), 

注意如何使用逗号。几乎总是有一个逗号,一个宏后,除非宏是另一个宏的最后一个参数。最后WMB_END(END_WINDOW_MAP()之前)不能有一个逗号。需要注意的是,使一个CTRL(或一组的ctrls)跨越多个COLS和行,你这样做:
IDCtrl, _r, _r, 

_d,     __, __, 

_d,     __, __ 

根据_r你不需要添加_D或_r ...你甚至可以把另一个CTRL(提示提示:组框与ctrls)
IDGroup, _r,  _r,  _r,

_d,      ID1, ID2, 

_d,      ID3, ID4,

_d 

额外_r和_D给予一定的ID2和ID4的右边距和组框的右边缘之间的空间。
为了使一切工作的BEGIN_MSG_MAP结束(),你必须添加:
BEGIN_MSG_MAP(MyClass) 

    ... 

    CHAIN_MSG_MAP(CAutoSizeWindow<MyClass>) 

END_MSG_MAP() 

使一切工作的完美,你应该激活的WS_CLIPCHILDREN,WS_CLIPSIBLINGS风格的容器窗口和组框和图像控制矩形的透明风格。现在,一切都应该工作... ...透明控件
这个库支持透明的分组框和图像控制矩形。要激活这种支持地址:
TRANSPARENT_LIST(MyClass, IDGroupBox1, IDImageCtrl1, IDGroupBox2, IDImageCtrl2) 
BEGIN_WINDOW_MAP()之前或之后的END_WINDOW_MAP
(),记得把WS_EX_TRANSPARENT扩展样式的控件!!其他技巧有太多的quot; specialquot,可以做的事... ...列/行的大小 [_auto使用的大小列/行的最大宽度/高度的控制。无可选参数[_exp]列/行会按比例扩大。可选参数:quot; weightquot列/行(默认是:100)[_contr]如果所有其他的行/列已经刷爆了,剩余的空间将划分Contractable列之间的比例。可选参数:quot; weightquot列/行(默认是:100)[_eq]列/行会具有相同的宽度/高度和相同的最小/最大另一列/行的宽度/高度。必要的参数:列/行数(零基础的第一列/行是数字0。) [_gap]列/行广泛的GAP(有用的一些技巧)。可选参数:quot; extraquot;宽度/高度添加到列。如果DLGUnits正,负(记得^)像素[_gapm]列/行广泛的GAP(有用的一些技巧)。可选参数:quot; extraquot;宽度/高度中减去(最低0)列。如果DLGUnits正,负(记得^)像素[(无)]列的宽度/高度是固定的。必要的参数:宽度/列/行的高度。正面的,如果DLGUnits,负(记得^)像素。请注意,您不需要使用WMSRC_FIXED,因为它的0
[_nog](这是一个特殊的标志,你必须添加其他标志)。不要在前面加上通常在此之前列/行的差距。第一列/行,没有一定的差距。细胞扩增[_r]这个单元格的左侧CTRL将继续在此单元格[_D]上的Ctrl这种细胞的顶部将继续在此单元格[_放大器; __]单元格为空(你可以直接使用0,但它会更难以调试)列和行的最小和最大尺寸
(大小),而不是WMB_COL或WMB_ROW(大小,ctrls ... ...)您可以使用其他的宏,可以让你决定的最小和最大宽度/列/行的高度。
这些宏被命名为一种标准的方式:min后最大,没有什么手段,程序将尝试钙本身的价值,NOMIN或NOMAX意味着没有最低(最低为0)或有ISN吨最高。
所以我们有WMB_COL,WMB_COLMIN,WMB_COLMAX,WMB_COLMINMAX,WMB_COLNOMIN,WMB_COLNOMAX,WMB_COLNOMINNOMAX,WMB_COLNOMINMAX,WMB_COLMINNOMAX和各自的WMB_ROW *最小和/或最大的价值是这样的:
WMB_COLMIN(sizeflag, minsize) 

WMB_COLMAX(sizeflag, maxsize) 

WMB_COLMINMAX(sizeflag, minsize, maxsize) 



WMB_ROWMIN(sizeflag, minsize, ctrls...) 

WMB_ROWMAX(sizeflag, maxsize, ctrls...) 

WMB_ROWMINMAX(sizeflag, minsize, maxsize, ctrls...) 


NOMIN和NOMAX修饰符不需要参数。所以WMB_COLNOMIN(sizeflag),WMB_ROWNOMINMAX(sizeflag,MAXSIZE ctrls ... ...)...记住:所有的大小,可以在对话框单位或以像素表示。使用像素数负。参考文献
虽然我太多懒得去真正读懂它们,这个库是基于图片(意思是,我打开网页,观看图片,并发现,它们是非常美丽,给了我正确的方向):
(不,我不是在开玩笑... ...起初,我只是想创建一个宏EvaLayout基于版本...(请记住,我没有真正阅读的文章... ...我的注意力被太多的短在那个时期)所以库的1.0版本诞生了... ...然后我决定,我想ctrls嵌套组... ...,在年底,两篇文章的奇怪混合出生,但我真的是太多懒读他们... ...他们这么久... ...所以,如果你不会读这篇文章,完全我不会跟你生气:-)我不是很肯定,我会读我的文章:-) )与其他类似的库的比较
我加入这部分,因为有些人已要求它。世界图书馆将控制在一个窗口。 WTL有一个。作者简介Paul DiLascia在2001年最有名的一个。您可以使用任何你想要的库。我的生活不会改变。我什至可以帮你...这里有一个小的选择:(第一个是DiLascia的一个,它是纯粹的Windows API,未来三年的MFC(我不知道,但他们应该)... ...也许他们ATL支持他人。 WTL的(至少有一个是只是一个标准WTL的库的解释,另一种是标准WTL的库的小扩张)) {A8}{A9}{A10}{A11}{A12}{A13}{A14}{A15}
我恨我的方案与其他方案比较... ...我一直认为我的骄傲犯罪,当我做到这一点。有许多方面做的事情,因为有程序员...计划并不总是更好或更坏... ...他们往往只不同。如果你不能看到在库,那么你不应该计划的差异。如果你没有为你的程序的时间选择正确的库,那么你应该随机选择之一,并希望它最好的一个。有买的第一件事情,他们看到的人... ...有其他人尝试发现同类产品之间的差异,然后买更好的/更便宜/最均衡的...
我可以告诉你我的图书馆做什么:它的ATL / WTL的(一些库的MFC)它的MACRO。在宏观布局的控制是类似的(左到右,上下,行是行,COLS是COLS)在屏幕上会出现什么它的速度非常快。矩阵是只读一次,从第一个到最后一个元素(每进行一次OnSize事件至少)。没有堆内存分配。 API调用是有限的,其结果会被缓存。没有额外的内存分配的初始化。对于单级CTRL组的矩阵大的东西,如21(3 * 5 COLS *行1 * ctrls)整数(给予或采取一个或两个整数)它有一个组框闪烁的解决方案,支持在WinXP中的Alt键(在XP中的加速器通常是隐藏的,除非你按下Alt键,然后他们显示)它可以做几乎所有的布局...一些布局他人更困难。您必须使用智能使用这个库... ...您需要变量的差距吗?把标准的差距在0,并添加您的行/列之间的空行/列。您需要对齐Ctrl键向左或边界框右侧?添加一个空的可扩展(或contractable)列的左侧或右侧的CTRL
我什至可以告诉你什么不能做我的图书馆:这是一个库,将在一个窗口ctrls。它不是一个窗口管理库。我不会给你的方法来保存在注册表中的窗口位置。我不会给你调整窗口大小的夹子。我不会给你的滚动条(但通过CScrollImpl支持滚动条)矩阵的内部格式是一个烂摊子。矩阵是静态分配,以便直接修改它是不是一件好事,但你可以给库另一个矩阵:观察到的所有方法作为参数的矩阵。我不会给你一个quot;总sizequot的30%; CTRL,因为它是不可能的...你有一个5像素的列和75%列和10个像素宽的窗口。发生了什么?两个约束不能得到尊重。
最后我可以告诉你图书馆之间的主要区别:一些宏基础(地雷和作者简介Paul DiLascia例如)其他类的基础(你的控件添加一类在初始化窗口... ...是这样的处理程序= CTRL1;处理程序= CTRL2; ...或有是一个库布局存储在字符串中,甚至可以保存在外部文件)一些图书馆只处理控制调整大小。他们从你给他们在对话框编辑器,然后展开/合同控制比例。他们可以移动的控制,但他们相对移动它们在对话框编辑器的初始位置(WTL的标准库,例如和许多其他...几乎所有的非格)。其他库(矿及其他),让您决定在程序的某处控制的位置。对话框编辑器只用来添加控件并修改自己的风格。 有些是Windows API,一些MFC的,有些是ATL / WTL的(也许甚至是MFC / ATL库)历史atlautosizedlg.h 1.0 2006年4月初始版本(不公开)atlautosizedlg.h 2.0 2006年6月,几乎重建。现在支持多级许可
IMA BSD的家伙,让病患者的许可,这个库在MIT许可下(一个简化的BSD许可证)。
版权所有(c)2006年Massimiliano阿尔贝蒂xanatos(AT)geocities.com
权限特此授权,免费,任何人获得本软件和相关文档文件(quot; Softwarequot;)副本,在软件处理,不受任何限制,包括但不限于使用权,复制,修改,合并,发布,分发,再许可,和/或出售本软件的副本,并允许该软件的提供,这样做,符合以下条件的工作的人:
上述版权声明和本许可声明应包括在所有的副本或软件的主要部分。
软件提供quot; ISquot,不附有任何种类的明示或暗示,包括但不限于适销的担保,为一个特定用途及不侵权的的适用性。在任何情况下,作者或版权持有人承担任何索赔,损害赔偿或其他责任,无论是在合同,侵权行为诉讼或其他方式,所引起,或在与软件或使用,或在其他交易相关软件。

回答

评论会员:Vytas 时间:2011/12/06
...但数量UNO"http://www.codeproject.com/dia​​log/layoutmgr.asp"
对不起
评论会员:xanatos 时间:2011/12/06
呀... ...布局是非常具有可读性... ...
看看他的榜样... (下一个样品),这是不可能的理解如何控制会出现在屏幕上。
当我建这个库,我有两个习得条件:
一)有宏的
二)的宏布局非常相似,会是怎样在屏幕上出现(至少在一个左到右顶到底层)
c)我想一切要尽可能快。
库​​能够工作,而无需使用额外的内存堆,一切在一个单一的传递。
他的图书馆有可能更多的功能,但

a)它是不万家乐基于二)这是最后一次更新是在2000年三)的MFC,这个库是ATL / WTL的
四)我不知道,但它有一个组框在XP中忽隐忽现的主题(由2000年的)的决议?在演示中,即使没有主题,组框闪烁了很多(与分组框中对话框)

从布局的角度来看,我敢肯定,我的图书馆可以创建所有的布局layoutmgr多一些(我还没有见过的最大尺寸的选项,可以做我的图书馆扩展的行/列的最大大小)。他可以做对齐控制箱... ...我的图书馆可以做到这一点:你只需要添加一个额外的可扩展的列向左或向右。他的图书馆可以控制之间的变量空间。我的图书馆:您使用的是0峡和手工添加的"空"的空间作为一个空行/列

他已在注册表中的浆纱机械手和自动re-/storage windowsizes。
我的图书馆也没有... ...但我什至不知道它应该有... ...我已经做了库将控制在一个窗口... ...我不操纵窗口。
- 7:06(星期二)7月18日,2006年
修改
评论会员:xanatos 时间:2011/12/06
我想补充一点,我讨厌我的方案与其他方案比较... ...我一直认为我的骄傲犯罪,当我做到这一点。有许多方面做的事情,因为有程序员...计划并不总是更好或更坏... ...他们往往只不同。
评论会员:Vytas 时间:2011/12/06
您好,
... ...相信,我探头{S3}
Vytas
评论会员:伊戈尔Vigdorchik 时间:2011/12/06
,这将是一个非常有用的文章除了,如果你能解释为什么我们应该使用你的类,而不是CDialogResize类与WTL的

感谢。
评论会员:xanatos 时间:2011/12/06
我觉得(我没有使用过,但我快速读取{A16}])的主要区别,我认为是CDialogResize是控制大小调整... ...移动/调整大小的控制窗口的大小成比例,但其出发点是决定在对话框编辑器,而AutoSizeDlg更多的是基于网格的布局管理器...控件的位置和大小是决定类。我讨厌使用任何这不是一个关于"框,对话框编辑器...它总是非常复杂,即使是简单的布局。我的图书馆有更多的功能{S3}
CDialogResize很简单,只有少数控制,必须调整布局可能是更好的(比较CDialogResize是400行代码,我的库比2K)
评论会员:伊戈尔Vigdorchik 时间:2011/12/06
xanatos写道:我的图书馆还有更多的功能

谢谢(我的意思是)。