2013年4月20日 星期六

原來對話框置中不用自己寫

之前如果有需要開啟自己另外製作的對話框,我常常都會加上一個 Function 讓這個對話框被 DoModal 後可以自行將位置調整到開啟它的母視窗的中間位置,會這麼做是因為在視窗屬性中設定 Center 為 True 是讓對話框出現在螢幕的正中間,而不是母視窗的正中間…

而我撰寫的 Function 內容大概就是依自己 Parent 的 hwnd 加上 Windows API 取到位置及尺寸,再與自己的尺寸相減除上 2 來算出自己的 X、Y 該在哪裡,然後在 OnInitDialog 最後面去 Call 一下該 Function,不算麻煩,但就是要多做一件事,一直到前幾天我才知道這事根本不用自己做,在 afxwin.h 裡面的 CWnd 類別中有一個 Function 的定義為

void CenterWindow(CWnd* pAlternateOwner = NULL);

只要是繼承自 CWnd 的類別,都可以使用這個 Function 來讓對話框置中於母視窗,且還可以利用參數來指定對話框置中於某一個視窗,再加上要找到不是繼承至 CWnd 的 UI 類別大概很難,所以實在是相當的方便,使用範例如下

BOOL CDlgWebLogin::OnInitDialog()
{
CDialog::OnInitDialog();

SetWindowPos(NULL, 0, 0, CLIENT_WIDTH, CLIENT_HEIGHT, SWP_SHOWWINDOW|SWP_NOMOVE);
CenterWindow();

return TRUE;
}

沒有留言:

張貼留言