- UID
- 3558
- 积分
- 418
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-4-3
- 最后登录
- 1970-1-1
|
发表于 2005-4-12 22:28:45
|
显示全部楼层
这个问题问的比较范,不太好回答,希望以后不要问这样的问题,否则,可用的回复会很少,最好就一个具体的问题展开讨论。我就以下点着重说明一下:
1、XTreme Toolkit的前身就是CJ60库它的设计思路基本上沿着MFC走的,所以不论MFC的从兼容性还是各子构件的独立性上,都比较好用。它既适合于独立的、新开发的系统,也适合于非独立、既有系统的改进。
2、BCG库在设计上,跟MFC有一定差距,但系统性极好,几乎所有子构件间都有一定的关联性。所以在使用上与XTreme Toolkit有些差别:主要的构件(如框架窗体、工具条、菜单条、可停靠面板等)只能用于独立的系统,因为它们之间的关联太强,不好拆开。
3、这两种库中的小构件(如组合框、按钮、任务面板等)均可以独立使用。用法跟普通MFC控件的用法完全一样:定义类变量->变量与控件的映射->用类变量操纵控件以及消息处理。
4、对于工具条、菜单条、可停靠面板等停靠系统所属构件,只有XTreme Toolkit库可用于非独立系统,因为这些构件都要与主窗体关联,且需要主窗体提供某些特殊功能。对于ARX,CAD主窗体的功能是死的且不可改变(或许可以,但至少我没做出来)。而XTreme Toolkit库对此问题作了变通的方法,使得我们可以用钩子和虚函数等方法将标准CMDIFrameWnd类动态转换为其它派生类,并将对标准CMDIFrameWnd的扩充功能转接到新类实例上...
5、说了这么多,不知你明白了没?可能没明白!下面就CJ60库说一下工具条的创建过程:
(1)、用向导生成一个消息处理器窗口:CMsgWnd *pOwner;
(2)、创建工具条过程:
extern CCJToolBar *pgToolBar;
void ToolBar()
{
CMDIFrameWnd *pFrm=acedGetAcadFrame();
if(pgToolBar==NULL)
{
pgToolBar=new CCJToolBar;
pgToolBar->Create(pFrm);
pgToolBar->SetWindowText(_T("工具条"));
AfxSetResourceHandle(GetModuleHandle("bartest.arx"));
pgToolBar->LoadToolBar(IDR_TOOLBAR);
CMsgWnd *pOwner=GetMsgWnd();//创建消息处理器窗口
pgToolBar->EnableDocking(CBRS_ALIGN_ANY);
pFrm->EnableDocking(CBRS_ALIGN_ANY);
pFrm->DockControlBar(pgToolBar);
pFrm->ShowControlBar(pgToolBar,TRUE,FALSE);
pgToolBar->SetOwner(pOwner);//设置工具条的拥有者为消息处理器窗口,此句必须
AfxSetResourceHandle(acedGetAcadResourceInstance());
}
else
{
if(!pgToolBar->IsVisible())
pFrm->ShowControlBar(pgToolBar,TRUE,FALSE);
}
}
(3)、所有工具条的命令处理和按钮状态更新,在消息处理器窗口中处理。
(4)、工具条销毁:
CMDIFrameWnd *pFrm=acedGetAcadFrame();
if( pFrm!=NULL && ::IsWindow(pFrm->GetSafeHwnd()) )
{
if(pgToolBar!=NULL && IsWindow(pgToolBar->GetSafeHwnd()) )
{
pgToolBar->DestroyWindow();
delete pgToolBar;
pgToolBar=NULL;
}
pFrm->RecalcLayout();
}
希望通过上面的例子,能举一反三,因为CJ60库最简单易用的,XTreme Toolkit比他要复杂一些。 |
|