美文网首页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