2017-10-17 56 views
1

我有一些獨特的按鈕,我只想一次顯示其中的一個。我希望它們居中,所以我有第一個按鈕居中對話框。如果我想顯示第三個按鈕,我想給它第一個按鈕座標並隱藏第一個按鈕。如何將對話框位置座標複製到另一個對話框中?

如何複製按鈕座標並將其他按鈕座標設置爲複製值?

Ex。可以說我有...

PB_ONE 
PB_TWO 

我怎樣才能抓住PB_ONE的座標,並設定PB_TWO的座標PB_ONE?

RECT rcButton; 

GetWindowRect(GetDlgItem(hDlg, PB_ONE), &rcButton); 

上面的代碼抓取了我想從中複製座標的對話框項目。是否有一個簡單的命令,將另一個對話框按鈕設置爲此對話框的座標?

像SetDlgItem()?

用新的代碼已更新我嘗試基於OFF答案

GetWindowRect(GetDlgItem(hDlg, PB_ONE), &rcButton); 
ClientToScreen(hDlg, &p); 
OffsetRect(&rcButton, -p.x, -p.y); 
SetWindowPos(GetDlgItem(hDlg, PB_TWO), 0, rcButton.left, rcButton.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER); 
ShowWindow(GetDlgItem(hDlg, PB_TWO), SW_SHOW); 

有電流,PX和rcButton.top硬值替換rcButton.left和rcButton.top得到按鈕位置上對話框。

這將在SetWindowPos中返回一個錯誤,其中參數3不能將LONG *轉換爲INT。

+0

確保'p.x = 0; p.y = 0;'在調用'ClientToScreen'之前。同時隱藏'PB_ONE'。你說你已經將'&rcButton.left'改爲'rcButton.left'? –

+0

是的,我改變了他們。但是,這些座標始終不在屏幕上。我必須使用px而不是rcButton.left才能真正獲得正確的按鈕位置 – user3622460

回答

3

GetWindowRect給出了屏幕座標中的矩形。您可以使用ScreenToClient(HWND hWnd, LPPOINT lpPoint)將其轉換爲客戶端座標。


編輯:

RECT rcButton; 
HWND hbutton1 = GetDlgItem(hDlg, PB_ONE); 
HWND hbutton2 = GetDlgItem(hDlg, PB_TWO); 

//if(!hbutton1 || !hbutton2) {error...} 

GetWindowRect(hbutton1, &rcButton); 

//Test 
char buf[50]; 
sprintf(buf, "%d %d", rcButton.left, rcButton.top); 
MessageBoxA(0, buf, "screen coord", 0); 

//Note, this will only convert the top-left corner, not right-bottom corner 
//but that's okay because we only want top-left corner in this case 
ScreenToClient(hDlg, (POINT*)&rcButton); 

//Test 
sprintf(buf, "%d %d", rcButton.left, rcButton.top); 
MessageBoxA(0, buf, "client coord", 0); 

ShowWindow(hbutton1, SW_HIDE); 
SetWindowPos(hbutton2, 0, rcButton.left, rcButton.top, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW); 


一個稍微簡單的方法是使用 ClientToScreen(HWND hWnd, LPPOINT lpPoint)如下:

RECT rcButton; 
GetWindowRect(GetDlgItem(hDlg, PB_ONE), &rcButton); 

POINT p{ 0 }; 
ClientToScreen(hDlg, &p); 
//p is now (0,0) of parent window in screen coordinates 
OffsetRect(&rcButton, -p.x, -p.y); 

rcButton現在相對座標左上角父窗口。你可以在SetWindowPos中使用。

+0

這給我一個SetWindowPos調用的錯誤 - 參數3不能設置LONG *爲INT – user3622460

+0

我的錯 - 我正在使用& - 代碼工程精細。該按鈕不在屏幕上,但我假設它位於0,0? – user3622460

+0

嘗試*編輯*部分。您應該使用調試斷點或'OutputDebugString'來查看您獲得的值。如果可能,將對話框移動到桌面屏幕的左上角,以便屏幕和客戶端座標大致相同(僅用於測試)。 –

相關問題