制作天正工具欄
1,前言 
許多人接觸arx后,都像弄個跟天正一樣的工具欄,但是在class map中找不到從ctoolbar派生的類,由mfc創(chuàng)建的工具欄又與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向?qū)砑觮lb對象,會造成生成類的方法錯誤。 
好了,我們還需要了解acad的組件是怎么組成的,我直接說吧,大家也可以去看看vba參考中的對象模型。
IAcadToolbar是我們要創(chuàng)建的工具欄,這個類由IAcadToolbars統(tǒng)一管理,IAcadToolbars又受IAcadMenuGroup管理,由此類推,得到一個這樣的東西: IAcadToolbar-->IAcadToolbars-->IAcadMenuGroup-->IAcadMenuGroups-->IAcadApplication
其中,IAcadApplication管理了所有acad對象。 
好啦,知道路怎么走以后,下面就開始嘗試創(chuàng)建了。 
3,逐步逐步創(chuàng)建
首先當然是要創(chuàng)建上面涉及到對象的指針了
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;
復制代碼 
編譯一下,可能會出現(xiàn)AutoCAD被提示為未定義符號,這時候就把上面提及的tlh頭文件復制到工程目錄下,并在代碼段前包含。 OK,下一步就是要將pAcApplication與我們的CAD程序關(guān)聯(lián)起來了,
1. LPDISPATCH pAcDisp = acedGetIDispatch( TRUE );
2. hr = pAcDisp->QueryInterface( AutoCAD::IID_IAcadApplication,
(void**) &pAcApplication ); 3. pAcDisp->Release();
復制代碼 
如果功力不夠深的朋友會覺得不知所措,沒關(guān)系,多翻翻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就必須在這里創(chuàng)建,廢話不多說,繼續(xù)
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,現(xiàn)在來編譯一下,應該是成功的,可是會有這么個情況發(fā)生的,就是在cad工具欄上按右鍵,會發(fā)生新建的toolbar不在彈出的菜單里面,大家別著急,這里需要解釋一下,cad的菜單欄是通過menugroups管理的,
【pAcMenuGroups->Item( index, &pAcMenuGroup );】這個是獲得編號為0的菜單組指針,可能不是ACAD的菜單組,因此改良一下加入適當?shù)呐袛嗑涂梢粤恕?下面是完整的代碼
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. //缺少判斷,這里需要判斷是否已經(jīng)建立一個叫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. }
復制代碼