返回首页


简介
这个项目的想法来找我,当我试图实施一个项目,使用大量的分配器意见。我想使我的分配器意见通用的,但问题是不可能的参数传递给类的构造,使用动态创建时的。更准确地说,在我的背景下,我用CSplitterWnd的:CreateView的()来创建和更换的意见。这种方法使用的运行时类视图,动态地创建一个视图对象,因此不能给它的构造函数传递参数。这可以防止执行一个通用的分配器类创建一个分配器查看意见(或运行时类的意见)作为参数传递给它的构造。为了克服这一问题,我使用的模板。使用代码
解释代码之前,我想指出,我已经减少到工作的最低。此示例是一个使用模板,而不是一个完成的解决方案的展示。 CMySplitterView,mysplitterview.h宣布,主要负责创造了2次分配器查看模板类。模板参数TView1和TView2的意见,在拆分视图显示,而TSplitterType分配器查看created.templatelt; TView1类,TView2类,类TSplitterTypegt;类CMySplitterView:公众的CView
类型定义:水平或垂直拆分视图的布局。两个策略类定义的行为:类CHSplitterType:公共CObject的CVSplitterType类:公共CObject的
每个类定义的方法CreateSplitterView()CMySplitterView称为::OnCreate中()创建的具体布局分配器视图。此外,他们定义OnSize()CMySplitterView称为::OnSize()来设置的意见的默认大小。这部分的代码,可以大大改善。例如,模板分离器类使用的意见,可能会暴露OnSize()调用的方法,得到自己想要的的默认大小。
现在,以使这项工作需要定义分离器在代码中使用的类。在示例中,我已经使用了两个分路意见的权利的水平拆分视图和一个全球垂直拆分视图(所有的意见都CSplitterView)的模板类CMySplitterViewlt; CSplitterView,CSplitterView,CHSplitterTypegt;;模板类CMySplitterViewlt CSplitterView,tclRightView,CVSplitterTypegt;;
这里tclRightView是一个合适的水平拆分视图CMySplitterViewlt类型定义; CSplitterView,CSplitterView,CHSplitterTypegt。
创建的主要观点,我通过tclDefaultView,CMySplitterViewlt类型的定义; CSplitterView,tclRightView,CVSplitterTypegt,CSingleDocTemplate()构造函数。使用类型定义,可以想见任何可能的组合2查看分配器意见。 兴趣点
现在来了一些棘手的部分样品。当然,您将需要使用IMPLEMENT_DYNCREATE和BEGIN_MESSAGE_MAP分配器意见。不幸的是,这些宏马车和有3模板类没有宏Microsoft提供与一个或两个模板(IMPLEMENT_DYNCREATE_T,IMPLEMENT_DYNCREATE_T2类的宏我已经包括在mysplitterview.cpp:??。M_IMPLEMENT_DYNCREATE_T3和M_BEGIN_MESSAGE_MAP_T3和辅助。宏M_IMPLEMENT_RUNTIMECLASS_T3和M_RUNTIME_CLASS_T3他们3模板类的工作,下面是如何使用它们:M_IMPLEMENT_DYNCREATE_T3(CMySplitterView,CSplitterViewCSplitterView,CHSplitterType,CView中) M_BEGIN_MESSAGE_MAP_T3(CMySplitterView,CSplitterViewCSplitterView,CHSplitterType,CView中) ON_WM_SIZE() ON_WM_CREATE()END_MESSAGE_MAP()

回答

评论会员:MihailNovikov 时间:2011/11/30
M_BEGIN_MESSAGE_MAP_T3(CMySplitterView,CSplitterView,CSplitterView,CHSplitterType,CView的)
ON_WM_CREATE()
ON_WM_SIZE()
END_MESSAGE_MAP()

M_BEGIN_MESSAGE_MAP_T3(CMySplitterView,CSplitterView,tclRightView,CVSplitterType,CView的)
ON_WM_CREATE()
ON_WM_SIZE()
END_MESSAGE_MAP()
评论会员:BenjiCouratin 时间:2011/11/30
2005年与VC编译的解决方案可以评论2 Message_Map你的线程中,并加入下面的代码
。此代码将实现模板类的消息映射,而不是每个instanciation
#定义M_BEGIN_TEMPLATE_MESSAGE_MAP(theClass的T1,T2,T3,基类)\
 0; PTM_WARNING_DISABLE \
模板\
 60; CONST AFX_MSGMAP * theClass的::GetMessageMap()const的\
{返回GetThisMessageMap();} \
模板\
CONST AFX_MSGMAP * PASCAL的theClass的:GetThisMessageMap()\
{\
的typedef theClass的ThisClass; \
的typedef基类TheBaseClass; \
静态常量AFX_MSGMAP_ENTRY _messageEntries [] = \
{
M_BEGIN_TEMPLATE_MESSAGE_MAP(CMySplitterView,TView1,TView2,TSplitterType,CView的)
ON_WM_CREATE()
ON_WM_SIZE()
END_MESSAGE_MAP()


评论会员:clyni 时间:2011/11/30
您好:
我cleni@graffiti.net
感谢您有关IMPLEMENT_DYNCREAYTE_T宏
的实施我在嵌套模板中使用它定义在MFC中使用
非常漂亮!
)(_)!_@))%{ BR}

cleni