2013-10-20 37 views
0

我怎麼能叫與系統參數的方法在鼠標點擊事件:呼叫信息與鼠標點擊事件參數的方法

public void DrawStringRectangleF(PaintEventArgs e) 
{ 

    // Create string to draw. 
    String drawString = "Sample Text"; 

    // Create font and brush. 
    Font drawFont = new Font("Arial", 16); 
    SolidBrush drawBrush = new SolidBrush(Color.Black); 

    // Create rectangle for drawing. 
    float x = 150.0F; 
    float y = 150.0F; 
    float width = 200.0F; 
    float height = 50.0F; 
    RectangleF drawRect = new RectangleF(x, y, width, height); 

    // Draw rectangle to screen. 
    Pen blackPen = new Pen(Color.Black); 
    e.Graphics.DrawRectangle(blackPen, x, y, width, height); 

    // Draw string to screen. 
    e.Graphics.DrawString(drawString, drawFont, drawBrush, drawRect); 
} 

我想打電話給在此情況下,本方法:

private void button1_Click(object sender, EventArgs e) 
     { 
      // calling DrawStringRectangleF(PaintEventArgs e) here 
     } 

如果參數只是在調用這些方法時提及這些值,則很容易調用該方法,但在這種情況下如何調用它?!

+0

入住此線程: 的http://計算器.COM /問題/ 11753345 /如何撥號功能與 - PaintEventArgs的-argumnt –

回答

3

爲了滿足你可以封裝你想用來繪製矩形的PaintEventArgs類的實例中這樣

using (var controlGraphics = CreateGraphics()) 
{ 
    var paintEventArgs = new PaintEventArgs(controlGraphics, ClientRectangle); 
    DrawStringRectangleF(paintEventArgs); 
} 

Control.CreateGraphics方法會產生GraphicsGraphics例如現有的方法簽名您可以使用它來繪製底層控件(或表單)上的實例。

要明白,每當控件失效時,用該Graphics對象繪製的所有內容都將被擦除,因此您必須連續重新繪製圖形。

您可能會考慮改變方法簽名,使其接受的Graphics,而不是它的實例應該爲一個清晰的解決方案。

+0

許多感謝確實 – user2888402

1

下面是使用畫圖()事件和自定義類的列表來存儲應該怎麼得出的信息的一個例子:

public partial class Form1 : Form 
{ 

    public class TextData 
    { 
     public string Text; 
     public string FontName; 
     public int FontSize; 
     public RectangleF TextRectF; 
     public Color TextColor; 
    } 

    private List<TextData> Texts = new List<TextData>(); 

    public Form1() 
    { 
     InitializeComponent(); 
     this.Paint += new PaintEventHandler(Form1_Paint); 

     TextData td = new TextData(); 
     td.Text = "Example"; 
     td.FontName = "Courier"; 
     td.FontSize = 24; 
     td.TextRectF = new RectangleF(50.0F, 50.0F, 175.0F, 75.0F); 
     td.TextColor = Color.Red; 
     Texts.Add(td); 
    } 

    void Form1_Paint(object sender, PaintEventArgs e) 
    { 
     foreach (TextData td in Texts) 
     { 
      using (Pen drawPen = new Pen(td.TextColor)) 
      { 
       e.Graphics.DrawRectangle(drawPen, Rectangle.Round(td.TextRectF)); 
      } 
      using (Font drawFont = new Font(td.FontName, td.FontSize)) 
      { 
       using (SolidBrush drawBrush = new SolidBrush(td.TextColor)) 
       { 
        e.Graphics.DrawString(td.Text, drawFont, drawBrush, td.TextRectF);    
       } 
      } 
     } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     TextData td = new TextData(); 
     td.Text = "Sample Text"; 
     td.FontName = "Arial"; 
     td.FontSize = 16; 
     td.TextRectF = new RectangleF(150.0F, 150.0F, 200.0F, 50.0F); 
     td.TextColor = Color.Black; 
     Texts.Add(td); 
     this.Refresh(); 
    } 

} 
+0

一個繼承的類不應該訂閱它自己的事件。您應該重寫[OnPaint](http://msdn.microsoft.com/en-us/library/system.windows.forms.control.onpaint.aspx)而不是訂閱'this.Paint'事件。 (除了處理函數不需要修改以從事件切換到疊加外,請務必在函數的開頭添加一個'base.OnPaint(e)') –

+0

爲什麼不能@ScottChamberlain?如果我使用VS IDE訂閱Paint()事件,這正是它所做的(儘管跨兩個不同的文件)。爲什麼微軟不會插入覆蓋OnPaint()的方法存根...? –

+0

我理解整個封裝方面,訂閱事件需要提出委託和事件等等,但是在宏方案中事情對於這樣的例子真的很重要嗎? –