2015-10-12 50 views
1

我已經完成了以下操作,但整個面板雙邊框的問題沒有得到正確填充。 //內邊框的右下線不被繪製。
目標控制是面板面板的兩個邊框

protected override void OnPaint(PaintEventArgs pe) 
    { 
     using (SolidBrush brush = new SolidBrush(BackColor)) 
      pe.Graphics.FillRectangle(brush, this.Bounds); 

     // Inner Border 
     pe.Graphics.DrawRectangle(new Pen(Color.FromArgb(_InnerBorderColor.R, _InnerBorderColor.B, _InnerBorderColor.G), 1.0f), 1, 1, ClientSize.Width - 1, ClientSize.Height - 1); 
     using (SolidBrush brush = new SolidBrush(BackColor)) 
      pe.Graphics.FillRectangle(brush, this.Bounds); 

     // Main Border 
     pe.Graphics.DrawRectangle(new Pen(Color.FromArgb(_BorderColor.R, _BorderColor.B, _BorderColor.G), 1.0f), 0, 0, ClientSize.Width - 1, ClientSize.Height - 1); 
    } 

這是我得到了
enter image description here

這是我需要什麼
enter image description here

編輯

+0

我覺得這是更好地發佈圖片和標記內邊框,外邊框上的圖像。順便說一句,爲什麼你不這樣簡單地創造筆? '新筆(_OuterBorderColor,1)' –

+0

@RezaAghaei - 因爲我稍後需要Color.FromArgb屬性。我現在將發佈Pic與編輯 –

+0

@RezaAghaei - 請檢查張貼的圖片。在此先感謝 –

回答

2

你應該使用這個座標:

e.Graphics.DrawRectangle(pen1, 
    this.ClientRectangle.Left, this.ClientRectangle.Top, 
    this.ClientRectangle.Width - 1, this.ClientRectangle.Height - 1); 
e.Graphics.DrawRectangle(pen2, 
    this.ClientRectangle.Left + 1, this.ClientRectangle.Top + 1, 
    this.ClientRectangle.Width - 3, this.ClientRectangle.Height - 3); 

注:

  • 對於外部矩形,你應該減去從-1要顯示原始寬度和高度
  • 要繪製內部矩形,您應該從1,1中繪製,以便寬度和高度比外部多邊形小2點th和高度,因爲外部寬度和高度是原始寬度和高度-1,所以您需要從原始寬度和高度減去-3。
+0

真的非常感謝它現在正在工作,我沒有想到左和頂。我試圖和X和Y一起工作。X,Y和Top,Left之間有什麼區別嗎? –

+0

@ Emad-Developer歡迎您:)左和X是平等的,也是Top和Y. –

0

你需要從Client.Width減去2 /身高

pe.Graphics.DrawRectangle(new Pen(Color.FromArgb(_InnerBorderColor.R, _InnerBorderColor.B, _InnerBorderColor.G), 1.0f), 1, 1, ClientSize.Width - 2, ClientSize.Height - 2); 
+1

替代方法是使用'Rectangle.Inflate(-1,-1) ' –

2

您有多個錯誤。使用邊界是錯誤的,即在父座標中,請改用DisplayRectangle。你畫背景兩次,既不必要,第二個覆蓋內矩形。您繪製內部矩形太大的兩個像素。你忘記處理筆,你傾向於逃避它,但當你不知道的時候很醜陋的錯誤來診斷。最後但並非最不重要的,這應該在OnPaintBackground中完成,因此它不會像廉價汽車旅館那樣閃爍。

繪畫中的錯誤並不是那麼容易診斷,最好的方法是漸進式,一次一張。

修正代碼如下所示:

protected override void OnPaintBackground(PaintEventArgs pe) { 
    base.OnPaintBackground(pe); 
    // Inner Border 
    using (var pen = new Pen(_InnerBorderColor)) 
     pe.Graphics.DrawRectangle(pen, 1, 1, ClientSize.Width - 3, ClientSize.Height - 3); 
    // Main Border 
    using (var pen = new Pen(_BorderColor)) 
     pe.Graphics.DrawRectangle(pen, 0, 0, ClientSize.Width - 1, ClientSize.Height - 1); 
}