2012-05-02 21 views
1

私のフォームには2つのボタンがあります。どちらも背景画像を持ち、フラットスタイルは「フラット」です。ボタンの境界線と無効な外観を変更する

  1. フォーカスがボタンの上にあるTABキーをクリックすると、私はボタンで国境を点在しているしたいの代わりに固体の境界線の、内側のソリッドカラーの四角形を参照してください。ボタンをクリックすると

  2. 、いくつかの活動が起こっていると、ボタンが無効になっています。無効になっている間、ボタンのテキストの色はグレーに変わります。私はそれがテキストの色を変更しないようにします。これはWindowsの標準的な動作だと思いますが、ボタンを選択したときにテキストの色を変更しないでください。

これらのポイントを設定するプロパティはありません。私は目標を達成するために何をすべきですか?どんな助けも高く評価されます。

カスタムボタンも作成しましたが、上記の問題を解決することはできません。

私のカスタムボタンの塗装方法:

public partial class MyButton : Button { 

    protected override void OnPaint(PaintEventArgs pevent) 
    { 
     base.OnPaint(pevent); 
     // Set custom fore color  
     base.ForeColor = Color.FromArgb(0, 255, 254, 255);  

     // set the same forecolor even if the button is disabled 
     if (base.Enabled == false) 
     { 
      base.ForeColor = Color.FromArgb(0, 255, 254, 255); 
     } 

    } //OnPaint method ends 
    } // class ends 

は、(1)&ためSoluitonを更新しました(2) は)(のOnPaintに次を追加しました:

private void init() 
    { 
     base.ForeColor = Color.FromArgb(0, 255, 254, 255); 
     base.FlatAppearance.BorderColor = Color.FromArgb(0, 255, 255, 254); // Transparent border 
    } 

    protected override void OnPaint(PaintEventArgs pevent) 
    { 
     base.OnPaint(pevent); 

     if (base.ContainsFocus) 
     { 
      // Draw inner dotted rectangle when button is on focus 
      Pen pen = new Pen(Color.Gray, 3); 
      Point p = base.Location; 
      pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot; 
      Rectangle rectangle = new Rectangle(4, 4, Size.Width - 8, Size.Height - 8); 
      ControlPaint.DrawFocusRectangle(pevent.Graphics, rectangle); 
     } 

     // Draw the string to screen 
     SizeF sf = pevent.Graphics.MeasureString(displayText, this.Font, this.Width); 
     Point ThePoint = new Point(); 
     ThePoint.X = (int)((this.Width/2) - (sf.Width/2)); 
     ThePoint.Y = (int)((this.Height/2) - (sf.Height/2)); 
     //pevent.Graphics.DrawString(displayText, Font, new SolidBrush(this.ForeColor), ThePoint); 
     //pevent.Graphics.DrawString(displayText, Font, new SolidBrush(Color.FromArgb(0, 255, 254, 255)), ThePoint); 
     pevent.Graphics.DrawString(displayText, Font, new SolidBrush(Color.Black), ThePoint); 
     //this.Text = ""; 
    }//OnPaint ends 

    // Avoids the inner solid rectangle shown on focus 
    protected override bool ShowFocusCues 
    { 
     get 
     { 
      return false; 
     } 
    } 

をこれが正常に点線を描きます私のボタンの中にフォーカスを示す行。デフォルトの実線を取り除くために、私はShowFocusCues()をオーバーライドしました。

これは完全に1を解決するのに役立ちました。しかし、ポイント2では、100%の結果が得られません。 MyButtonクラスに "displayText"というプロパティを作成しました。 OnPaint()では、ForeColor、Color.FromARGBにSolidBrushを指定すると、テキストは表示されません。しかし、Color.Blackを渡すと、それを受け入れ、テキストを黒色で表示します。 ForeColorやカスタムカラーを受け入れず、デフォルトのカラーのみを受け入れないのはなぜですか?この単純な仕事のどこで私はまだ間違っていますか。フォームでbutton_paintを実装してみましたが、同じ結果が表示されます。

私はまだ間違っていますか?

+0

'Focus'は、あなたが探しているキーワードです。 – nothrow

+0

「button3_Paint(オブジェクト送信者、PaintEventArgs e)」のボタンテキストと境界線のスタイルと色を変更します。 – Sadaf

+0

@husnain、カスタムボタンのペイントイベントが追加されました。 (2)の場合、btnをクリックしてアクティビティを実行するとEnabledがfalseに設定されます。しかし、コードが追加された後でも、テキストの色はクリックした後にのみ灰色になります。 REG境界線スタイル、私はどのように変更し、それを設定するのか分からない、あなたはsnaippetまたは使用する方法を表示できますか? -Thanks – Tvd

答えて

1
 private void button3_Paint(object sender, PaintEventArgs e) 
      { 

       SolidBrush br = new SolidBrush(Color.Blue); 
       Pen pen = new Pen(br); 
       pen.Width = 3; 
       pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot; 
        // to draw left border 
       e.Graphics.DrawLine(pen, new Point(0, 0), new Point(0, this.button3.Width)); 
       SolidBrush drawBrush = new SolidBrush(ForeColor); //Use the ForeColor property 
       // Draw string to screen. 
       e.Graphics.DrawString("Sample", Font, drawBrush, 5f, 3f); 
       this.button3.Text = ""; 
    } 
+0

ありがとうhusnain。私はポイント1のために使用したコードを追加しました。そして今、フォーカスの点線の内側のボタンを得ることができ、フォーカスを外すと消えます。しかし、私はまだデフォルトの実線を取得します。そのデフォルトの実線をどうやって取り除くのですか? – Tvd

+0

私はその実線のrectも取り除きました。今ポイント(3)はまだ解決されていません。なぜそうなのか ??? – Tvd

+0

あなたは説明することができますポイント(3) – Sadaf

関連する問題