Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 2397
  • Last Modified:

How do I reposition and resize a dialog at runtime (programmatically)

In CView::OnInitialUpdate() of my app, I create a modeless dialog box. I want to be able to set the reposition and resize of the dialog at runtime.  I am having problems with the CWnd::MoveWindow().  I cannot seem to get it to work.  The dialog does not end up in what I think is the correct place.  I tried the following method.

(pseudocode)
CFrameWnd->GetWindowRect(fwRect);
dialog->GetWindowRect(dwRect);
modify dwRect based on fwRect
dialog->MoveWindow(dwRect)

I calculate the new dialog position and size based on the CFrameWnd's position and size.  How do I need to do this?
Ed
0
epeddyco
Asked:
epeddyco
  • 2
1 Solution
 
MelangeCommented:
Is your dialog a child of your frame window or a popup window? If it is a pop-up window (even if you specified a parent window), then make sure you use screen coordinates in the call to MoveWindow. If it is truly child window, then the coordinates will be in client coordinates relative to the dialog's parent.

If you're still having a problem, then send me your source code.
0
 
epeddycoAuthor Commented:
I am still having problems with this.  Any more suggestions?

Here is my OnInitialUpdate...
------------------------------------------------------------------
void CBasicTestView::OnInitialUpdate()
{
      CView::OnInitialUpdate();
      
// TODO: Add your specialized code here and/or call the base class

// Goal:
// Create dialog and move it so that the bottom right corner
// of the dialog window rect is aligned with the bottom right
// corner of CBasicTestView Client area

      // Create the dialog
      theBasicDlg = new CBasicDialog;
      theBasicDlg->Create(CBasicDialog::IDD, this);
//      theBasicDlg->ShowWindow(SW_SHOWNORMAL);
//      theBasicDlg->CenterWindow();

      //Get the CView's client area coordinates
      RECT rcViewClientRect;
      GetClientRect(&rcViewClientRect);

      //Get the dialog screen coordinates
      RECT rcDialogWindowRect;
    theBasicDlg->GetWindowRect(&rcDialogWindowRect);

      // Set the Dialogs Bottom right corner to
      // CView client area bottom right
      rcDialogWindowRect.bottom = rcViewClientRect.bottom;
      rcDialogWindowRect.right = rcViewClientRect.right;

      // Calculate ammount to move top,left corner so
      // that size remains the same
      int dv = rcViewClientRect.bottom - rcDialogWindowRect.bottom;
      int dh = rcViewClientRect.right - rcDialogWindowRect.right;
                                                                  
      // Set the Dialogs top left corner so
      // that size remains the same
      rcDialogWindowRect.top  += dv;
      rcDialogWindowRect.left += dh;

    theBasicDlg->MoveWindow(&rcDialogWindowRect);
      theBasicDlg->ShowWindow(SW_SHOWNORMAL);
}

For completeness sake, here is the code for the dialog...
------------------------------------------------------------------
// BasicDialog.h : header file
//

/////////////////////////////////////////////////////////////////////////////
// CBasicDialog dialog

class CBasicDialog : public CDialog
{
// Construction
public:
      CBasicDialog(CWnd* pParent = NULL);   // standard constructor

// Dialog Data
      //{{AFX_DATA(CBasicDialog)
      enum { IDD = IDD_DIALOG1 };
      //}}AFX_DATA


// Overrides
      // ClassWizard generated virtual function overrides
      //{{AFX_VIRTUAL(CBasicDialog)
      protected:
      virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
      virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
      //}}AFX_VIRTUAL

// Implementation
protected:

      // Generated message map functions
      //{{AFX_MSG(CBasicDialog)
      //}}AFX_MSG
      DECLARE_MESSAGE_MAP()
};

------------------------------------------------------------------
// BasicDialog.cpp : implementation file
//

#include "stdafx.h"
#include "BasicTest.h"
#include "BasicDialog.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CBasicDialog dialog


CBasicDialog::CBasicDialog(CWnd* pParent /*=NULL*/)
      : CDialog(CBasicDialog::IDD, pParent)
{
      //{{AFX_DATA_INIT(CBasicDialog)
      //}}AFX_DATA_INIT
}


void CBasicDialog::DoDataExchange(CDataExchange* pDX)
{
      CDialog::DoDataExchange(pDX);
      //{{AFX_DATA_MAP(CBasicDialog)
      //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CBasicDialog, CDialog)
      //{{AFX_MSG_MAP(CBasicDialog)
      //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBasicDialog message handlers


BOOL CBasicDialog::PreCreateWindow(CREATESTRUCT& cs)
{
      // TODO: Add your specialized code here and/or call the base class
      
      return CDialog::PreCreateWindow(cs);
}

0
 
MelangeCommented:
Try changing your OnInitView function to this:

void CBasicTestView::OnInitialUpdate()
{
CView::OnInitialUpdate();

// TODO: Add your specialized code here and/or call the base class

// Goal:
// Create dialog and move it so that the bottom right corner
// of the dialog window rect is aligned with the bottom right
// corner of CBasicTestView Client area

// Create the dialog
theBasicDlg = new CBasicDialog;
theBasicDlg->Create(CBasicDialog::IDD, this);
// theBasicDlg->ShowWindow(SW_SHOWNORMAL);
// theBasicDlg->CenterWindow();

//Get the CView's screen coordinates
CRect rcViewClientRect;
GetWindowRect(rcViewClientRect);

//Get the dialog screen coordinates
CRect rcDialogWindowRect;
theBasicDlg->GetWindowRect(rcDialogWindowRect);

//**NOTE:  If theBasicDlg is not a POPUP window (most dialogs are)
//**       but is a child window, then change the above lines to:
//**
//**       GetClientRect(rcViewClientRect);
//**       GetWindowRect(rcDialogWindowRect);
//**       ScreenToClient(rcDialogWindowRect);
//**

// Calculate the new position for the dialog
CPoint    NewDlgPos;
NewDlgPos.x = rcViewClientRect.right - rcDialogWindowRect.Width();
NewDlgPos.y = rcViewClientRect.bottom - rcDialogWindowRect.Height();

// Move the dialog into its new position
theBasicDlg.SetWindowPos( NULL, NewDlgPos.x, NewDlgPos.y, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE );

theBasicDlg->ShowWindow(SW_SHOWNORMAL);
}

0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now