none
關於GDI重繪的問題 RRS feed

  • 問題

  • 我自己建立了一個LedButton,繼承原本的button,利用OnPaint()在上面畫了個矩形當作是燈號,程式碼如下。

    namespace CustomControl
    {
        public class LedButton : System.Windows.Forms.Button
        {
            private bool active = false;
            public bool Active
            {
                get { return active; }
                set {
                    this.Invalidate();
                    active = value; }
            }
            public Color ActiveColor
            {
                get { return activeColor; }
                set { activeColor = value; }
            }
            private Color activeColor = Color.Lime;
            public Color InActiveColor
            {
                get { return inActiveColor; }
                set { inActiveColor = value; }
            }
            private Color inActiveColor = Color.Red;
     
            public LedButton()
            {
                SetStyle(ControlStyles.AllPaintingInWmPaint |
                    ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer, true);
                Size = new Size(65, 35);
            }
            protected override void OnPaint(PaintEventArgs pevent)
            {
                base.OnPaint(pevent);
                pevent.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
                SolidBrush myBrush;
                if (active == true)
                {
                    myBrush = new SolidBrush(activeColor);
                }else
                    myBrush = new SolidBrush(inActiveColor);
                pevent.Graphics.DrawRectangle(new Pen(new SolidBrush(Color.Black), 1), pevent.ClipRectangle.X + 6, (float)(pevent.ClipRectangle.Height * 0.72), (float)(pevent.ClipRectangle.Width -12), (float)(pevent.ClipRectangle.Height * 0.11));
                pevent.Graphics.FillRectangle(myBrush, pevent.ClipRectangle.X + 6, (int)(pevent.ClipRectangle.Height * 0.73), (int)(pevent.ClipRectangle.Width - 12), (int)(pevent.ClipRectangle.Height * 0.1));
            }
        }
    }

    在Active狀態改變的時候會重繪,最大化最小化和拖曳視窗也都ok,但是當我把整個Form拉到視窗以外,再拉回來後,原本的矩形燈號卻不會正常顯示。

    煩請高手相助,謝謝~

    2012年5月9日 上午 11:03

解答

  • 您好,

    發現是因為您畫圖的X, Y等Size一直變的關係!

    請將以下的Code,

    pevent.Graphics.DrawRectangle(new Pen(new SolidBrush(Color.Black), 1), pevent.ClipRectangle.X + 6, (float)(pevent.ClipRectangle.Height * 0.72), (float)(pevent.ClipRectangle.Width -12), (float)(pevent.ClipRectangle.Height * 0.11));
    pevent.Graphics.FillRectangle(myBrush, pevent.ClipRectangle.X + 6, (int)(pevent.ClipRectangle.Height * 0.73), (int)(pevent.ClipRectangle.Width - 12), (int)(pevent.ClipRectangle.Height * 0.1));
    
    改成以下的Code,應該就可以了吧!
    pevent.Graphics.DrawRectangle(new Pen(new SolidBrush(Color.Black), 1),  6, (float)(this.Height * 0.72), (float)(this.Width - 12), (float)(this.Height * 0.11));
    pevent.Graphics.FillRectangle(myBrush, 6, (int)(this.Height * 0.73), (int)(this.Width - 12), (int)(this.Height * 0.1));
    


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    • 已標示為解答 sbphsho 2012年5月11日 上午 02:02
    2012年5月10日 上午 03:12

所有回覆

  • 可以將放有LedButton控制項的Form關閉後再開啟, 如果可以正常顯示, 表示您的控制項沒有問題
    2012年5月10日 上午 02:22
  • 您好,

    發現是因為您畫圖的X, Y等Size一直變的關係!

    請將以下的Code,

    pevent.Graphics.DrawRectangle(new Pen(new SolidBrush(Color.Black), 1), pevent.ClipRectangle.X + 6, (float)(pevent.ClipRectangle.Height * 0.72), (float)(pevent.ClipRectangle.Width -12), (float)(pevent.ClipRectangle.Height * 0.11));
    pevent.Graphics.FillRectangle(myBrush, pevent.ClipRectangle.X + 6, (int)(pevent.ClipRectangle.Height * 0.73), (int)(pevent.ClipRectangle.Width - 12), (int)(pevent.ClipRectangle.Height * 0.1));
    
    改成以下的Code,應該就可以了吧!
    pevent.Graphics.DrawRectangle(new Pen(new SolidBrush(Color.Black), 1),  6, (float)(this.Height * 0.72), (float)(this.Width - 12), (float)(this.Height * 0.11));
    pevent.Graphics.FillRectangle(myBrush, 6, (int)(this.Height * 0.73), (int)(this.Width - 12), (int)(this.Height * 0.1));
    


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    • 已標示為解答 sbphsho 2012年5月11日 上午 02:02
    2012年5月10日 上午 03:12
  • 我是傻子  -.-

    謝謝

    2012年5月11日 上午 02:02