Click here to Skip to main content
11,720,321 members (78,116 online)
Click here to Skip to main content

Inserting a Doc/Frame/View in a dialog using a custom control

, 12 Sep 2001 251.5K 7.3K 127
Rate this:
Please Sign up or sign in to vote.
A custom control allowing to insert a doc/view/frame architecture in a dialog/formview

Sample Image

Introduction

MFC architecture is often based on Doc/View/Frame architecture. Sometimes, it may be useful to have a doc/view/frame architecture in a dialog frame, or a formview. For example, if we want to edit a file (text, image, table, ...) in a dialog, or whatever. The set of class presented here can be useful.

For the time being, I never seen a such architecture, it is why I decided to implement it. 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.

How That works

The class CDFVCtrl is a custom control. Its Create Method takes the following information:

  • Parent pointer (dialog/formview/...), the ID of the custom control (defined with the dialog editor - see below)
  • Doc/View/Frame class,
  • style and extended style of the frame.

The custom control create a document template (CDFVDocTemplate). That allows us to benefit all the MFC implementation. Some of this implementation had to be reimplemented in order to satisfy our need. That's why we have the following class:

  • CDFVDocument (base class: CDocument)
  • CDFVFrameWnd (base class: CFrameWnd)
  • CDFVDocTemplate (base class: CSingleDocTemplate)

How to use it

Files needed:

  • DFVDocument.h and DFVDocument.cpp
  • DFVFrameWnd.h and DFVFrameWnd.cpp
  • DFVDocTemplate.h and DFVDocTemplate.cpp
  • DFVCtrl.h and DFVCtrl.cpp

Of course, you need to have Doc/Frame/View classes. In the demo project, these classes are called:

  • CSampleDoc/CMainFrame/CSampleView (I simply created a SDI project named "Sample")

A sample...

  1. Create a SDI project and add the DFV files. If you want to see these files in the ClassWizard, close the project, delete the .clw and .ncb files, reopen the project, and open ClassWizard, Click 'yes' on the first dialog, 'Add All' on the second and 'OK'.
  2. Create a dialog resource and add PICTURE control on it (this method to create custom control is - I think - the simplest way to create a custom control)

    For each picture control, uncheck the "visible" style, and name these control IDC_DFVCTRL1, IDC_DFVCTRL2, IDC_DFVCTRL3, ...

  3. Create the dialog class associated with this resource (CSampleDialog).
  4. In the Application class (SampleApp.cpp), remove the ONCOMMAND line :
    ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
    ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
    ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
    
  5. In the InitInstance Method, remove the DocTemplate instructions, and the others following instructions. Add the initialization dialog instructions. You should have something like :
    BOOL CSampleApp::InitInstance()
    {
        AfxEnableControlContainer();
    
        // Standard initialization
        // If you are not using these features and wish to reduce the size
        //  of your final executable, you should remove from the following
        //  the specific initialization routines you do not need.
    
    #ifdef _AFXDLL
        Enable3dControls();    // Call this when using MFC in a shared DLL
    #else
        Enable3dControlsStatic(); // Call this when linking to MFC statically
    #endif
    
        // Change the registry key under which our settings are stored.
        // TODO: You should modify this string to be something appropriate
        // such as the name of your company or organization.
        SetRegistryKey(_T("Local AppWizard-Generated Applications"));
    
        LoadStdProfileSettings();  // Load standard INI file options (including MRU)
    
        // Register the application's document templates.  Document templates
        //  serve as the connection between documents, frame windows and views.
        CSampleDialog Dlg;
        Dlg.DoModal();
    
        return TRUE;
    }

    (of course, #include "SampleDialog.h")

  6. In the Dialog Class (CSampleDialog), #include "DFVCtrl.h" and add the following attributes:
    CDFVCtrl m_DFVCtrl1, m_DFVCtrl2, m_DFVCtrl3;

    (corresponding to the quantity of DFV control you want to add)

  7. With the ClassWizard create an InitDialog method for the dialog and add the following code:
    BOOL CSampleDialog::OnInitDialog() 
    {
        CDialog::OnInitDialog();
        
        // TODO: Add extra initialization here
        m_DFVCtrl1.Create(this, IDC_DFVCTRL1,
            IDR_MAINFRAME,
            RUNTIME_CLASS(CSampleDoc),
            RUNTIME_CLASS(CMainFrame),       // main SDI frame window
            RUNTIME_CLASS(CSampleView),
            WS_CHILD | WS_BORDER | WS_VISIBLE, 0L);
    
        m_DFVCtrl2.Create(this, IDC_DFVCTRL2,
            IDR_MAINFRAME,
            RUNTIME_CLASS(CSampleDoc),
            RUNTIME_CLASS(CMainFrame),       // main SDI frame window
            RUNTIME_CLASS(CSampleView),
            WS_CHILD | WS_BORDER | WS_VISIBLE, 0L);
    
        m_DFVCtrl3.Create(this, IDC_DFVCTRL3,
            IDR_MAINFRAME,
            RUNTIME_CLASS(CSampleDoc),
            RUNTIME_CLASS(CMainFrame),       // main SDI frame window
            RUNTIME_CLASS(CSampleView),
            WS_CHILD | WS_BORDER | WS_VISIBLE, 0L);
        return TRUE;  // return TRUE unless you set the focus to a control
                      // EXCEPTION: OCX Property Pages should return FALSE
    }

    of course, you have to include the doc/frame/view files

    #include "SampleDoc.h"
    #include "SampleView.h"
    #include "MainFrm.h"
  8. Replace the base class for the following classes (do not forget to replace all the occurrences of the base class, you can reupdate the ClassWizard like seen previously in Step 1):
    • document class (CSampleDocument): CSampleDocument inherits from CDFVDocument.
    • frame class (CMainFrame): CMainFrame inherits from CDFVFrameWnd

    of course, you have to include the according files.

  9. Compile and execute. Funny, huh ?

Known Bugs:

  • some keys seems not working in the second CEditView (Return, Tab, ...). May be it is a bug inside CEditView regarding this application.
  • the menu bar does not appear when the frame has a parent (if someone can tell me why...)

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author

Jean-Louis Guenego
United States United States
Professor in physics at Universty of Marne-La-Vallee (Paris, France).
Ex-Consultant (in Telecom) for Cap Gemini America at Atherton (Silicon Valley, San Francisco, CA USA).
I like very much coding.

You may also be interested in...

Comments and Discussions

 
QuestionImplementing this sollution in VS2010? Pin
StoyanovZ15-Dec-13 23:04
memberStoyanovZ15-Dec-13 23:04 
GeneralMy vote of 4 Pin
venkat.yva14-Sep-13 2:23
membervenkat.yva14-Sep-13 2:23 
QuestionHow About MDI ))) ? Pin
tmx22-Mar-12 0:42
membertmx22-Mar-12 0:42 
Questionstatus bar stop working???? Pin
mochenoo22-Feb-10 1:31
membermochenoo22-Feb-10 1:31 
GeneralGood~~ Help Pin
csb18-Feb-08 18:55
membercsb18-Feb-08 18:55 
GeneralResizing the View automatically when the Control is resized Pin
Iain Clarke13-Aug-07 22:17
memberIain Clarke13-Aug-07 22:17 
QuestionCompare two files ? Pin
TrangLy10-Jun-07 7:56
memberTrangLy10-Jun-07 7:56 
Generali use this code because: Pin
gergo834-Apr-07 4:42
membergergo834-Apr-07 4:42 
Questionhow to acces each view Pin
aldo hexosa23-Aug-06 17:08
memberaldo hexosa23-Aug-06 17:08 
QuestionHow to get the pointer of Dialog in the View class Pin
fuchies19-Aug-06 15:45
memberfuchies19-Aug-06 15:45 
AnswerRe: How to get the pointer of Dialog in the View class Pin
alex12318-May-08 17:30
memberalex12318-May-08 17:30 
Generalvery good Pin
nightmouse1-Aug-06 19:26
membernightmouse1-Aug-06 19:26 
GeneralMemory Leaks Pin
0898908810-Jul-06 23:24
member0898908810-Jul-06 23:24 
AnswerRe: Memory Leaks Pin
PanicMan3-Feb-09 23:26
memberPanicMan3-Feb-09 23:26 
GeneralPrint Preview Pin
bbianco11-Apr-06 9:25
memberbbianco11-Apr-06 9:25 
AnswerRe: Print Preview Pin
Michael Adamus29-Apr-10 10:49
memberMichael Adamus29-Apr-10 10:49 
QuestionHow to... Doc View FROM a dialog (not inside a dialog)? Pin
Rajeswari, T.30-Mar-06 16:57
memberRajeswari, T.30-Mar-06 16:57 
GeneralVery useful article Pin
bobibe15-Feb-06 19:15
memberbobibe15-Feb-06 19:15 
QuestionMDI concept Pin
_pw26-Dec-05 16:21
member_pw26-Dec-05 16:21 
Generalvery good Pin
hanlwang25-Oct-05 17:34
memberhanlwang25-Oct-05 17:34 
Generalvery good Pin
hanlwang25-Oct-05 17:32
memberhanlwang25-Oct-05 17:32 
GeneralGood thoughts, I will use your idea in my project. Pin
pingdee16-May-05 7:06
memberpingdee16-May-05 7:06 
GeneralGood Code, but seems pretty useless Pin
CharlieC18-Apr-04 16:36
memberCharlieC18-Apr-04 16:36 
QuestionMDI version? Pin
davem125-Mar-04 7:03
memberdavem125-Mar-04 7:03 
GeneralMenu handle resource leak Pin
Jim Tarrant15-Mar-04 0:21
memberJim Tarrant15-Mar-04 0:21 
QuestionRe: Menu handle resource leak Pin
gotopt27-Aug-06 15:51
membergotopt27-Aug-06 15:51 
GeneralENTER and TAB keys not working - solution Pin
Jim Tarrant5-Mar-04 2:07
memberJim Tarrant5-Mar-04 2:07 
Generalsorry, I didn't say it clear Pin
zycmy61042-Sep-03 15:06
memberzycmy61042-Sep-03 15:06 
GeneralGood Code and View Pin
zycmy61042-Sep-03 14:59
memberzycmy61042-Sep-03 14:59 
QuestionWhat about the FormView ? Pin
Yasen Georgiew3-Jun-03 4:39
memberYasen Georgiew3-Jun-03 4:39 
AnswerRe: What about the FormView ? Pin
carmelo11-Dec-04 8:10
membercarmelo11-Dec-04 8:10 
GeneralGreat job! Pin
jrivero18-Mar-03 14:11
memberjrivero18-Mar-03 14:11 
QuestionHow can I resize controls on the dialog? Pin
JaroBartko10-Dec-02 0:46
memberJaroBartko10-Dec-02 0:46 
AnswerRe: How can I resize controls on the dialog? Pin
John Simmons / outlaw programmer10-Dec-02 1:06
memberJohn Simmons / outlaw programmer10-Dec-02 1:06 
GeneralRe: How can I resize controls on the dialog? Pin
amn18-Nov-03 3:15
memberamn18-Nov-03 3:15 
AnswerRe: How can I resize controls on the dialog? Pin
carmelo11-Dec-04 8:18
membercarmelo11-Dec-04 8:18 
Generalthere is a run-time error in debug version Pin
snow16-Oct-02 22:26
susssnow16-Oct-02 22:26 
QuestionHow can I open an URL later on? Pin
Liu, Yi25-Aug-02 16:53
sussLiu, Yi25-Aug-02 16:53 
AnswerRe: How can I open an URL later on? Pin
carmelo11-Dec-04 8:25
membercarmelo11-Dec-04 8:25 
Questioncan we do opposite Pin
Nitin Dubey4-Jun-02 2:46
memberNitin Dubey4-Jun-02 2:46 
GeneralrejeeshGood work!!! Pin
Rejeesh.T.S27-Nov-01 3:46
memberRejeesh.T.S27-Nov-01 3:46 
GeneralRe: rejeeshGood work!!! Pin
Liu, Yi25-Aug-02 17:03
sussLiu, Yi25-Aug-02 17:03 
Generalmemory leaks Pin
Mohamed KHADRAOUI17-Sep-01 5:44
memberMohamed KHADRAOUI17-Sep-01 5:44 
GeneralRe: memory leaks Pin
Tri VU15-Jan-02 21:53
memberTri VU15-Jan-02 21:53 
GeneralRe: memory leaks Pin
p1x3-Feb-02 13:23
memberp1x3-Feb-02 13:23 
GeneralRe: memory leaks Pin
Altair_Liu17-Apr-02 19:18
memberAltair_Liu17-Apr-02 19:18 
GeneralRe: memory leaks Pin
carmelo11-Dec-04 8:02
membercarmelo11-Dec-04 8:02 
GeneralRe: memory leaks Pin
Anonymous30-Jun-02 20:58
memberAnonymous30-Jun-02 20:58 
GeneralRe: memory leaks Pin
WREY15-Sep-02 14:36
memberWREY15-Sep-02 14:36 
GeneralRe: memory leaks Pin
snow7-Oct-02 22:18
susssnow7-Oct-02 22:18 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.150901.1 | Last Updated 13 Sep 2001
Article Copyright 2001 by Jean-Louis Guenego
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid