0

カスタム フォームを作成しました (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に追加する必要があります。まだ適切な解決策ではありませんが、これまでのところ最良の解決策です。

誰かが別の解決策を思いついたら、私はまだ感謝しています。

4

2 に答える 2

0

詳細についてはコメントをお読みください:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        int dy = 0;
        public Form1()
        {
            InitializeComponent();
            //i add a panel to top form
            //( for simulating your caption bar) and get its height
            dy = panel1.Height; //for yours its your caption bar height
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //adding button control between form top and panel end area
            //( simulate in your caption bar )
            Button btn = new Button();
            btn.Location = new Point(panel1.Location.X+40,panel1.Location.Y+10);
            btn.Text = "Salam";
            this.Controls.Add(btn);
        }
        //in control added event i add dy ( height of ignored area) to control Location
        private void Form1_ControlAdded(object sender, ControlEventArgs e)
        {
            e.Control.Location = new Point(e.Control.Location.X, e.Control.Location.Y + dy);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}
于 2013-04-20T19:56:53.840 に答える