2012-12-04 57 views
1

我試圖使用自定義的.PNG文件從字母表中的字母給我的遊戲一些漂亮的文本圖形。然而,由於我的WinForms遊戲的核心功能使用最少的圖形工作(我有一個定時器設置爲啓動一個小動畫程序,當用戶輸入一個他們已經嘗試過的單詞時淡出「猜測」一詞 - 這是完成的使用DrawString())。現在我試圖讓DrawImage(Image, dstRect, srcRect, Unit)工作,我已經設置爲在表單加載上運行。DrawImage()'精靈'沒有出現

private void DrawLetters() 
    { 

     // Create image. 
     Graphics letters = this.CreateGraphics(); 
     Image newImage = Image.FromFile(strPath + "Letter_Map.png"); 

     // Create rectangle for displaying image. 
     Rectangle destRect = new Rectangle(25, 25, 80, 80); 

     // Create rectangle for source image. 
     Rectangle srcRect = new Rectangle(0, 0, 833, 833); 
     GraphicsUnit units = GraphicsUnit.Pixel; 

     // Draw image to screen. 
     letters.DrawImage(newImage, destRect, srcRect, units); 
    } 

這實際上是逐字從MSDN網站。我的表單現在用一組標籤填充以向用戶顯示遊戲所需的字母網格。它們是否被覆蓋了自定義矩形?我想最終用圖像替換它們。我知道srcRect是(x,y,寬度,高度),所以我給了它全尺寸的'spritesheet'。對於dstRect,我只希望它在25x,25y左右的表格上放置一個80x80px的塊。

對於它的問題,我創建了一個空白表單,並在該表單加載事件(我將該函數複製到該表單的代碼)期間調用了我的DrawLetters()函數。但是我什麼也沒看到,所以我開始有點困惑。我可能需要一些關於如何將繪圖與屏幕上繪製的表單和控件結合使用的教育。

編輯https://stackoverflow.com/questions/837423/render-a-section-of-an-image-to-a-bitmap-c-sharp-winforms是讓我去最初的東西,但這個用戶有XNA的工作知識,似乎是試圖結合了與WinForms的。我相信,XNA對於我想要'漂亮'的簡單文本遊戲來說是過度殺傷力。

+1

我編輯了自己的冠軍。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+0

謝謝,約翰。我會記住下次。 – armadadrive

回答

2

您需要重寫窗體OnPaintMethod才能訪問窗體Graphics對象,然後可以使用該窗體在窗體上顯示圖像。

如果你要顯示的圖像的一部分,你需要使用一個different overload of DrawImage,如下所示:

public partial class DrawImageDemo : Form 
{ 
    public DrawImageDemo() 
    { 
     InitializeComponent(); 
    } 

    private Image _sprites; 
    public Image Sprites 
    { 
     get 
     { 
      if (_sprites == null) 
      { 
       _sprites = Image.FromFile("test.jpg"); 
      } 
      return _sprites; 
     } 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     // The forms graphics object 
     Graphics g = e.Graphics; 

     // Portion of original image to display 
     Rectangle region = new Rectangle(0, 0, 80, 80); 

     g.DrawImage(Sprites, 25, 25, region, GraphicsUnit.Pixel); 

     base.OnPaint(e); 
    } 

} 
+0

你的意思是'Paint',我看到的事件處理程序是否切換到事件?或者是「OnPaint」,那裏不一定是可見的東西? – armadadrive

+0

@armadadrive如果您可以繪製可以繪製的類(具有此方法)的子類,或者可以爲類外部的Paint事件添加事件處理程序,則可以重寫OnPaint方法。 –

+0

哈!這像一個魅力。所以我可以設置一些Dictionary 來保存每個字母的X,Y座標。感謝您的幫助@ sga101。有沒有進一步的閱讀我可以做**不是** MSDN? – armadadrive