スキップしてメイン コンテンツに移動

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

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


ボタンの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ピクセルほど)。なぜかしら?



コメント

このブログの人気の投稿

SQLでは文字列の前に「N」が必要だ

SQLServerのテーブルにテキストを登録したら一部の文字が文字化けした。環境依存文字だと化けるみたい。

コンボボックスのDataSourceプロパティの使い方

コンボボックスに表示するデータを設定するのを簡単にする工夫をまとめます。コンボボックスのDataSourceプロパティを上手に使いましょう。(2017/8/30追記)