0

メイン フォームが最大化されているか、通常のサイズであるかに関係なく、メイン フォームの右上隅に (装飾されていない) 子フォームを開こうとしています。しかし、どうやっても思い通りに開けられない。

フォーム内の別のコントロールに関連してフォームを開く方法を説明した投稿を見つけましたが、それも機能しませんでした:

親ウィンドウのコントロールに対して相対的な位置にモーダル フォームを表示する方法 (オープナー)

Google で解決策を数時間検索しようとしましたが、答えがない (疑わしい) か、厳密な単語の組み合わせを検索していません (可能性が高い)。

誰かが私に同様の質問を指摘してくれるか、私が望んでいることを達成する方法を教えてもらえますか?

4

3 に答える 3

2

上下に固定する UserControl を使用する必要があるように思えます。しかし、フォームを機能させましょう。Load イベントをワイヤリングして、再スケーリング後に適切な場所に移動できるようにする必要があります。次に、メイン フォームの LocationChanged イベントと Resize イベントが必要です。これにより、子フォームを適切な場所に保持できます。

したがって、定型的な Form1 と Form2 の名前と、子を表示する Form1 のボタンを含むサンプル プログラムは、次のようになります。

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        this.button1.Click += button1_Click;
        this.Resize += this.Form1_Resize;
        this.LocationChanged += this.Form1_LocationChanged;

    }

    Form child;

    private void button1_Click(object sender, EventArgs e) {
        if (child != null) return;
        child = new Form2();
        child.FormClosed += child_FormClosed;
        child.Load += child_Load;
        child.Show(this);
    }

    void child_FormClosed(object sender, FormClosedEventArgs e) {
        child.FormClosed -= child_FormClosed;
        child.Load -= child_Load;
        child = null;
    }

    void child_Load(object sender, EventArgs e) {
        moveChild();
    }

    void moveChild() {
        child.Location = this.PointToScreen(new Point(this.ClientSize.Width - child.Width, 0));
    }

    private void Form1_Resize(object sender, EventArgs e) {
        if (child != null) moveChild();
    }

    private void Form1_LocationChanged(object sender, EventArgs e) {
        if (child != null) moveChild();
    }

}
于 2012-07-21T19:00:21.050 に答える
0

そのようなことを試してください:

 private void button1_Click(object sender, EventArgs e)
        {
            ChildForm win = new ChildForm();
            int screenHeight = Screen.PrimaryScreen.WorkingArea.Height;
            int screenWidth = Screen.PrimaryScreen.WorkingArea.Width;

            Point parentPoint = this.Location;

            int parentHeight = this.Height;
            int parentWidth = this.Width;

            int childHeight = win.Height;
            int childWidth = win.Width;

            int resultX = 0;
            int resultY = 0;

            if ((parentPoint.X + parentWidth + childWidth) > screenWidth)
            {
                resultY = parentPoint.Y;
                resultX = parentPoint.X - childWidth;
            }
            else
            {
                resultY = parentPoint.Y;
                resultX = parentPoint.X + parentWidth;
            }

            win.StartPosition = FormStartPosition.Manual;                   
            win.Location = new Point(resultX, resultY);  
            win.Show();
        }
于 2012-07-21T18:49:02.150 に答える
0

次のようなことを試してみるべきだと思います:

private void buttonOpen_Click(object sender, EventArgs e)
{
    Form2 frm2 = new Form2();
    frm2.Show();
    //"this" is the parent form
    frm2.DesktopLocation = new Point(this.DesktopLocation.X + this.Width - frm2.Width, this.DesktopLocation.Y);
}

シンプルで簡単、そしてうまくいきます(私にとって)。

于 2012-07-21T19:04:59.643 に答える