9

Visual Studio 2005を使用してフォーム(FormBorderStyle = none)にカスタムボタンを作成しようとしています。ボタンにリンクされたImageListに3つの状態のボタン画像があります。

this.btnClose.AutoSize = false;
this.btnClose.BackColor = System.Drawing.Color.Transparent;
this.btnClose.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
this.btnClose.FlatAppearance.BorderSize = 0;
this.btnClose.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnClose.ForeColor = System.Drawing.Color.Transparent;
this.btnClose.ImageKey = "Disabled";
this.btnClose.ImageList = this.imageList1;
this.btnClose.Location = new System.Drawing.Point(368, -5);
this.btnClose.Margin = new System.Windows.Forms.Padding(0);
this.btnClose.Name = "btnClose";
this.btnClose.Size = new System.Drawing.Size(31, 31);
this.btnClose.TabIndex = 0;
this.btnClose.UseVisualStyleBackColor = false;
this.btnClose.MouseLeave += new System.EventHandler(this.btnClose_MouseLeave);
this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
this.btnClose.MouseDown += new System.Windows.Forms.MouseEventHandler(this.btnClose_MouseDown);
this.btnClose.MouseHover += new System.EventHandler(this.btnClose_MouseHover);

private void btnClose_MouseHover(object sender, EventArgs e)
{
    btnClose.ImageKey = "enabled";
}

private void btnClose_MouseDown(object sender, MouseEventArgs e)
{
    btnClose.ImageKey = "down";
}

private void btnClose_MouseLeave(object sender, EventArgs e)
{
    btnClose.ImageKey = "disabled";
}

すべてが機能していますが、1つの問題があります。マウスをボタンに合わせるたびに、非常に迷惑な灰色の背景が表示されます。

どうすればそれを削除できますか?

4

8 に答える 8

44
btnClose.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent;
于 2010-06-01T15:27:54.133 に答える
11

灰色の背景は、「System.Windows.Forms.FlatStyle.Flat」の設定によるものです。これは、ホバーしたときにボタンを強調表示する必要があるため、デフォルトの動作です。これを排除するには、カスタムボタンクラスを作成し、元のボタンから継承し、カスタムペイントを実行してそれを実現する必要がある場合があります。

ところで、MouseHoverで「有効」に設定する代わりに、MouseEnterで設定する必要があります。MouseEnterとMouseLeaveは、マウスがボタン内にあるかどうかを示すペアであり、入口/出口ごとに1回起動されます。一方、マウスがボタン内を移動するたびにMouseHoverが起動するため、「有効」の設定が不必要に繰り返されます。

于 2008-10-12T05:17:01.557 に答える
2

ボタンの代わりにラベルを使用してこれを解決しました。

// 
// imageListButtons
// 
this.imageListButtons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageListButtons.ImageStream")));
this.imageListButtons.TransparentColor = System.Drawing.Color.Transparent;
this.imageListButtons.Images.SetKeyName(0, "close_normal");
this.imageListButtons.Images.SetKeyName(1, "close_hover");
// 
// lblClose
// 
this.lblClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.lblClose.BackColor = System.Drawing.Color.Transparent;
this.lblClose.ImageKey = "close_normal";
this.lblClose.ImageList = this.imageListButtons;
this.lblClose.Location = new System.Drawing.Point(381, 7);
this.lblClose.Margin = new System.Windows.Forms.Padding(0);
this.lblClose.Name = "lblClose";
this.lblClose.Size = new System.Drawing.Size(12, 12);
this.lblClose.TabIndex = 0;
this.lblClose.MouseLeave += new System.EventHandler(this.lblClose_MouseLeave);
this.lblClose.MouseClick += new System.Windows.Forms.MouseEventHandler(this.lblClose_MouseClick);
this.lblClose.MouseEnter += new System.EventHandler(this.lblClose_MouseEnter);


private void lblClose_MouseEnter(object sender, EventArgs e)
{
    lblClose.ImageKey = "close_hover";
}

private void lblClose_MouseLeave(object sender, EventArgs e)
{
    lblClose.ImageKey = "close_normal";
}

private void lblClose_MouseClick(object sender, MouseEventArgs e)
{
    this.Close();
}

PS: 3 つではなく 2 つの状態のボタンを使用していることに注意してください。それは意図されています (私はまだ 3 つを使用できることを知っています)。

于 2008-10-12T22:10:48.983 に答える
2

1 つの提案があります。Button から派生する独自のボタン クラスを作成します。次に、MouseEnter イベントをオーバーライドします。基本実装を呼び出すためのコードを削除するだけです。

base.OnMouseEnter(e)

PS: 派生クラスの外部で MouseEnter イベントを使用することはできません (たとえば、このコントロールを使用するプロジェクト)。

于 2015-09-23T01:34:57.870 に答える
1

こんにちは、これらの 2 行のコードを使用して、これらの変更をボタンに簡単に適用できます。

  1. ボタンの FlatStyle を Flat に設定します

    this.btnClose.FlatStyle = FlatStyle.Flat;
    
  2. ボタンの MouseOverBackColor を透明に設定します

    this.btnClose.FlatAppearance.MouseOverBackColor = Color.Transparent;
    

これが役立つことを願っています。ありがとう

于 2016-03-12T12:58:28.390 に答える
0

ボタンのプロパティ>共通> IsHitTestVisibleでIsHitTestVisibleオプションの選択を解除することで、ボタンの色の変更を停止することもできます。これも役立つかもしれません...

于 2014-05-08T16:36:26.840 に答える