1

Interaction.InputBox をフォームの中央に開く方法は? InputBox の位置のコードがあることは知っています

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

この InputBox をさまざまなサイズのさまざまな形式で使用します。フォームの中央にある InputBox を開く方法はありますか? または、各フォームに個別に配置する必要がありますか?

ここに画像の説明を入力

また、InputBox の OK ボタンと Cancel ボタンの位置を変更することはできますか?

4

5 に答える 5

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 に答える
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()てフォームを表示することです。. もちろん、より多くのコードを実行する必要がありますが、ルック アンド フィールとその動作を完全にカスタマイズできます。

于 2013-08-24T19:37:51.110 に答える
0

入力ボックスの開始位置を設定できます。そのためのプロパティがあります

InputBox ib = new InputBox();

ib.StartPosition = FormStartPosition.CenterParent;

FormStartPosition は列挙型であり、そこから目的の位置を選択できます!

于 2015-06-11T21:00:52.177 に答える
-1

x と y に -1 を簡単に使用できます: Interaction.InputBox("Question?", "Title", "Default Text", -1,-1);

于 2017-03-22T08:25:30.913 に答える