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.”)