2010-12-16 20 views
3

目前我正在重新定位對話框控件當對話框大小類似這樣的操作系統之間是一致的時:重新定位對話框控件調整一個對話框,讓他們使用MFC C++

// Get the list control rect. 
CRect listRect; 
list->GetWindowRect(&listRect); 
ScreenToClient(listRect); 

// Get the dialog Rect. 
CRect dialogRect; 
GetWindowRect(&dialogRect); 
ScreenToClient(dialogRect); 

list->MoveWindow(listRect.left, listRect.top, 
       dialogRect.right - (2 * listRect.left), dialogRect.bottom - 100); 

這在Windows XP中的偉大工程,但是當我在Windows Vista中嘗試時,定位已關閉。我想這一定是下降到Windows Vista中的對話框較大的對話框邊框和說明,並GetWindowRect具有文檔中的以下條目的事實:

的尺寸在屏幕上給出的座標相對於左上角的顯示屏幕。包括標題,邊框和滾動條的尺寸(如果存在)。

所以我的問題是,如何調整對話框大小時重新定位對話框控件,以便它們在操作系統之間保持一致?謝謝

回答

2

您應該使用GetClientRect而不是GetWindowRect,然後是ScreenToClient - 前者返回窗口客戶端部分的範圍(即無邊框),而後者則檢索整個窗口的範圍,包括非客戶端部分(儘管在客戶端座標中)。

// Get the list control rect. 
CRect listRect; 
list->GetWindowRect(&listRect); 
dlg->ScreenToClient(&listRect); 

// Get the dialog Rect. 
CRect dialogRect; 
dlg->GetClientRect(&dialogRect); 

list->MoveWindow(listRect.left, listRect.top, dialogRect.right - (2 * listRect.left), dialogRect.bottom - 100); 
+0

感謝您的回覆avakar,但由於GetClientRect返回客戶端座標中的位置,因此無法考慮資源文件中所述的控件的原始位置。上面的代碼定位控件,以便填充其父對話框的整個上半部分。 – dangerousdave 2010-12-16 12:00:38

+0

@Jon,你說得對,你需要在對話框的座標中獲得控制矩形。您確實需要使用GetClientRect來獲取對話框的大小。請參閱編輯的代碼。 – avakar 2010-12-16 12:04:16