0

Windowsフォームアプリで作業していて、上部から閉じるボタンを削除したいと思っています。オプションを知っていControlBoxますが、ヘルプボタンを提供したいと思います。ヘルプボタンを維持しながら閉じるボタンを表示しないようにする方法はありますか?

4

4 に答える 4

5

単純にForm.ControlBox = false(またはコメントでかなり否定的に指摘するようにデザイナーを介して)使用してから、フォームにカスタムヘルプボタンを追加できますか?

編集:私の同僚がExcelアドインを作成し、X特定のフォームからを削除する必要がありました(たとえば、閉じてはならないプログレスバー)。彼は、まさにそれを行うStephenBullenによって書かれた関数を見つけました。この関数がVBで使用されているのを見ただけですが、WindowsAPIを使用して問題を解決するという彼のアプローチからいくつかのアイデアや方向性を得ることができるかもしれません。

于 2012-08-23T19:00:34.530 に答える
4

あなたの最善の策は、そのようなフォームのFormClosingイベントにサブスクライブし、クロージングアクションをキャンセルすることです。

// In your code somewhere subscribe to this event
Form1.FormClosing += Form1_FormClosing;

void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    e.Cancel = true;
}

これを行う利点は、ユーザーが閉じるボタンとタスクバーからアプリケーションを閉じることができないことです。

明らかに、フォームの終了を常にキャンセルしたくはありません。したがって、フォームを閉じることを許可するかどうかについて、イベントリスナーでチェックするブールフラグのタイプを設定する必要があります。例:

void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (BlockClosing)
        e.Cancel = true;
}

編集: そのように問題に取り組みたくなく、本当に閉じるボタンを完全に削除するつもりである場合、最善の策は、独自のカスタムタイトルバーを作成することです。その場合、フォームのFormBorderStyleプロパティをNoneに設定します。次に、カスタムタイトルバーをフォームの上部にドッキングします。これは私がしばらく前に作ったものからのいくつかのサンプルコードです:

using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace Spectrum.UI
{
    public partial class TitleBar : UserControl
    {
        public delegate void EventHandler(object sender, EventArgs e);
        public event EventHandler MinButtonClick;
        public event EventHandler MaxButtonClick;
        public event EventHandler CloseButtonClick;

        #region Properties
        [Category("Appearance")]
        public string Title
        {
            get { return TitleLabel.Text; }
            set { TitleLabel.Text = value; }
        }

        [Category("Appearance")]
        public bool MinimizeEnabled
        {
            get
            {
                return minButton.Visible;
            }
            set
            {
                minButton.Visible = value;
            }
        }

        [Category("Appearance")]
        public bool MaximizeEnabled
        {
            get
            {
                return maxButton.Visible;
            }
            set
            {
                maxButton.Visible = value;
            }
        }
        #endregion

        public TitleBar()
        {
            InitializeComponent();
            ShowTitleBarImage = false;
        }

        #region Mouse Events
        private void TitleBar_MouseDown(object sender, MouseEventArgs e)
        {
            this.OnMouseDown(e);
        }

        private void TitleBar_MouseUp(object sender, MouseEventArgs e)
        {
            this.OnMouseUp(e);
        }

        private void TitleBar_MouseMove(object sender, MouseEventArgs e)
        {
            this.OnMouseMove(e);
        }
        #endregion

        #region Button Click Events
        private void minButton_Click(object sender, EventArgs e)
        {
            if (MinButtonClick != null)
                this.MinButtonClick.Invoke(this, e);
        }

        private void maxButton_Click(object sender, EventArgs e)
        {
            if (MaxButtonClick != null) 
                this.MaxButtonClick.Invoke(this, e);
        }

        private void closeButton_Click(object sender, EventArgs e)
        {
            if (CloseButtonClick != null) 
                this.CloseButtonClick.Invoke(this, e);
        }
        #endregion
    }
}

これが私のカスタムタイトルバーが終わったときの様子です

画像からわかるように、コントロールに背景画像も追加しました。忍耐力と要件に応じて、画像とPictureBoxコントロールを使用して、これを必要なだけ標準のタイトルバーのように見せることができます。

上記の例では、最小化、最大化、および閉じるを表すために、オンラインで見つけた画像を使用してコントロールに3つのボタンを配置しました。あなたの場合、あなたは単に閉じるボタンを除外するでしょう。また、ウィンドウのタイトルとして機能する適切なフォントを使用して、コントロールに文字列を配置しました。

フォームにカスタムタイトルバーを追加するのは簡単です。

public TitleBar titleBar = new TitleBar();
titleBar.Dock = DockStyle.Top;
titleBar.MaximizeEnabled = true;
titleBar.MinimizeEnabled = true;
titleBar.Size = new System.Drawing.Size(10, 40); // Width doesn't matter - I wanted it 40 pixels tall
titleBar.Title = "Title Example";
titleBar.MinButtonClick += titleBar_MinButtonClick;
titleBar.Max ButtonClick += titleBar_MaxButtonClick;
this.Controls.Add(this.TitleBar);

そして最後のステップは、最小および最大ボタンクリックのイベントリスナーを設定することです。

private void titleBar_MinButtonClick(object sender, EventArgs e)
{
    WindowState = FormWindowState.Minimized;
}

private void titleBar_MaxButtonClick(object sender, EventArgs e)
{
    WindowState = FormWindowState.Maximized;
}

また、タイトルバーにマウスの上下移動のイベントを含めたことにも気付くかもしれません。これは、ユーザーがタイトルバーをクリックしてドラッグしたときにフォームを移動するために、フォームにリスナーを作成できるようにするためでした。これはオプションであり、ユーザーがアプリケーションウィンドウを移動できるようにする必要があるかどうかによって異なります。

これを行うことの追加の利点は、追加のコントロールにタイトルバーを使用できることです。たとえば、私のアプリケーションは、小さなタッチスクリーンディスプレイを備えたタフブックスタイルのタブレットコンピューターで使用するためにカスタム作成されました。私のアプリケーションでは、限られたスペースの利用が非常に重要でした。ここで説明した内容をさらに変更して、タイトルバーに直接メニューバースタイルコントロールを含めることができました。さらに、スタンドの左側に、最小化、最大化、および閉じるボタンを追加しました。私のアプリケーションで画面のすべての平方インチを利用するのに本当に役立ちました。標準のタイトルバーではできなかったでしょう。

于 2012-08-23T20:01:58.460 に答える
2

このコードは、閉じるボタンを無効にします。実際に見えなくすることができるかどうかはわかりません。http://www.codeproject.com/Articles/20379/Disabling-Close-Button-on-Forms

幸運を!

于 2012-08-23T18:59:07.363 に答える
0

試してみてくださいthis.ControlBox = false

于 2020-12-11T06:06:19.383 に答える