我有一個奇怪的問題。我做了我自己的用戶控制從UserControl
派生。我覆蓋OnPaint
。現在我在OnPaint
中畫一些東西。我們假設在位置0,0。base.OnPaint訂單更改繪圖位置
如果我在自定義繪圖後打電話base.OnPaint
一切都很好。但如果我在繪製東西之前調用base.OnPaint
,它似乎忽略包含控件,並且該位置與表單相對,而不是相對於父控件的客戶區域。因此,當我在位置(0,0)繪製時,它將有效地繪製在負x和y上,而我只能看到它的一部分。 base.OnPaint
是UserControl.OnPaint
。所以我不會在那裏給我的代碼打電話。
下面是一個例子:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
var rect = new System.Drawing.Rectangle(this.ClientSize.Width - 16,
this.ClientSize.Height - 16, 16, 16);
e.Graphics.FillRectangle(new System.Drawing.SolidBrush(System.Drawing.Color.Red), rect);
//base.OnPaint(e);
}
在這種情況下,地方的客戶區域內,但不顯示在右下角的紅色矩形。如果我取消註釋最後一行並註釋第一行,則紅色矩形將按預期顯示在右下角。
我不明白。我做了很多次,並且一直工作。所以我試圖找到任何差異。唯一我發現的是,我沒有在設計師中添加我的控制器,而是將其以編程方式添加到另一個控件theContainingControl.Controls.Add(myMessedUpControl);
。
這也發生在我添加的每個父母 - 子女級別上。因此,如果我創建另一個控件(另一個類)並覆蓋OnPaint
,那麼如果將其添加到另一個用戶控件,行爲也是相同的。
有沒有人有過這種行爲?我怎樣才能解決這個問題?問題是我想先致電base.OnPaint
,也是所有人都提出這個建議。但正如我所說,我不能沒有搞亂座標。
一個注意事項:調試器中的座標確實是0,0,如DrawLine
,DrawImage
或DrawString
。但結果顯示在負座標處(相對於客戶區域)。它看起來像客戶端座標被解釋爲窗體的客戶端座標。但我不知道爲什麼。
發現問題
在我的項目有是連接Paint
事件處理在我的形式的所有控件(整個層次)的圖形覆蓋類。在這個處理程序中執行轉換。這種圖形疊加讓我無數次失眠。我想我會刪除它。
只有刷子和整數的FillRectangle? –
'FillRectangle(brush,16)'? 16'怎麼可能是一個矩形? –
抱歉粘貼錯誤的代碼。更新。 –