26/02/2014
AutoCAD API для ленты с использованием C++/CLI
Есть уже несколько примеров на блоге иллюстрирующих использование API Ленты с помощью .NET, но пока нет ни одного использующего C++/CLI, так что пусть этот будет первым. Кроме того такой вопрос уже задавался членами ADN в прошлом…Есть несколько причин когда вам нужно вызвать это API из смешенного-управляемого кода::
- Вам нравится этот синтаксис (серьезно?!)
- Вам нужно вызывать C++ код из вашего проекта
- У вас есть существующие MFC диалоги и у вас нет времени или ресурсов для миграции на .NET
- Вам не нравится .NET и вы даже не хотите его пробовать, но вам нужно использовать API для настройки Ленты в AutoCAD
Для любого из этих соображений и для любых других вот как можно вызывать это API из C++. Заметим, что этот проект содержит много примеров, а не только показанные здесь:
Код - C++: [Выделить]
- [CommandMethod("AddButtonMixMng")]
- void AddButtonMixMng()
- {
- Autodesk::Windows::RibbonControl^ ribbonControl =
- Autodesk::Windows::ComponentManager::Ribbon;
- RibbonTab^ Tab = gcnew RibbonTab();
- Tab->Title = "Test Ribbon";
- Tab->Id = gcnew String("TESTRIBBON_TAB_ID");
- ribbonControl->Tabs->Add(Tab);
- RibbonPanelSource^ srcPanel = gcnew RibbonPanelSource();
- srcPanel->Title = "Panel1";
- RibbonPanel^ panel = gcnew RibbonPanel();
- panel->Source = srcPanel;
- Tab->Panels->Add(panel);
- RibbonButton^ button = gcnew RibbonButton();
- button->Text = "Button Test";
- button->ShowText = true;
- button->ShowImage = true;
- button->Orientation =
- System::Windows::Controls::Orientation::Horizontal;
- button->Size = RibbonItemSize::Large;
- button->Image =
- getBitmapEmbedded(L"Icon16x16.png", 16, 16);
- button->LargeImage =
- getBitmapEmbedded(L"Icon32x32.png", 32, 32);
- button->CommandParameter = "._HelloCmdMng ";
- button->CommandHandler = gcnew ButtonCmdHandler();
- srcPanel->Items->Add(button);
- Tab->IsActive = true;
- }
- BitmapImage^ getBitmapEmbedded(LPCTSTR pName, int height, int width)
- {
- String^ str=
- System::Runtime::InteropServices::Marshal::PtrToStringUni(
- (IntPtr)(void*)pName);
- Bitmap^ image =
- gcnew Bitmap(Assembly::GetExecutingAssembly()->
- GetManifestResourceStream(str));
- MemoryStream^ stream = gcnew MemoryStream();
- image->Save(stream,
- System::Drawing::Imaging::ImageFormat::Png);
- BitmapImage^ bmp = gcnew BitmapImage();
- bmp->BeginInit();
- bmp->StreamSource = stream;
- bmp->DecodePixelHeight = height;
- bmp->DecodePixelWidth = width;
- bmp->EndInit();
- return bmp;
- }
- ref class ButtonCmdHandler : public System::Windows::Input::ICommand
- {
- template < class T, class Cls > bool isInstance(Cls c)
- {
- return dynamic_cast< T >(c) != nullptr;
- }
- public:
- virtual bool __clrcall CanExecute(
- System::Object^ parameter) sealed
- {
- return true;
- }
- virtual event EventHandler^ CanExecuteChanged;
- virtual void __clrcall Execute(System::Object^ parameter) sealed
- {
- if (isInstance<RibbonButton^>(parameter))
- {
- RibbonButton^ button =
- dynamic_cast<RibbonButton^>(parameter);
- Document^ doc =
- Application::DocumentManager->MdiActiveDocument;
- doc->SendStringToExecute(
- dynamic_cast<String^>(button->CommandParameter),
- true, false, false);
- }
- }
- };
Исходный код: ArxMngRibbon.zip
Источник: http://adndevblog.typepad.com/autocad/2013/11/autocad-ribbon-runtime-api-with-ccli.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=561
Опубликовано 26.02.2014