web-dev-qa-db-ja.com

ボタンが無効になっているときに色が変化しないようにするにはどうすればよいですか?

かなりの数のFlatStyleボタンを備えたWindowsフォームプロジェクトがあります。

ボタンを無効にすると、ボタンの色が自動的に変更されます。 :(

どういうわけかこれをオーバーライドして、自分で色を制御できるようにすることは可能ですか?

11
user2500179

EnabledChangedイベントを使用して、目的の色を設定する必要があります。これが例です。

private void Button1_EnabledChanged(object sender, System.EventArgs e)
{
Button1.ForeColor = sender.enabled == false ? Color.Blue : Color.Red;
Button1.BackColor = Color.AliceBlue;
}

要件に応じて希望の色を使用してください。

また、Paintイベントを使用する必要があります。

private void Button1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
dynamic btn = (Button)sender;
dynamic drawBrush = new SolidBrush(btn.ForeColor);
dynamic sf = new StringFormat {
    Alignment = StringAlignment.Center,
    LineAlignment = StringAlignment.Center };
Button1.Text = string.Empty;
e.Graphics.DrawString("Button1", btn.Font, drawBrush, e.ClipRectangle, sf);
drawBrush.Dispose();
sf.Dispose();

}
17
Harsh

あいまいさの少ないテキストを取得するには、代わりにTextRendererクラスを使用します。

private void Button1_Paint(object sender, PaintEventArgs e)
        {
            Button btn = (Button)sender;
            // make sure Text is not also written on button
            btn.Text = string.Empty;
            // set flags to center text on button
            TextFormatFlags flags = TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter | TextFormatFlags.WordBreak;   // center the text
            // render the text onto the button
            TextRenderer.DrawText(e.Graphics, "Hello", btn.Font, e.ClipRectangle, btn.ForeColor, flags);
        }

そして、Harshの答えのようにButton1_EnabledChangedメソッド。

2
radiata1891

私は次のアプローチに従いました:-ボタンのClick()イベントは、カスタム変数を使用して制御できます。

private bool btnDisabled;
private void btnClick(object sender, EventArgs e){
   if(!btnDisabled) return;}

このように、ボタンを無効にする必要はありません。ボタンにはまだクリック感がありますが、アクションは実行されません。ボタンが無効になっていることを伝えるには、適切な色を使用する必要があります。

0
girishkatta9

ボタンが部分的に再描画されたときにクリップ効果を回避するために、e.ClipRectangleの代わりにClientRectangleを使用します。

e.Graphics.Clear(BackColor);
using (var drawBrush = new SolidBrush(ForeColor))
using (var sf = new StringFormat
{
    Alignment = StringAlignment.Center,
    LineAlignment = StringAlignment.Center
})
{
    e.Graphics.DrawString(Text, Font, drawBrush, ClientRectangle, sf);
}
0
Mathieu Cans