一個更好的CenterWindow()函數

2020-08-10 02:01:15

下載演示專案- 42.2 kb圖1。主CenterSample程式範例螢幕。

介紹

定心視窗在螢幕上是你通常可以做的
CWnd::CenterWindow()函數在MFC。CenterWindow ()
獲取一個指向CWnd的指針作爲參數,並且假定是函數
是否會將呼叫它的視窗的中心與傳遞它的視窗相對
一個指針:

隱藏,複製CodepDlg->CenterWindow(AfxGetMainWnd()); // Centers pDlg against the main window?
清單1。演示使用CWnd::CenterWindow()將對話方塊居中。

然而,一個問題向MFC郵寄清單提出
最近被問到,「我有一個基於對話方塊的程式,使用者可以點選一個按鈕和
彈出子對話方塊。如果我呼叫CWnd::CenterWindow()在子對話方塊的
OnInitDialog()處理程式,對話方塊將始終居中
螢幕的,不居中於主對話方塊。我該怎麼做呢?」

所以我想出了一個「強力」定心功能,它實際上工作得更好
比CWnd: CenterWindow()。它被稱爲
CenterWindowOnOwner(),我新增到我的範例程式的
CSubDialog sub-dialog的類:

隱藏,收縮,複製Codevoid CSubDialog::CenterWindowOnOwner(CWnd* pWndToCenterOn)
{
// Get the client rectangle of the window on which we want to center
// Make sure the pointer is not NULL first

if (pWndToCenterOn == NULL)
    return;

CRect rectToCenterOn;
pWndToCenterOn->GetWindowRect(&rectToCenterOn);

// Get this window's area
CRect rectSubDialog;
GetWindowRect(&rectSubDialog);

// Now rectWndToCenterOn contains the screen rectangle of the window 
// pointed to by pWndToCenterOn.  Next, we apply the same centering 
// algorithm as does CenterWindow()

// find the upper left of where we should center to

int xLeft = (rectToCenterOn.left + rectToCenterOn.right) / 2 - 
    rectSubDialog.Width() / 2;
int yTop = (rectToCenterOn.top + rectToCenterOn.bottom) / 2 - 
    rectSubDialog.Height() / 2;

// Move the window to the correct coordinates with SetWindowPos()
SetWindowPos(NULL, xLeft, yTop, -1, -1,
    SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);

}Listing 2。我們的brute-force CenterWindowOnOwner()函數。

然後我向CSubDialog::OnInitDialog()新增了程式碼,以使其處於中心位置
到主對話方塊,這是應用程式的主視窗:

隱藏,複製CodeBOOL CSubDialog::OnInitDialog()
{
CDialog::OnInitDialog();

...

CWnd* pMainWnd = AfxGetMainWnd();
CenterWindowOnOwner(pMainWnd);

return TRUE;

}Listing 3。如何呼叫CenterWindowOnOwner()。

瞧!子對話方塊將始終以主對話方塊(或主對話方塊)爲中心
應用程式視窗),無論該視窗位於螢幕的哪個位置。

本文轉載於:http://www.diyabc.com/frontweb/news6786.html