Click here to Skip to main content
6,630,586 members and growing! (19,114 online)
Email Password   helpLost your password?
Desktop Development » Dialogs and Windows » General     Intermediate License: The Code Project Open License (CPOL)

Modal MFC frame window

By Alexey Nikitin

Utility class that helps to implement a modal dialog's behavior for any CFrameWnd-derived window class in an easy way.
VC6, VC7Win2K, WinXP, MFC, Dev
Posted:31 May 2003
Updated:9 Aug 2005
Views:80,061
Bookmarked:34 times
Announcements
Loading...
 
Search    
Advanced Search
Add to IE Search
printPrint   add Share
      Discuss Discuss   Broken Article?Report  
17 votes for this article.
Popularity: 5.73 Rating: 4.66 out of 5

1

2

3
4 votes, 23.5%
4
13 votes, 76.5%
5

Introduction

Sometimes, it may be useful to have a modal window with Doc/View architecture, toolbars/statusbar support (i.e. base features implemented in MFC frame windows). How to get these without implementing all of these features in a CDialog-derived class? The CModalFrame utility class presented here helps you implement a modal dialog's behavior for any CFrameWnd-derived window class in an easy way.

If you have to use it and have a bit of time, please add a comment at the bottom of this page and tell, in which context you decided to use this code. I would be interested.

Background

Some basic facts:

  • All required features are already implemented in CFrameWnd-derived classes.
  • The basic support of modal message loop is already implemented in the CWnd class.

Brief implementation description:

  1. The utility code uses only the CFrameWnd class interface and does not make any suggestions about the internal implementation details of any CFrameWnd-derived classes.
  2. CModalFrame::Run creates an instance of the internal CModalDialogLock class which:
    • stores modal loop context,
    • runs modal message loop and,
    • supports multiple running modal frames.
  3. CModalDialogLock subclasses the created frame window to provide:
    • update command UI for the frame on WM_KICKIDLE message,
    • exit from modal message loop on WM_NCDESTROY message and,
    • restore standard modal window behavior on WM_NCACTIVATE message.
  4. You should not use WS_CHILD window style for a frame. Because its parent window is disabled during modal loop. So child frame window also will be disabled (for example, MDI child frame)!

Using the code

  • Files needed:
    • ModalFrame.h
    • ModalFrame.cpp

Sample of usage:

void CMyView::OnRunModalFrame()
{
    CCreateContext context;
    context.m_pNewViewClass = RUNTIME_CLASS(CMyOtherView);
    context.m_pCurrentDoc = GetDocument();
    context.m_pNewDocTemplate = GetDocument()->GetTemplate();
    context.m_pLastView = this;
    context.m_pCurrentFrame = GetParentFrame();

    CRuntimeClass * pFrameClass = RUNTIME_CLASS(CMyModalFrame);

    if (!CModalFrame::Run(*pFrameClass, false, IDR_MYFRAMERESOURCE,
                          WS_OVERLAPPEDWINDOW | 
                          FWS_ADDTOTITLE, this, &context))
    {
        AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
    }
}

// don't forget close modal frame like a modal dialog box!

void CMyModalFrame::OnClose()
{
    int nModalResult = -1;
    CModalFrame::End(this, nModalResult);
}

See demo project code for more details.

History

  • Version 1.2
    • Bug fixing.
    • More accurate work with a stack of modal frames.
  • Version 1.1
    • Implemented support for multiple running modal frames.
    • More accurate restoring active window after the end of the modal message loop.
  • Version 1.0
    • Initial version.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Alexey Nikitin


Member

Occupation: Team Leader
Company: Complex A5 Co. Ltd.
Location: Russian Federation Russian Federation

Other popular Dialogs and Windows articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 21 of 21 (Total in Forum: 21) (Refresh)FirstPrevNext
GeneralThank you for your simple project PinmemberLi Shu20:50 23 Oct '08  
GeneralIs it possible to pass parameters to my view or frame after doModal and how! Pinmemberchiheb zak12:10 27 Feb '07  
AnswerRe: Is it possible to pass parameters to my view or frame after doModal and how! PinmemberAlexey Nikitin8:52 12 Mar '07  
GeneralRe: Is it possible to pass parameters to my view or frame after doModal and how! Pinmemberchiheb zak4:36 13 Mar '07  
GeneralWorks well but crashes when opening folder on desktop PinmemberWolfram Rösler4:22 31 Jan '07  
GeneralRe: Works well but crashes when opening folder on desktop PinmemberAlexey Nikitin13:00 15 Feb '07  
GeneralRe: Works well but crashes when opening folder on desktop PinmemberWolfram Rösler23:19 19 Feb '07  
GeneralVery useful and practical code Pinmemberskywalkerking8:57 28 Nov '06  
Generalaccess violation error with modal in modal PinmemberBrad Ulrich9:07 17 May '05  
GeneralRe: access violation error with modal in modal PinmemberAlexey Nikitin0:32 22 May '05  
GeneralRe: access violation error with modal in modal PinmemberBrad Ulrich5:19 2 Aug '05  
GeneralRe: access violation error with modal in modal PinsussAnonymous11:12 11 Aug '05  
GeneralRe: access violation error with modal in modal PinmemberAlexey Nikitin11:15 11 Aug '05  
GeneralHow to embody Modeless Frame Window ? PinmemberUriDokDo3:20 31 Mar '05  
GeneralModal CMDIFrameWnd PinmemberUrban Olars12:17 17 Dec '04  
GeneralRe: Modal CMDIFrameWnd Pinmemberdirtcooker3:48 25 May '05  
GeneralPassing parameters to my frame class PinmemberUrban Olars10:25 8 Dec '04  
GeneralRe: Passing parameters to my frame class PinmemberAlexey Nikitin23:27 10 Dec '04  
GeneralRe: Passing parameters to my frame class PinmemberUrban Olars9:26 13 Dec '04  
Generalmodal from modal? Pinmemberbagsmode7:42 3 Aug '03  
GeneralGood work, some remarks PinmemberFransB21:33 23 Jun '03  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 9 Aug 2005
Editor: Smitha Vijayan
Copyright 2003 by Alexey Nikitin
Everything else Copyright © CodeProject, 1999-2009
Web18 | Advertise on the Code Project