2013-08-24 2 views
0

Как открыть Interaction.InputBox в центр формы? Я знаю, что есть код позиции InputBoxПозиция InputBox

Interaction.InputBox("Question?", "Title", "Default Text", x,y); 

Я буду использовать этот InputBox в различной форме различных размеров. Есть ли способ открыть InputBox в центре формы? Или я должен разместить их по отдельности в каждой форме?

enter image description here

Можно также изменить положение и CancelButton OK для подтверждения из InputBox?

+1

Создайте свою собственную форму и разместите 'TextBox',' Label' и 'Buttons', как хотите. Затем вы всегда можете вызывать его в каждой форме как «inputForm.StartPosition = FormStartPosition.CenterParent;», а затем 'inputForm.ShowDialog (this);' – Fabio

ответ

2

Если вы хотите полностью настроить, то создание вашей собственной формы - лучший способ пойти, как указано в комментарии Фабио.

Однако, если вы просто хотите примерно центрирования коробки, и вы будете делать это много раз, то вы можете написать свой собственный метод расширения, чтобы показать и расположить окно ввода для вас:

public static class FormExtensions 
{ 
    public static string CentredInputBox(this Form form, string prompt, string title = "", string defaultResponse = "") 
    { 
     const int approxInputBoxWidth = 370; 
     const int approxInputBoxHeight = 158; 

     int left = form.Left + (form.Width/2) - (approxInputBoxWidth/2); 
     left = left < 0 ? 0 : left; 
     int top = form.Top + (form.Height/2) - (approxInputBoxHeight/2); 
     top = top < 0 ? 0 : top; 

     return Microsoft.VisualBasic.Interaction.InputBox(prompt, title, defaultResponse, left, top); 
    } 
} 

Использования от в форме:

this.CentredInputBox("MyPrompt", "MyTitle", "MyDefaultResponse"); 

это не идеально, потому что если коробка больше, чем обычно по какой-то причине, то это будет не совсем быть в центре, и я думаю, что его размер варьируется в зависимости от того, насколько текст в Это. Тем не менее, он не должен быть далек при нормальном использовании.

2

Чтобы центрировать ваш InputBox, вы можете попробовать использовать функции Win32, чтобы справиться с этим. Этот код работает для вас:

[DllImport("user32")] 
private static extern int SetWindowPos(IntPtr hwnd, IntPtr afterHwnd, int x, int y, int cx, int cy, int flag); 
[DllImport("user32")] 
private static extern IntPtr FindWindow(string className, string caption);   
[DllImport("user32")] 
private static extern int GetWindowRect(IntPtr hwnd, out RECT rect); 
//RECT structure 
public struct RECT { 
    public int left, top, right, bottom; 
} 
public void ShowCenteredInputBox(string prompt, string title, string defaultReponse){ 
    BeginInvoke((Action)(() => {   
     while (true) {    
      IntPtr hwnd = FindWindow(null, title + "\n\n\n");//this is just a trick to identify your InputBox from other window with the same caption 
      if (hwnd != IntPtr.Zero) { 
       RECT rect; 
       GetWindowRect(hwnd, out rect); 
       int w = rect.right - rect.left; 
       int h = rect.bottom - rect.top; 
       int x = Left + (Width - w)/2; 
       int y = Top + (Height - h)/2; 
       SetWindowPos(hwnd, IntPtr.Zero, x, y, w, h, 0x40);//SWP_SHOWWINDOW = 0x40 
       break; 
      } 
     }; 
    })); 
    Microsoft.VisualBasic.Interaction.InputBox(prompt, title + "\n\n\n", defaultResponse,0,0); 
} 

Конечно, вы можете также изменить положение кнопки, метки и TextBox на вашем InputBox но это очень противно и сложно, можно сказать, что это не просто. Рекомендуемое решение для вас: создать новую стандартную форму в System.Windows.Forms.Form, добавить в нее элементы управления и использовать метод ShowDialog(), чтобы показать вашу форму.. Конечно, для этого требуется больше кода, но он позволяет полностью настроить внешний вид и поведение.

0

Вы можете установить начальную позицию InputBox. Там есть свойство для этого

InputBox ib = new InputBox(); 

ib.StartPosition = FormStartPosition.CenterParent; 

Где, как FormStartPosition является перечисление, из которого вы можете выбрать нужную позицию!

+0

Довольно уверен, что это статический класс ... – Jack

0

Вы можете использовать sipmly -1 для x и y: Interaction.InputBox («Question?», «Title», «Default Text», -1, -1);