ボタンと同じ位置にフォームを表示したいのに

クリックしたボタンの位置にフォームを表示したいとする。


ボタンのLocationはクライアント座標なので、スクリーン座標に計算して表示すればよい。このとき間違いやすいのが、フォームのPointToScreenメソッドを呼んでしまうこと。ボタンのメソッドを呼ばないといけない。

下記のコードは、ボタンの位置にフォームを表示しようとしているが、フォームのPointToScreenを呼んでいるので、フォームは意図した位置とずれて表示されてしまう。


private void button4_Click(object sender, EventArgs e)
        {
            Button bt = sender as Button;
            
            Form2 fm = new Form2();
            fm.StartPosition = FormStartPosition.Manual;
            fm.Location = PointToScreen(bt.Location);
            fm.Show();
        }

正しくはこちら。ボタンの位置もClientRectangleを使ってボタン内での座標位置(つまりボタンの左上なので0,0)を使う。

private void button5_Click(object sender, EventArgs e)
        {
            Button bt = sender as Button;

            Form2 fm = new Form2();
            fm.StartPosition = FormStartPosition.Manual;
            fm.Location = bt.PointToScreen(bt.ClientRectangle.Location);
            fm.Show();
        }

で、表示してみたのが下記の図だが、なぜか少しずれている(横に5ピクセルほど)。なぜかしら?



コメント

このブログの人気の投稿

varchar をデータ型 numeric に変換中に、算術オーバーフロー エラーが発生しました。