CWinFormsControl<System::Windows::Forms::PropertyGrid> m_wndPropertyGrid; BEGIN_DELEGATE_MAP( CPropertyGridTestDlg ) EVENT_DELEGATE_ENTRY( PropertyValueChanged , Object, PropertyValueChangedEventArgs ) EVENT_DELEGATE_ENTRY( HandleDestroyed , Object, EventArgs ) END_DELEGATE_MAP() public: void PropertyValueChanged ( Object^ sender, PropertyValueChangedEventArgs ^ e ) { TRACE("PropertyValueChanged %S\n", marshal_as<CString>(e->ToString())); } void HandleDestroyed( Object^ sender, EventArgs ^ e ) { TRACE("PropertyValueChanged %S\n", marshal_as<CString>(e->ToString())); } }; BOOL CPropertyGridTestDlg::OnInitDialog() { //为了偷懒起见,向导生成的默认代码再次省略 // TODO: 在此添加额外的初始化代码 CRect rect; GetDlgItem(IDC_PLACEHOLDER)->GetWindowRect(rect);//IDC_PLACEHOLDER是一个用来占地方的Static控件 GetDlgItem(IDC_PLACEHOLDER)->DestroyWindow(); ScreenToClient(rect);
m_wndPropertyGrid.CreateManagedControl( WS_VISIBLE|WS_CHILD, rect, this, IDC_PLACEHOLDER ); System::Windows::Forms::PropertyGrid^ pGrid=m_wndPropertyGrid.GetControl();
AppSettings^ appSettings=gcnew AppSettings; pGrid->SelectedObject=appSettings;
pGrid->PropertyValueChanged += MAKE_DELEGATE( PropertyValueChangedEventHandler ,PropertyValueChanged );
pGrid->HandleDestroyed += MAKE_DELEGATE( System::EventHandler , HandleDestroyed ); } 在VC2005二月份的CTP中使用这个功能还有一些小问题:启动的时候输出窗口有几个警告:还有一个Assert窗口,可以简单地忽略。退出的时候有一个原因不明的内存泄漏。 题外话:尽管我确定marshal_as这个函数2004年4月就在可用(在2004年4月的全球MVP峰会上,我亲眼看见对这个函数的引用在Visual C++ 2005中通过了编译),而且这个函数在各种文档中也时有出现,但是为了赶进度,这个函数似乎被砍了。为了平时偷懒起见,我不得不自己写了一个模板函数。 template<typename T> interior_ptr<T> marshal_as (String^ s) { interior_ptr<const System::Char> txt=PtrToStringChars (s); return interior_ptr<T>(txt); } |