カスタム フォームを作成しました (FormBorderStyle = FormBorderStyle.None)。
独自のカスタム キャプション ボタン (閉じる、最大化...) を使用して、上部に独自のキャプション バーを描画します。
今、私の唯一の問題は、そのフォームに通常のユーザー コントロールを追加することです。これらのコントロールに位置を指定すると、その位置はフォームの上部 (キャプション バーを含む) を基準にします。
「new」キーワードを使用してデフォルトの ClientSize と ClientRectangle をオーバーライドします。これにより、調整できるようになります (したがって、キャプション バーが削除されます)。
これは機能していないようで、ControlAdded イベントを「ハッキング」せずにこれを適切に行う方法を理解できませんでした (これにはまだバグがあります)。
protected override void OnControlAdded(ControlEventArgs e)
{
base.OnControlAdded(e);
if (e.Control.GetType() != typeof(VlufiCaptionButton /* Caption buttons: close, minimize & maximize, should not be included */))
{
e.Control.Location = new Point(e.Control.Location.X + ClientRectangle.X, e.Control.Location.Y + ClientRectangle.Y);
e.Control.LocationChanged += Control_LocationChanged;
}
}
private void Control_LocationChanged(object sender, EventArgs e)
{
if (!childControlLocationChangedHandled)
{
System.Diagnostics.Debug.WriteLine("changing");
Control cControl = (Control)sender;
childControlLocationChangedHandled = true;
cControl.Location = new Point(cControl.Location.X + ClientRectangle.X, cControl.Location.Y + ClientRectangle.Y);
}
else
childControlLocationChangedHandled = false;
}
これは私が現在使用しているコードですが、非常に優れており、カスタムで描画された境界線にはまだ他の問題があります。
これを正しく処理する方法を知っている人はいますか?
私は適切な解決策を見つけました:フォームにContainerControlを追加し、フォームに従ってこれを配置およびサイズ変更し、フォームにコントロールを追加するたびに、ContainerControlに追加する必要があります。まだ適切な解決策ではありませんが、これまでのところ最良の解決策です。
誰かが別の解決策を思いついたら、私はまだ感謝しています。