2013-09-05 2 views
0

У меня есть форма с кнопкой "btn_email".Расчет новой формы loaction

Нажав на эту кнопку, я хочу, чтобы новая (не модальная) форма была открыта ниже этой кнопки и выровнена вправо.

Dim eform As New frm_iemail 
With eform 
    .Location = ? 
    .Show(Me) 
End With 

Каков наилучший способ рассчитать это (описанное) положение новой формы?
Как должен выглядеть этот расчет?

EDIT после решения Мориса:

Dim eform As New frm_iemail 
With eform 
    .StartPosition = FormStartPosition.Manual 
    .Location = New Point((Me.Left + btn_email.Left + Button1.Width), (Me.Top + btn_email.Top)) 
    .Show(Me) 
End With 

Approach2:

Dim BorderWidth As Integer = (Me.Width - Me.ClientSize.Width)/2 
Dim TitlebarHeight As Integer = Me.Height - Me.ClientSize.Height - 2 * BorderWidth 
.DesktopLocation = New Point((Me.Left + Button1.Left + Button1.Width + BorderWidth), (Me.Top + TitlebarHeight + BorderWidth + Button1.Top)) 

Мое решение:

Dim BorderWidth As Integer = SystemInformation.FrameBorderSize.Width 
Dim TitlebarHeight As Integer = SystemInformation.CaptionHeight + BorderWidth 
Dim distance As Integer = 3 

Dim eform As New frm_iemail 
With eform 
    .StartPosition = FormStartPosition.Manual 
    .FormBorderStyle = Windows.Forms.FormBorderStyle.None 
    .Location = New Point(Me.Location.X + btn_email.Location.X + btn_email.Width + BorderWidth - .Width, TitlebarHeight + Me.Location.Y + btn_email.Location.Y + btn_email.Height + distance) 
    .Show(Me) 
End With 

Окончательное решение:

.Location = New Point(Me.Location.X + btn_email.Right + BorderWidth - .Width, TitlebarHeight + Me.Location.Y + btn_email.Bottom + distance) 
+0

Можете ли вы добавить изображение простой доски, обозначающее кнопку и позицию формы, в которой она должна быть размещена? – Aphelion

+0

Это в основном то, что вам нужно сделать. Единственный бит, который может быть улучшен, заключается в замене btn_email.Location.X + btn_email.Width на btn_email.right (как показано в моем ответе). – varocarbas

+0

@Maurice, извините, я не могу делать изображения сейчас, но ситуация достаточно описана. –

ответ

2

Приведенный ниже код находит форму ниже кнопки и правой выравнивает оба элемента управления. То, что я понимаю, с правыми выравнивая: правая сторона eform с таким же значением Y, чем правая сторона btn_email:

With eform 
    .Show(Me) 
    .Location = New Point(Me.Left + btn_email.Right - .Width, Me.Top + btn_email.Bottom + btn_email.Height) 
    .BringToFront() 
End With 

Примечания: там может быть небольшим зазор в зависимости от типа формы (например, границы); но об этом уже позаботился другой ответ (и последним обновлением в вашем вопросе).

+0

Да, это правильно выровнено. Я просто добавляю границы этого решения, и теперь все в порядке. –

1

Обратите внимание, что это C#, но этого должно быть достаточно для реализации вашего решения vb.net.

private void button1_Click(object sender, EventArgs e) 
    { 
     // Create and show the form 
     Form1 form = new Form1();    
     form.Show(); 

     // Caculate thicknesses of border and titlebar 
     int borderWidth = (this.Width - this.ClientSize.Width)/2; 
     int titlebarHeight = this.Height - this.ClientSize.Height - 2 * borderWidth; 

     // Calculate the form position 
     var x = this.Left + button1.Left + button1.Width + borderWidth - form.Width; 
     var y = this.Top + titlebarHeight + borderWidth + button1.Top + button1.Height; 

     // Position the form 
     form.DesktopLocation = new Point(x, y); 
    } 
+0

Привет, Морис, я добавил ваше решение к вопросу. Это открывает форму справа и что-то вверх от кнопки. Что-то явно отсутствует. –

+0

C# не проблема, но расчет пропущен! –

+0

@ user973238 Я взял границу и заголовок во внимание :) – Aphelion

0

Попробуйте это ..

Dim eform As New frm_iemail 
With eform 
    .Location = new point(Me.Location.X + btn_email.Location.X + btn_email.Width, Me.Location.Y + btn_email.Location.Y + btn_email.Height) 
    .Show(Me) 
End With 
+0

Hi matzone, снова что-то верхнее и очень правое. Могут ли быть использованы границы и надписи? –

Смежные вопросы