0

編集:

これまでのところ、すべての回答は、最初に書かれたコードがハッキーであると指摘しています。私はそれを書いていませんし、それがどのように機能したかを完全には理解していません。 ただし、一般的なケースでは、うまくいきました。さまざまな片付けを試みましたが、基本的な問題は解決しません。 の奇妙な動作のためですPointToScreen

その動作を説明する代わりに、フォームの残りの部分の内部動作を理解せずに説明するのは難しいことがわかります (現時点では理解していません)。目的の機能を実装する別の方法を考え出すことです。ボタンが押されたときにボタンの上に表示される小さなダイアログです。現在の実装は、一番上に表示され、元のフォームを追跡してその位置を維持するフォームです。よりクリーンなオプションはありますか?

元の質問:

次を使用して、フォーム(フォームC)のコントロール(ボタンB)の上にフォーム(フォームA)を配置しようとしていますPointToScreen

Point buttonCorner = buttonB.Parent.PointToScreen(buttonB.Location);

フォーム上buttonBのボタンはどこにありますか。FlowLayoutPanel

ほとんどの場合、それは機能し、期待どおりのポジションを得ることができます。LocationChangedフォーム A がボタン B を追跡するように、フォームのイベントでこのコードを使用します。これは正常に機能しています。

buttonCornerただし、別のアクションで親フォームのサイズが変更されると、フォーム A が画面から (右側に) はみ出すように、の位置がずれていることがわかります。このイベントの前に、フォームのどの部分も画面から外れていません。

私が思いつくことができる唯一の理論は、イベントが再配置LocationChanged中に発火し、 その間に悪い位置を返すということです。FlowLayoutPanel少し大げさなようですが、これ以上の理論はありません。

4

2 に答える 2

1
 Point buttonCorner = PanelControlFlow.PointToScreen(PanelControlFlow.Location);

そのコードは間違いなく間違っています。場所の値はコントロールの親に相対的です。パネルの左上隅がどこにあるかを知りたい場合は、次を使用する必要があります。

 Point panelCorner = PanelControlFlow.PointToScreen(Point.Empty);

またはパネルのボタンの場合:

 Point buttonCorner = someButtonInPanel.Parent.PointToScreen(someButtonInPanel.Location);

次に、別のボタンを上に表示するには:

 anotherButton.Location = anotherButton.Parent.PointToClient(buttonCorner);
于 2013-11-13T23:05:00.200 に答える