MFC 8 (VC++ 2005) and Windows Forms (Part III)
While describing to an ISV the MFC 8.0 support for Windows Forms, I thought about the managed class below. For a developer that knows MFC but not the managed world. I modestly think that it is more useful than CWinFormsDialog<>.
He or she could write:
void CWindowsFormsDialogTestDlg::OnBnClickedButton1() {
WindowsFormsDialog<TestForm> dlg( this ) ;
dlg->TheClassField = "An instance field in the form class" ;
dlg->textBox1->Text = "Accessing a control in the form" ; // the control Modifier has to be changed from Private (default) to Public.
if ( dlg.DoModal() == IDOK ) {
MessageBox( L"Thanks for clicking OK" ) ;
}
}
The template managed class:
#pragma once
#include <vcclr.h>
namespace Microsoft { namespace MCS { namespace Partner { namespace ISV {
using namespace System ;
using namespace Windows::Forms ;
// Inspired from https://www.acm.caltech.edu/~seanm/projects/ads/html/static__assert_8h-source.html
template<bool> struct CompileTimeError ;
template<> struct CompileTimeError<true> {} ;
#define STATIC_ASSERT(expression) { CompileTimeError<((expression) != 0)> STATIC_ASSERT_FAILURE ; (void) STATIC_ASSERT_FAILURE ; }
template <typename TForm>
ref class WindowsFormsDialog : IWin32Window {
private:
TForm ^ _form ;
IntPtr _parentWindow ;
public:
WindowsFormsDialog( CWnd * parentWindow ) {
_parentWindow = static_cast<IntPtr>(parentWindow->GetSafeHwnd() ) ;
}
WindowsFormsDialog( HWND parentWindow ) {
_parentWindow = static_cast<IntPtr>(parentWindow) ;
}
virtual property IntPtr ParentWindowHandle {
IntPtr get () = IWin32Window::Handle::get { return _parentWindow ; }
}
INT_PTR DoModal() {
// For the other values, all bets are off! ;-)
STATIC_ASSERT( int(DialogResult::Abort) == IDABORT ) ;
STATIC_ASSERT( int(DialogResult::Cancel) == IDCANCEL ) ;
STATIC_ASSERT( int(DialogResult::Ignore) == IDIGNORE ) ;
STATIC_ASSERT( int(DialogResult::No) == IDNO ) ;
STATIC_ASSERT( int(DialogResult::OK) == IDOK ) ;
STATIC_ASSERT( int(DialogResult::Retry) == IDRETRY ) ;
STATIC_ASSERT( int(DialogResult::Yes) == IDYES ) ;
// "this" does expose IWin32Window!
return static_cast<INT_PTR>( _parentWindow == IntPtr(0) ? Form->ShowDialog()
: Form->ShowDialog(this)) ;
}
operator TForm ^ () {
return Form ;
}
TForm ^ operator->() {
return Form ;
}
property TForm ^ Form
{
TForm ^ get() {
if ( _form == nullptr ) { // not thread-safe...
_form = gcnew TForm() ;
}
return _form ;
}
}
} ;
}}}}
Thoughts?
(Listening to ” Hablame de ti bella señora… yo te encuentro bella como una escultura… Señora solitaria.”)