2011-10-17 177 views
1

您好我想要實現一個窗體,使用編碼調整大小。我使用form_paint方法繪製邊框,但是我無法「繪製」這個邊框。我打算做的事情是,當我調整窗體大小時使用「平滑調整大小」的定時器,窗體邊框將隨着調整大小一起更新。我該怎麼辦?在Winforms中繪製圖形繪製

Pen setupControlPen = new Pen(SystemColors.Control, 16); 
    Pen setupDimGrayPen = new Pen(Color.DimGray, 5); 

我form_paint內://繪製一個表格邊框

Rectangle newRectangle; 
    newRectangle = new Rectangle(new Point(0, 0), new Size(this.Width - 1, this.Height - 1)); 
    setupGraphics.DrawRectangle(setupDimGrayPen, newRectangle); 

click事件中://我試圖繪製在已經劃定的邊界。

Rectangle newRectangle = new Rectangle(new Point(0, 0), new Size(this.Width - 1, this.Height - 1)); 
    setupGraphics.DrawRectangle(setupControlPen, newRectangle); 

謝謝!

更新:我試圖使用resize_form事件和計時器重繪,但仍然不能重新繪製邊界,每當我調整窗體大小。

更新2:覆蓋方法的作品!關於setupGraphics:

//global space 
    Graphics setupGraphics; 

    //form_load 
    setupGraphics = this.CreateGraphics(); 

    //so whenever I want to draw something during an event, supposing a button click event to draw a line: 
    setupGraphics.DrawLine(pen, point1, point2); 

我想問一下這個方法是否有缺陷?或者應該在form_paint方法內完成所有事情?

+0

你的FormBorderStyle設置爲None嗎? – LarsTech

+0

是的,它被設置爲none – user776914

回答

2

嘗試重寫OnPaintBackground方法和設置形式ResizeRedraw的風格和雙緩衝它:

public Form1() { 
    InitializeComponent(); 
    this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw, true); 
} 

protected override void OnPaintBackground(PaintEventArgs e) { 
    e.Graphics.Clear(SystemColors.Control); 

    using (Pen setupDimGrayPen = new Pen(Color.DimGray, 5)) { 
    Rectangle newRectangle; 
    newRectangle = new Rectangle(new Point(0, 0), new Size(this.Width - 1, this.Height - 1)); 
    e.Graphics.DrawRectangle(setupDimGrayPen, newRectangle); 
    } 
} 

這其中setupGraphics是從您的文章來的不是很清楚。

+0

不確定你應該鼓勵在繪畫事件中創建對象。筆最好在課外完成,並與課堂正確處理。我會爭論DrawRectange重載,需要x,y,寬度和高度更好...我雖然upvote你,雖然 – musefan

+0

嗨使用保護覆蓋方法的作品無需設置風格,它甚至可以使用doublebuffered設置爲false。我從setupGraphics編輯過我的問題。 – user776914

+0

@ user776914最好從Paint事件中使用Graphics對象。如果您需要根據button_click繪製不同的東西,請設置一個局部變量以確定要繪製的「哪根」筆。如果未在按鈕單擊事件中調整窗體大小以刷新圖形,請在窗體上調用Invalidate()。 – LarsTech

2

那麼你的點擊事件實際上調整了窗體的大小?如果沒有變化的形式作出,則表單不會嘗試重新繪製,你可以嘗試其中之一......

form.Invalidate(); 
form.Refresh(); 
paintControl.Invalidate(); 
paintControl.Refresh(); 

paintControl是,如果你有比形式塗料實際上是被其他控制對,你應該只刷新最小的控制/地區完成所需

而且,不要忘記設置DoubleBuffered爲true窗體/控制

編輯:我不知道setupGraphics是什麼?爲什麼不在Paint事件參數上使用e.Graphics對象?

+0

哦,我宣佈它爲:Graphics setupGraphics;在全球空間。在form_load事件中,我將它初始化爲setupGraphics = this.createGraphics(); – user776914

+1

@ user776914:聽起來可能是一個促成因素。嘗試使用其他地方建議的e.Graphics或OnPaintBackground ...其他答案看起來不錯 – musefan

4

對容器控件的繪畫進行了優化。在你的情況下,你希望Paint事件在表單大小改變時觸發。讓你的構造函數看起來像這樣:

public Form1() { 
     InitializeComponent(); 
     this.ResizeRedraw = true; 
     this.DoubleBuffered = true; 
    } 

或者在OnPaintBackground()的重寫中做邊框繪製。

+0

不錯...這樣的時間我應該能夠upvote兩次! – musefan