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. Hart researched the structure and evolution of the universe. Dr. Hart is an 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 for 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, 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 U.S. Air Force Academy ("USAFA" for short) Planetarium and will highlight how scientists use clusters of galaxies, the largest bound objects in the Universe, to learn more about the formation and evolution of the cosmos --- as well as the space telescopes used for this purpose, and the stories of the astronauts who launched them and the scientists who went before Dr. Hart in learning more about the nature of the Universe.