Convert modal dialogs to modeless

Many postings to CodeGuru and similar discussion groups are questions about modeless dialogs and how to keep them from blocking the parent thread. I use a user interface thread to start a conventional modal dialog that behaves modeless-ly and it's so minimalist and easy I thought others may be interested...

Instructions

  1. In your header file define a CWinThread-derived class...
      class CDialogThread : public CWinThread { DECLARE_DYNCREATE(CDialogThread) CDialogThread() {}; virtual BOOL InitInstance(); };
  2. Put this in your implementation file (where CSomeDialog is a conventional dialog class defined the usual way).
      IMPLEMENT_DYNCREATE(CDialogThread, CWinThread) BOOL CDialogThread::InitInstance() { CSomeDialog dlg; dlg.DoModal(); return FALSE; }
  3. To create an instance of your (now-modeless) modal dialog, do this...
      AfxBeginThread ( RUNTIME_CLASS(CDialogThread) );
  4. You can end the dialog the normal way by calling CDialog::EndDialog(), CDialog::OnCancel() or CDialog::OnOK(). All those special caveats about modeless dialogs (like "don't call EndDialog") no longer apply with this approach.

  5. One point to note is the return of 'FALSE' from the InitInstance() override. This tells MFC that the thread didn't start successfully, so MFC does our cleanup for us! Note that by this time the dialog has already returned and we're through with the thread. This is the same thing MFC-generated code does in the InitInstance() of dialog-based applications.


Comments

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • The impact of a data loss event can be significant. Real-time data is essential to remaining competitive. Many companies can no longer afford to rely on a truck arriving each day to take backup tapes offsite. For most companies, a cloud backup and recovery solution will eliminate, or significantly reduce, IT resources related to the mundane task of backup and allow your resources to be redeployed to more strategic projects. The cloud - can now be comfortable for you – with 100% recovery from anywhere all …

  • Instead of only managing projects organizations do need to manage value! "Doing the right things" and "doing things right" are the essential ingredients for successful software and systems delivery. Unfortunately, with distributed delivery spanning multiple disciplines, geographies and time zones, many organizations struggle with teams working in silos, broken lines of communication, lack of collaboration, inadequate traceability, and poor project visibility. This often results in organizations "doing the …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds