2013-07-12 21 views
1

我有以下情形,在這裏我想定位Button1右下方和水平對齊Button 2,但仍保持在Button1groupBox1,而Button 2groupBox2定位控制對方

enter image description here

我見過約PointToClient()PointToScreen()幾個職位,但仍無法在不同的容器之間的正確轉換 - groupBox1在這種情況下groupBox2

我已經嘗試了下面的代碼的一些變化(例如,當窗體被調整大小時試圖重新定位按鈕),但我仍然對這個工作原理感到困惑。

具體而言,我不清楚哪一個control我應該打電話給PointToScreen(),我應該傳遞給那個方法以實現我上面描述的那些參數。

private void Form1_Paint(object sender, PaintEventArgs e) 
{ 
    var btn2Pos = button2.PointToScreen(button2.Location); 

    button1.Location = button1.PointToClient(btn2Pos); 
} 

解決此問題的最簡單方法是什麼?

旁註,這樣做的目的
我希望能夠禁用groupBox2,而在這一切的控制,但仍保持一定的 控制喜歡啓用button 1,即使它們被定位 相對到button 2

+0

我很困惑'下面和水平對齊'。調整窗口大小後,圖像應該是最終結果,並且兩個按鈕的比例是相同的?或者你正在談論重疊的按鈕? – Sandy

+0

不,圖像是一個開始的例子。重新定位後,button1應該出現在groupBox2中,並且位於按鈕2的下方。代碼並不完整 - 只是我試過的一些東西的一部分,以便按鈕以這樣的方式定位彼此更相關(因爲與他們不同的父容器有關)。 – Kjartan

+0

我仍然不確定你想要的輸出。但我覺得可以通過操縱Anchor屬性本身來實現。我不需要那麼多的代碼。 – Sandy

回答

1

我不認爲你需要使用PointToClientPointToScreen這裏:

//This will place button1 over button2 
button1.Left = groupBox2.Left + button2.Left; 
button1.Top = groupBox2.Top + button2.Top; 

如果你想使用PointToClientPointToScreen,你可以做這樣的事情:

//The code should be placed in Form load, if placing in form Constructor, the result may be not expected. 
private void Form1_Load(object sender, EventArgs e){ 
    //This will place button1 over button2 
    button1.Location = groupBox1.PointToClient(groupBox2.PointToScreen(button2.Location)); 
} 
+0

謝謝,最後的選擇似乎或多或少是我需要的。 – Kjartan

0

通過考慮不同的相對位置,您可以只依賴.Left/.Top屬性。例如:

button1.Location = positining(button1); 

通過這些線路上的調用函數:

private Point positining(Button curButton) 
{ 
    Point outPoint = new Point(); 

    if(curButton == button1) 
    { 
     outPoint.X = groupBox2.Left + button2.Right + 20; 
     outPoint.Y = groupBox2.Top + button2.Bottom - 20; 
    } 
    else if (curButton == button2) 
    { 
     outPoint.X = groupBox2.Left + button1.Left - 20 - button2.Width; 
     outPoint.Y = groupBox2.Top + button1.Top + 20 + button2.Height; 
    } 

    return outPoint; 
} 
+0

謝謝,但那正是我想要避免的,因爲在我的實際應用中,情況稍微複雜一些,並且可能有幾層容器,使得這樣的計算有點雜亂。 – Kjartan

+0

這些實現可能會變得困難(主要是在複雜情況下),但它們無疑提供了最可靠的性能。但是......這取決於你。 – varocarbas

0

我喜歡這裏的答案,但最終使用在末尾以下解決方案,提出了通過collegue:

我創建了另一個第三個容器,但是沒有邊框。該容器恰好與groupBox2重疊,並且button1位於該容器內,因此相對於該容器。

由於新容器的點(0,0)與groupBox2中的等價點重疊,因此任何容器中具有相同座標的控件都將放置在相同的位置,而我所需要做的就是使一定要撥打BringToFront()(和/或SendToBack()如果需要),以確保控制顯示正確。