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
网友评论