2011-07-10 180 views
0

我試圖通過類在表單上繪製事物。這是代碼。對象引用對於非靜態字段,方法或屬性是必需的

public static void DrawStatBars() 
    { 
     Graphics g = Graphics.FromImage(Graphic.StatBarBackbuffer); 
     Font fnt = new Font("Microsoft Sans Serif", 8, FontStyle.Bold); 
     g.DrawImage(Graphic.EmptyHPBar, new Point(12, 12)); 
     g.DrawImage(Graphic.EmptyManaBar, new Point(12, 35)); 
     g.DrawImage(Graphic.EmptyEXPBar, new Point(12, 58)); 
     g.DrawImage(Graphic.HPBar, new Rectangle(12, 15, (int)picHpWidth, Graphic.HPBar.Height), new Rectangle(0, 0, (int)picHpWidth, Graphic.HPBar.Height), GraphicsUnit.Pixel); 
     g.DrawImage(Graphic.ManaBar, new Rectangle(12, 38, (int)picManaWidth, Graphic.ManaBar.Height), new Rectangle(0, 0, (int)picManaWidth, Graphic.ManaBar.Height), GraphicsUnit.Pixel); 
     g.DrawImage(Graphic.EXPBar, new Rectangle(12, 61, (int)picEXPWidth, Graphic.EXPBar.Height), new Rectangle(0, 0, (int)picEXPWidth, Graphic.EXPBar.Height), GraphicsUnit.Pixel); 
     g.DrawString(lblHPText, fnt, new SolidBrush(Color.Black), 40, 15); 
     g.DrawString(lblManaText, fnt, new SolidBrush(Color.Black), 40, 38); 
     g.DrawString(lblEXPText, fnt, new SolidBrush(Color.Black), 40, 63); 
     g.Dispose(); 


     g = frmMainGame.picGeneral.CreateGraphics; 
     g.DrawImage(Graphic.StatBarBackbuffer, new Point(0, 0)); 
     g.Dispose(); 
    } 

問題是g = frmMainGame.picGeneral.CreateGrpahics;。由於控件不是靜態的,我將如何通過類來訪問它,而不是移動代碼,而必須將代碼重新編碼爲表單本身的代碼。

+2

把它作爲一個參數的函數? – Magnus

回答

0

你可以添加一個事件來處理你的PictureBox.Paint方法

private void picGeneral_Paint(object sender, PaintEventArgs e) 
{ 
    // Use e.Graphics to do your drawing! 
    e.Graphics.DrawStatsBars(); 
} 

把你方法爲擴展方法

public static class GraphicsExtensions 
{ 
    public static void DrawStatsBars(this Graphics g) 
    { 
     // Your code 
    } 
} 
+0

謝謝,這真的很有幫助。我沒有想到做延期。現在回到編碼並完成這個項目。 – crzyone9584

0

幾個選項映入腦海:

  1. 傳遞問題給調用者,即讓他們在作爲參數傳遞的實際參考。如果他們不知道,那麼讓他們的調用者通過它等等。畢竟,有人必須知道你需要使用哪個對象。
  2. 如果您知道只會有一個感興趣的引用,那麼您可以在創建對象時將其靜態存儲在某處。根據應用程序的結構,您可能希望將其存儲在對象自己的類,創建者類,用戶類或應用程序類中。
相關問題