1

如何将 Interaction.InputBox 打开到窗体的中心?我知道 InputBox 的位置有一个代码

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

我将以不同大小的不同形式使用这个 InputBox。有没有办法在表单的中心打开 InputBox?或者我必须在每个表格上单独放置它们?

在此处输入图像描述

是否也可以重新定位 InputBox 的 OKbutton 和 Cancelbutton?

4

5 回答 5

3

这是计算表单中心的简单方法,额外的偏移量是输入框的大小。

{
    int x = this.Left + (this.Width / 2) - 200;
    int y = this.Top + (this.Height / 2) - 100;
}

将这些传递到 x 和 y 的输入框中

于 2019-10-10T19:28:58.487 回答
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但是很麻烦也很棘手,可以说不简单。为您推荐的解决方案是在 中创建新的标准表单System.Windows.Forms.Form,为其添加控件并使用该方法ShowDialog()显示您的表单。. 当然,它需要更多的代码来完成,但它允许您完全自定义外观和行为。

于 2013-08-24T19:37:51.110 回答
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");

这并不完美,因为如果由于某种原因盒子比正常大,那么它就不会完全位于中心,而且我认为它的大小是可变的,具体取决于其中有多少文本。但是,在正常使用中应该不会太远。

于 2013-08-24T19:34:34.377 回答
0

您可以设置 InputBox 的起始位置。有一个属性

InputBox ib = new InputBox();

ib.StartPosition = FormStartPosition.CenterParent;

FormStartPosition 是一个枚举,您可以从中选择所需的位置!

于 2015-06-11T21:00:52.177 回答
-1

您可以简单地将 -1 用于 x 和 y:Interaction.InputBox("Question?", "Title", "Default Text", -1,-1);

于 2017-03-22T08:25:30.913 回答