我正在創建一個UserControl,並且我想通過ControlPaint.DrawBorder()
向它添加邊框。
我創建了一個覆蓋了OnPaint()
,並把這個在它:在用戶控件上拖動一個窗口之後,在GDI +中出現污跡現象
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
int Border_Width =1;
Color Border_Color =Color.FromArgb(170,170,170);
ControlPaint.DrawBorder(e.Graphics,e.ClipRectangle,
Border_Color,Border_Width,ButtonBorderStyle.Solid, //Left
Border_Color,Border_Width,ButtonBorderStyle.Solid, //Top
Border_Color,Border_Width,ButtonBorderStyle.Solid, //Right
Border_Color,Border_Width,ButtonBorderStyle.Solid); //Bottom
}
繪製邊框時很好,但因爲我補充說,一個問題開始:
每當我在拖一些其他的窗口用戶控制,我得到一個「剩」抹黑用戶控件..
一睹它的樣貌:
重寫的OnPaint()之前:
重寫後的OnPaint():
爲什麼會出現這種情況?
從我的實驗,
試圖啓用DubbleBuffering這裏沒有幫助..拖尾現象依然..
而且,如果我禁用ControlPaint.DrawBorder()
線,
與e.Graphics.DrawRectangle()
替換它,
則問題消失..
所以這意味着問題不一定在重寫OnPaint()
或類似的東西,但與ControlPaint.DrawBorder()
。
ControlPaint
類在其提供的其他繪圖操作中是否存在問題?
是否有修復,或者應該避免由於這個錯誤?
根據你的建議,我現在把第二個參數從'e.ClipRectangle'改爲'this.Bounds',並且令人驚訝的是它似乎解決了問題..但是我不明白爲什麼..你知道爲什麼?這個參數應該影響邊框矩形的位置和大小,它如何影響上面描述的拖尾現象? – spaceman
正如我上面提到的,cliprect是控件的一部分,應該重繪。 DrawBorder只繪製一個圍繞Rectangle參數的邊框,並不考慮控件本身的邊界。如果你使用ClipRectangle,你只能「標記」即。在已更改的ClipRect區域周圍繪製邊框。因爲這個「標記」從未透支,所以會出現拖影效應。 嗯... 把你原來的「拖尾」的代碼,把你剛纔您DrwarBorder()語句之前已經提到的DrawRectangle()語句並觀察行爲...... 我敢肯定,那麼你就可以理解行爲! – Tom
謝謝湯姆,絕對有幫助 – spaceman