Creating a View on a Dialog

-->

Environment: NT4 SP3

Creating a view on a child frame is a basic action when programming in MFC, but what happens when you want your view to be attached to a popup dialog? This article shows a simple way to make this possible.

The idea is to create the view in the usual way (through the document template, for example), and then have the dialog set as the parent. The previous parent--probably the child frame--should be stored and set back when the dialog is destroyed. Two more steps are needed:

  1. You should hide the previous parent window.
  2. You should override the OnMouseActivate method in your view in order to prevent an assertion in the base implementation
// =============================================
// In the creator window -- 
// =============================================

// when you want to show the view
void CViewOnDlgView::OnShowdlgBtn() 
{

  // Add the desired document template
  CDocTemplate* pDocTemplate = NULL;
  pDocTemplate = new CMultiDocTemplate(
    IDR_INNERVIEW,
    RUNTIME_CLASS(CrInnerDoc),
    RUNTIME_CLASS(CChildFrame), 
// custom MDI child frame
    RUNTIME_CLASS(CrInnerView));
  AfxGetApp()->AddDocTemplate(pDocTemplate);
  
  // Create an instance of the desired document template
  CString processName; 
  bool bIsFound = false;

  CWinApp* pApp = AfxGetApp();
  POSITION curTemplatePos = 
              pApp->GetFirstDocTemplatePosition();
  while(curTemplatePos)
  {
    pDocTemplate = 
           pApp->GetNextDocTemplate(curTemplatePos);
    if (pDocTemplate)
    {
      pDocTemplate->GetDocString(processName , 
                                 CDocTemplate::docName);
      if( processName == "InnerView") 
      {
        bIsFound = true;
        break;
      }
      else
        processName = ""; 
    }
  }
  if (bIsFound)
    pDoc = pDocTemplate->OpenDocumentFile(NULL);

  // send a message to the view to move itself to 
  // the dialog
  POSITION pos = pDoc->GetFirstViewPosition();
  while (pos)
  {
    CView* pView = pDoc->GetNextView(pos);
    pView->SendMessage(WM_SHOW_ON_DLG, 0, 0);
  }
}

// =============================================
// In the view you want to put on the dialog  
// =============================================

int CrInnerView::ShowOnDlg(WPARAM wParam, LPARAM lParam)
{
  // hiding the previous parent
  GetParent()->ShowWindow(SW_HIDE);
  
  // creating the bearer dialog
  CrPopupDlg dlg;
  dlg.SetView(this);
  dlg.DoModal();

  return 0;
}

// this method needs to be overridden to prevent 
//     an assertion
int CrInnerView::OnMouseActivate( CWnd* pDesktopWnd, 
                                  UINT nHitTest, 
                                  UINT message )
{
  return MA_ACTIVATE;
}

// =============================================
// In the bearer dialog 
// =============================================

BOOL CrPopupDlg::OnInitDialog() 
{
  if (m_pView && ::IsWindow(m_pView->m_hWnd))
  {
    // set this as the view's parent and save 
    // the old parent
    m_pPrevParent = m_pView->SetParent(this);
    // resize the view to the measures of the dlg
    CRect rect;
    GetClientRect(rect);
    m_pView->MoveWindow(rect);
  }

  return TRUE;
}

void CrPopupDlg::SetView(CView* pView)
{
  // saves a pointer to the view we want to attach 
  // to this dlg
  m_pView = pView;
}

void CrPopupDlg::OnDestroy() 
{
  CDialog::OnDestroy();
  
  // set the previous parent window back as active 
  // parent and destroy both windows
  if (m_pPrevParent && ::IsWindow(m_pPrevParent->m_hWnd))
  {
    m_pView->SetParent(m_pPrevParent);
    m_pView->GetParent()->DestroyWindow();
  }
}

Downloads

Download demo project - 36 Kb
Download source - 24 Kb


Comments

  • Wholesale Oakley Radar Range fast delivery

    Posted by xtbtxblpo on 07/03/2013 07:06am

    Fake Ray Ban Sunglasses ,A brandname Oakley progress, it's by accepting the truth of some duration and job definitely pick up the development of new style. This is the reason each sunshade found in manufacturing the newest glasses trick. Vibrant and sun-damage people's eyes. Has to be possible for the glasses up your eyes on the sun's harmful sun rays and mud particles may hover more than the atmosphere of any protective covering. Oakley sunglasses are always leading in neuro-scientific science and technology, since the by using high-tech, faster and better preventive effect. OAkLey FLAk JAcket ,Oakley sunglasses designed on a yearly basis to modify, like almost every other styles. However, the several alternatives, not a practical fashion occasions. For those who have enable you to go to the beach during the summer time carnival, marketing and advertising to consider startingsuch a sunglasses, obviously, merely a exclusive edition, isn't a small obstacle. In recent times, oversized sunglasses became popular, many men and women inside choice of sunglasses, will focus on the big sunglasses, have confidence in love, cool to learn the brand Oakley. Oakley sunglasses additional protection vision, as the lens draped over your WATS remain more moderate versus the standard lens and UV may cause further reluctant to implement a simple wide-brimmed sun defense. Replica Oakley Sunglasses ,You can pick a black frame, gold, guns, brown or ivory. Flexible flexible frame to what you can keep your ears behind the lens and from the framework resized. Oakley sunglasses sunglasses is quite good burden. In particular, the actual use, with the visual appearance, but in addition in good agreement using the successful. Fake ray bans ,Product design or number of materials, has become a group of advanced scientific experiments and testing to be sure the comfort and high-quality, high level of integration and functionality and fashion. A scale of Oakley sunglasses has established numerous and also have to pay to relieve significantly the U.S. dollar together with time, chance to lure and well-being to allow them to follow. Sac à épaule Longchamp ,A perpetual lens coating to counteract rain and sweat building around the lens, the exclusion of skin oils and other contaminants, and so the lens is smudge as well as simple to help keep clean. Oakley sunglasses they HDO (high-definition optical) is known, and so they continue to use this breakthrough technology into their design. If you want wholesale sunglasses online purchase is a good choice. This is a good way to compare different sunglasses provide them with the expense of their articles, their brand of wholesalers and retailers.

    Reply
  • Clicking on inner view in release mode causes the program to crash

    Posted by rsnprabha on 07/20/2005 12:45am

    Clicking on view in release mode causes the program to crash. Looks like the program crahses in OnMouseActivate. any solutions?

    Reply
  • Easy way.. and works.

    Posted by Legacy on 01/20/2004 12:00am

    Originally posted by: Rajesh

    CRect rect;
    
    m_view->GetWindowRect(&rect);
    //m_view is static control on dialog.

    ScreenToClient(&rect);

    CString strMyClass = AfxRegisterWndClass( CS_VREDRAW | CS_HREDRAW, ::LoadCursor(NULL, IDC_ARROW), (HBRUSH) ::GetStockObject(BLACK_BRUSH), ::LoadIcon(NULL, IDI_APPLICATION));

    CWnd* pWnd = new CWnd;
    pWnd->Create( strMyClass, "", WS_CHILD | WS_VISIBLE, rect, this, 1234);

    Reply
  • Dialog

    Posted by Legacy on 09/26/2003 12:00am

    Originally posted by: Saleem Anwar

    i have controls on the dailog based application and i want to print the dialog as a whole. plz someone help me.
    

    Reply
  • help me...

    Posted by Legacy on 10/24/2002 12:00am

    Originally posted by: mihee

    From Dialog , I made Split Window and composed of view separately.

    I have a trouble when i tried to call the above dialog from mainframe..

    In the debug mode, i solved it by overloading the OnMouseActivate event.

    But it was crashed in the Release mode.

    So, If you have a solution about what I said, please send me your answer.

    Thank your for your consideration.

    Reply
  • An easier way to create a view in Dialog(just 11 lines)

    Posted by Legacy on 08/08/2002 12:00am

    Originally posted by: Z Mohamed Mustafa

           CCreateContext pContext;
    
    CWnd* pFrameWnd = this;
    pContext.m_pCurrentDoc = new CMyDocument;
    pContext.m_pNewViewClass = RUNTIME_CLASS(CMyVw);
    CMyVw *pView =
    (CMyVw *)((CFrameWnd*)pFrameWnd)->CreateView(&pContext);
    pView->ShowWindow(SW_NORMAL);
    CRect rectWindow;
    GetWindowRect(rectWindow);
    rectWindow.right += 15;
    rectWindow.top -= 10;
    pView->MoveWindow(rectWindow);

    /**
    * Steps:
    * 1. Create a view class (better to use class wizard)
    * 2. Create a document class (better to use class wizard)
    * 3. Add the above code snippet to your InitDialog
    *
    * CMyVw - any CView derived class
    * CMyDocument - any CDocument derived class
    *
    */

    Note: there is a sample available in the following url:

    http://www.codeguru.com/dialog/vwindlg.html

    Reply
  • a similar idea

    Posted by Legacy on 06/17/2002 12:00am

    Originally posted by: Thomas Schuster

    Just look up this ...
    http://www.codeproject.com/useritems/View_in_Dialog.asp

    Reply
  • CView in a Dialog-Based works fine. How do I print it now?

    Posted by Legacy on 04/03/2002 12:00am

    Originally posted by: Hugo

    I've followed Jean-Claude`s example using a CHtmlView and it works fine, but I need to print the view now. How do I print the web pages displayed in my view?
    Thanks in advance
    Hugo

    Reply
  • CRichEditCtrl in a Dialog based app

    Posted by Legacy on 03/13/2002 12:00am

    Originally posted by: John

    Has any had tried inserting RichEditCtrl in Dialog based
    app? I would like to display .rtf content in a small
    RichEditCtrl window in the app dialog.

    Reply
  • ADDING CONTROLS OF PARENT DIALOG TO A ANOTHER DIALOG AT RUN TIME ON SWITCHING

    Posted by Legacy on 01/04/2002 12:00am

    Originally posted by: sameer

    is it possible to add the controls of a parent dialog to another dialog on switching at run time so that the controls behave as part of both the dialogs.
    pls help

    sameer

    Reply
  • Loading, Please Wait ...

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

Top White Papers and Webcasts

  • Live Event Date: November 20, 2014 @ 2:00 p.m. ET / 11:00 a.m. PT Are you wanting to target two or more platforms such as iOS, Android, and/or Windows? You are not alone. 90% of enterprises today are targeting two or more platforms. Attend this eSeminar to discover how mobile app developers can rely on one IDE to create applications across platforms and approaches (web, native, and/or hybrid), saving time, money, and effort and introducing apps to market faster. You'll learn the trade-offs for gaining long …

  • IBM Worklight is a mobile application development platform that lets you extend your business to mobile devices. It is designed to provide an open, comprehensive platform to build, run and manage HTML5, hybrid and native mobile apps.

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds