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.
Dr. Brian Hart obtained his Ph.D. in Astrophysics from the University of California, Irvine in 2008. Under Professor David Buote, Dr. Heart researched the structure and evolution of the universe. Dr. Hart is currently employed as a Astrodynamicist / Space Data Scientist with Point Solutions Group in Colorado Springs, CO supporting Space Operations Command, United States Space Force. Dr. Hart is a Veteran of the U.S. Army and the U.S. Navy, having most recently served at Fort George G. Meade, MD as a Naval Officer with a Cyber Warfare Engineer designator. Dr. Hart has previously held positions at Jacobs Engineering supporting Cheyenne Mountain/Space Force supporting tests, with USSPACECOM/J58 supporting operators using predictive AI/ML with Rhombus Power, and with SAIC supporting the Horizon 2 program at STARCOM. Dr. Hart is well known to the community due to his over 150 technical publications and public speaking events. Originally from Minneapolis/Saint Paul, Minnesota, Dr. Hart lives in Colorado Springs with his Black Lab, Bruce, and likes bowling, winter sports, exploring, and swimming. Dr. Hart has a new movie coming out soon, which is a documentary called "Galaxy Clusters: Giants of the Universe," about his outer space research. The movie showcases the Chandra X-ray Observatory, one of NASA’s four great observatories and the world’s most powerful telescopes for detecting X-rays. The movie has been accepted for screening at the USAFA Planetarium and will highlight the need of updating and maintaining X-ray telescopes for scientific advancement.