制作天正工具栏

制作天正工具栏 
 
1,前言  
许多人接触arx后,都像弄个跟天正一样的工具栏,但是在class map中找不到从ctoolbar派生的类,由mfc创建的工具栏又与acad自带的工具栏明显不兼容(及不会停靠在一起)。一时之间难于下手。这里使用COM添加一个工具栏,与天正的工具栏一样。  
2,准备 
建立COM,必须先import acad的对象, 
#import "C:\\Program Files\\Common Files\\Autodesk Shared\\acax17enu.tlb" no_implementation raw_interfaces_only named_guids  
然后我们就可以在工程文件夹下的debug中找到一个tlh的头文件,里面就涵括了acad com对象的类定义了。注意,不能使用VC向导添加tlb对象,会造成生成类的方法错误。  
好了,我们还需要了解acad的组件是怎么组成的,我直接说吧,大家也可以去看看vba参考中的对象模型。 
IAcadToolbar是我们要创建的工具栏,这个类由IAcadToolbars统一管理,IAcadToolbars又受IAcadMenuGroup管理,由此类推,得到一个这样的东西: IAcadToolbar-->IAcadToolbars-->IAcadMenuGroup-->IAcadMenuGroups-->IAcadApplication 
其中,IAcadApplication管理了所有acad对象。  
好啦,知道路怎么走以后,下面就开始尝试创建了。  
3,逐步逐步创建 
首先当然是要创建上面涉及到对象的指针了 
1. AutoCAD::IAcadApplication *pAcApplication = NULL; 2. AutoCAD::IAcadMenuGroups *pAcMenuGroups; 3. AutoCAD::IAcadMenuGroup *pAcMenuGroup; 4. AutoCAD::IAcadToolbars *pAcToolbars; 5. AutoCAD::IAcadToolbar *pAcToolbar; 
6. AutoCAD::IAcadToolbarItem *pAcToolbarItem; 
复制代码  
编译一下,可能会出现AutoCAD被提示为未定义符号,这时候就把上面提及的tlh头文件复制到工程目录下,并在代码段前包含。 

 

 


 
OK,下一步就是要将pAcApplication与我们的CAD程序关联起来了, 
1. LPDISPATCH pAcDisp = acedGetIDispatch( TRUE ); 
2. hr = pAcDisp->QueryInterface( AutoCAD::IID_IAcadApplication, 
(void**) &pAcApplication ); 3. pAcDisp->Release(); 
复制代码  
如果功力不够深的朋友会觉得不知所措,没关系,多翻翻COM的资料,就可以理解的了。  
至此,第一步成功完成,获得了当前CAD程序的指针了。接着我们一步步弄到IAcadToolbar那里去 
1. VARIANT index; 
2. pAcApplication->get_MenuGroups( &pAcMenuGroups ); 3. pAcApplication->Release(); 4.  
5. VariantInit( &index ); 
6.   V_VT( &index ) = VT_I4; 7.   V_I4( &index ) = 0; 
8.   pAcMenuGroups->Item( index, &pAcMenuGroup ); 9. pAcMenuGroups->Release(); 10. pAcMenuGroup->get_Toolbars( &pAcToolbars ); 11. pAcMenuGroup->Release(); 
复制代码 
 
这里我们有了所有toolbar对象的集合pAcToolbars了,因此要建立一个toolbar就必须在这里创建,废话不多说,继续 
1. pAcToolbars->Add( _T("New Toolbar"), &pAcToolbar ); 2. pAcToolbars->Release(); 3. COleVariant flyOutButton; 
4. pAcToolbar->AddToolbarButton( index, TEXT("Line"), TEXT("Draw 
Lines"), TEXT("_.Line "), flyOutButton, &pAcToolbarItem ); 5. pAcToolbar->put_Visible( TRUE ); 6. //pAcToolbarItem->SetBitmaps( ) 
7. pAcToolbar->Dock( AutoCAD::acToolbarDockTop ); 8. pAcToolbar->Release(); 9. pAcToolbarItem->Release(); 
复制代码 

 

 


 
DONE,现在来编译一下,应该是成功的,可是会有这么个情况发生的,就是在cad工具栏上按右键,会发生新建的toolbar不在弹出的菜单里面,大家别着急,这里需要解释一下,cad的菜单栏是通过menugroups管理的,
【pAcMenuGroups->Item( index, &pAcMenuGroup );】这个是获得编号为0的菜单组指针,可能不是ACAD的菜单组,因此改良一下加入适当的判断就可以了。 下面是完整的代码 
1. void addToolbar() 2. { 
3. AutoCAD::IAcadApplication *pAcApplication = NULL; 4. AutoCAD::IAcadMenuGroups *pAcMenuGroups; 5. AutoCAD::IAcadMenuGroup *pAcMenuGroup; 6. AutoCAD::IAcadToolbars *pAcToolbars; 7. AutoCAD::IAcadToolbar *pAcToolbar; 
8. AutoCAD::IAcadToolbarItem *pAcToolbarItem; 9. HRESULT hr = NOERROR; 10. LPUNKNOWN lpUnk = NULL; 11. LPDISPATCH pAcDisp = acedGetIDispatch( TRUE ); 12. hr = pAcDisp->QueryInterface( AutoCAD::IID_IAcadApplication, 
(void**) &pAcApplication ); 13. pAcDisp->Release(); 14. if ( FAILED(hr) ) 15. { 16.   acutPrintf( _T("failed to query application") ); 17.   return; 18. } 19. pAcApplication->put_Visible( TRUE ); 20. pAcApplication->get_MenuGroups( &pAcMenuGroups ); 21. pAcApplication->Release(); 22. long nMenuGroupsCounted; 23. pAcMenuGroups->get_Count( &nMenuGroupsCounted ); 24. VARIANT index; 25. BSTR bstrMenuGroupName; 26. bool bGetACADMenuGroup = false; 27. BSTR acadMenuGroupName = ::SysAllocString( _T("ACAD") ); 28. for ( int i = 0; i < nMenuGroupsCounted; i++ ) 29. { 30.   VariantInit( &index ); 31.   V_VT( &index ) = VT_I4; 32.   V_I4( &index ) = i; 33.   pAcMenuGroups->Item( index, &pAcMenuGroup ); 34.   pAcMenuGroup->get_Name( &bstrMenuGroupName ); 35.   if ( wcscmp( bstrMenuGroupName, acadMenuGroupName ) == 0 ) 

 

 


36.   { 37.    bGetACADMenuGroup = true; 38.    break; 39.   } 40. } 41. SysFreeString( bstrMenuGroupName ); 42. SysFreeString( acadMenuGroupName ); 43. pAcMenuGroups->Release(); 44.  45. if ( bGetACADMenuGroup == false ) 46. { 47.   pAcMenuGroup->Release(); 48.   acutPrintf(_T("unable to get acad menu groups" ) ); 49.   return; 50. } 51.  52. pAcMenuGroup->get_Toolbars( &pAcToolbars ); 53. pAcMenuGroup->Release(); 54. //缺少判断,这里需要判断是否已经建立一个叫New Toolbar的工具栏,
具体方法大家自己琢磨琢磨 55. pAcToolbars->Add( _T("New Toolbar"), &pAcToolbar ); 56. pAcToolbars->Release(); 57. COleVariant flyOutButton; 58. pAcToolbar->AddToolbarButton( index, TEXT("Line"), TEXT("Draw 
Lines"), TEXT("_.Line "), flyOutButton, &pAcToolbarItem ); 59. pAcToolbar->put_Visible( TRUE ); 60. //pAcToolbarItem->SetBitmaps( )这个是设定工具栏图标的 61. pAcToolbar->Dock( AutoCAD::acToolbarDockTop );//这里是设定工具
栏的停靠方式 62. pAcToolbar->Release(); 63. pAcToolbarItem->Release(); 64. } 
复制代码 
  
以上代码在arx08及cad08上测试成功,祝大家编译愉快

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值