如何将Interaction.InputBox打开到表单的中心?我知道有一个InputBox位置的代码
Interaction.InputBox("Question?", "Title", "Default Text", x,y);
我将以不同大小的不同形式使用此InputBox。有没有办法在窗体的中心打开InputBox?或者我必须在每张表格上单独定位?
是否也可以重新定位InputBox的OK按钮和取消按钮?
答案 0 :(得分:2)
如果您想要完全自定义,那么创建自己的表单是Fabio评论中指出的最佳方式。
但是,如果您只是想大致将盒子居中,并且您将多次进行此操作,那么您可以编写自己的扩展方法来为您显示和定位输入框:
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");
这并不完美,因为如果盒子由于某种原因比正常大,那么它就不会在中心,我认为它的大小可以根据文本的大小而变化。但是,它在正常使用中应该不会太远。
答案 1 :(得分: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);
}
当然你也可以改变InputBox
上的按钮,标签和TextBox的位置,但它非常讨厌和棘手,我们可以说这不简单。推荐的解决方案是在System.Windows.Forms.Form
中创建新的标准表单,向其添加控件并使用方法ShowDialog()
来显示表单。。当然,它需要更多代码,但它允许您完全自定义外观和行为。
答案 2 :(得分:2)
这是计算表单中心的简单方法,额外的偏移量用于输入框的大小。
{
int x = this.Left + (this.Width / 2) - 200;
int y = this.Top + (this.Height / 2) - 100;
}
将它们传递到x和y的输入框中
答案 3 :(得分:0)
您可以设置InputBox的起始位置。那是
的属性InputBox ib = new InputBox();
ib.StartPosition = FormStartPosition.CenterParent;
FormStartPosition是一个枚举,您可以从中选择所需的位置!
答案 4 :(得分:0)
你可以使用-1代表x和y: Interaction.InputBox(&#34;问题?&#34;,&#34;标题&#34;,&#34;默认文字&#34;,-1,-1);