美文网首页C++\CLI
mdl Addins中加载System::Windows::Fo

mdl Addins中加载System::Windows::Fo

作者: 左图右码 | 来源:发表于2022-05-09 16:43 被阅读0次

winform的Ui编辑和编译的时候要使用不同的基类,winform的界面编辑器只能使用System::Windows::Forms::Form而不能是Bentley::MstnPlatformNET::WinForms::Adapter。甚至不能使用#define添加条件按需编译,因为界面设计器只能识别第一个class作为设计的对像。每次编译都要手工注释和修改。

使用一个辅助的类来进行加载,这个managed template只能在C++/CLI中使用。加上单例:

template<typename T>
ref class MstnForm : public T
{
    using WinFormsInteropHelper = BMW::WinFormsInteropHelper;
    using AddIn = MSTNNET::AddIn;
    using Form = System::Windows::Forms::Form;
    msclr::auto_handle<WinFormsInteropHelper> helper;
private:
    MstnForm() : T()
    {
        helper.reset(gcnew WinFormsInteropHelper(this));
    }
public:
    virtual ~MstnForm()
    {
        getInstanceRef().release();  //再次getInstanceRef获得新实例
    }
    void attach(System::String^ taskID,const wchar_t* title)
    {
        auto formHandle = dynamic_cast<Form^>(this);
        auto addins = AddIn::FindAddInByTaskId(taskID);
        if(formHandle && addins)
        {
            helper->Attach(addins, true, nullptr);
            ::SetWindowTextW((HWND)formHandle->Handle.ToPointer(), title);
            this->Show();
        }
    }
    void detachAndDestory()
    {
        if (helper)
        {
            helper->Detach();
        }
    }
    //sigleton
    static msclr::auto_gcroot<MstnForm<T>^>& getInstanceRef()
    {
        static msclr::auto_gcroot<MstnForm<T>^> _instance;
        if (!_instance)
        {
            _instance = gcnew MstnForm<T>;
        }
        return _instance;
    }
};

这么用:

void showDialog()
{
    MstnForm<HelloWorld::MyForm>::getInstanceRef()->attach("Helloworld",L"测试对话框");
}

HelloWorld::MyForm是纯粹的用vs设计器所生成的winform对话框:

formview.png

相关文章

网友评论

    本文标题:mdl Addins中加载System::Windows::Fo

    本文链接:https://www.haomeiwen.com/subject/ojbhurtx.html