對於MFC對話框應用程序,如果要在窗口顯示之前對窗口控件賦值,一般都是在OnInitDialog()函數中編寫相關代碼。這是正確的,因為在調用OnInitDialog()函數的時候,對話框應用程序已經建立好了窗口及其子控件,只是還沒有顯示出來,窗口控件的句柄值是有效的。如果你需要獲取窗口控件相對於屏幕的坐標位置呢?通過實驗可以得知,在主對話框的OnInitDialog()中調用GetWindowRect()函數,得到窗口大小值(寬高)是正確的,但是左上角的坐標點是(0,0)值,而我們的對話框窗口不是在(0,0)點。同樣,在主對話框的OnInitDialog()函數中獲取其他控件的屏幕坐標也是與顯示之后的坐標有一定差異。
在調用主對話框的OnInitDialog()函數時,對話框窗口已經創建好了,我們獲取的左上點的坐標值為(0,0),說明MFC對話框在創建對話框窗口的時候指定的左上角坐標就是(0,0)點,那為什么最終顯示的對話框窗口不在(0,0)點了呢?因為MFC在顯示我們的窗口之前將其移動到了屏幕的中間。這樣為了獲取最終顯示時的屏幕坐標,我們應該處理WM_SHOWWINDOW消息,這樣獲取的坐標值就是對話框最終顯示的屏幕坐標位置。對於對話框中的控件,也可以在這個消息處理函數中獲取其最終顯示位置。
如果你是使用Win32 SDK程序編寫對話框程序,在WM_INITDIALOG消息處理函數中獲取的對話框的位置就是最終顯示的位置。因為MFC對話框程序被移動到了屏幕中間,那是MFC框架中的代碼,Afx小組寫的。對於純的Win32 SDK程序,我們沒有額外地添加窗口移動代碼,對話框窗口當然不會在創建后被移動到屏幕中間去了。