編集:
これまでのところ、すべての回答は、最初に書かれたコードがハッキーであると指摘しています。私はそれを書いていませんし、それがどのように機能したかを完全には理解していません。 ただし、一般的なケースでは、うまくいきました。さまざまな片付けを試みましたが、基本的な問題は解決しません。 の奇妙な動作のためですPointToScreen
。
その動作を説明する代わりに、フォームの残りの部分の内部動作を理解せずに説明するのは難しいことがわかります (現時点では理解していません)。目的の機能を実装する別の方法を考え出すことです。ボタンが押されたときにボタンの上に表示される小さなダイアログです。現在の実装は、一番上に表示され、元のフォームを追跡してその位置を維持するフォームです。よりクリーンなオプションはありますか?
元の質問:
次を使用して、フォーム(フォームC)のコントロール(ボタンB)の上にフォーム(フォームA)を配置しようとしていますPointToScreen
:
Point buttonCorner = buttonB.Parent.PointToScreen(buttonB.Location);
フォーム上buttonB
のボタンはどこにありますか。FlowLayoutPanel
ほとんどの場合、それは機能し、期待どおりのポジションを得ることができます。LocationChanged
フォーム A がボタン B を追跡するように、フォームのイベントでこのコードを使用します。これは正常に機能しています。
buttonCorner
ただし、別のアクションで親フォームのサイズが変更されると、フォーム A が画面から (右側に) はみ出すように、の位置がずれていることがわかります。このイベントの前に、フォームのどの部分も画面から外れていません。
私が思いつくことができる唯一の理論は、イベントが再配置LocationChanged
中に発火し、 その間に悪い位置を返すということです。FlowLayoutPanel
少し大げさなようですが、これ以上の理論はありません。