Download demo project - 42.2 Kb
Figure 1. The main CenterSample
sample program screen.
Introduction
Centering windows on the screen is something which you can normally do with the
CWnd::CenterWindow()
function in MFC. CenterWindow()
takes a pointer to a CWnd
as its argument, and supposedly the function
will center the window on which it's called against the window to which you pass it
a pointer:
pDlg->CenterWindow(AfxGetMainWnd());
Listing 1. Demonstrating a use of
CWnd::CenterWindow()
to center a dialog.
However, a question posed to the MFC Mailing List
recently asked, "I have a dialog-based program, where the user can click a button and
have a sub-dialog pop up. If I call CWnd::CenterWindow()
in the sub-dialog's
OnInitDialog()
handler, the dialog will always be centered in the center
of the screen, not centered with respect to the main dialog. How do I do this?"
So I came up with a "Brute Force" centering function which actually works better
than CWnd::CenterWindow()
. It's called
CSubDialog::CenterWindowOnOwner()
, and I added to my sample program's
sub-dialog's class, CSubDialog
:
void CSubDialog::CenterWindowOnOwner(CWnd* pWndToCenterOn)
{
if (pWndToCenterOn == NULL)
return;
CRect rectToCenterOn;
pWndToCenterOn->GetWindowRect(&rectToCenterOn);
CRect rectSubDialog;
GetWindowRect(&rectSubDialog);
int xLeft = (rectToCenterOn.left + rectToCenterOn.right) / 2 -
rectSubDialog.Width() / 2;
int yTop = (rectToCenterOn.top + rectToCenterOn.bottom) / 2 -
rectSubDialog.Height() / 2;
SetWindowPos(NULL, xLeft, yTop, -1, -1,
SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
}
Listing 2. Our brute-force
CenterWindowOnOwner()
function.
Then I added code to CSubDialog::OnInitDialog()
to center it with respect
to the main dialog, which is the main window of the application:
BOOL CSubDialog::OnInitDialog()
{
CDialog::OnInitDialog();
...
CWnd* pMainWnd = AfxGetMainWnd();
CenterWindowOnOwner(pMainWnd);
return TRUE;
}
Listing 3.How to call
CenterWindowOnOwner()
.
And voila! The sub-dialog will always center itself on the main dialog (or main
application window), no matter where on the screen that window is placed.
Brian C. Hart, Ph.D., is a strategic engagement leader on a mission to leverage space technology to protect U.S. interests and assets against adversaries. Throughout Dr. Hart's career, he has enjoyed: Working closely with business executives to provide strategic direction and leadership, translating customer and competitive intelligence into compelling capture strategies and solutions, and mentoring teams to enhance individual and company capabilities while fostering an engaging and accountable environment, being involved in STEAM initiatives and education to develop greater awareness in the community, and serving the armed forces with the U.S. Navy and U.S. Army National Guard. He is excited to begin developing his career in Jacobs's Critical Mission Systems business unit, supporting NORAD and the U.S. Space Force.