我正在尝试使用一个自定义的由字母表中的字母组成的.PNG文件,为我的游戏提供一些好看的文本图形。然而,由于我的WinForms游戏的核心功能使用最少的图形(我设置了一个计时器来启动一个小动画例程,当用户输入他们已经尝试过的单词时,该例程会淡出"猜测"一词——这是使用DrawString()完成的)。现在,我正在尝试让DrawImage(Image, dstRect, srcRect, Unit)
工作,并将其设置为在表单加载时运行。
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,width,height),所以我给了它"精灵表"的全尺寸。对于dstRect,我只希望它在表单上放置一个80x80px的块,从25x,25y开始。
我创建了一个空白表单,并在表单加载事件期间调用了DrawLetters()
函数(我将该函数复制到该表单的代码中)。不过我什么也没看到,所以我开始有点困惑了。我可能需要一些关于绘画如何与屏幕上绘制的窗体和控件结合工作的教育。
编辑此https://stackoverflow.com/questions/837423/render-a-section-of-an-image-to-a-bitmap-c-sharp-winforms这是我最初的动力,但这位用户对XNA有一定的了解,似乎正试图将其与WinForms结合起来。我相信,对于我试图"美化"的简单文本游戏来说,XNA可能有些过头了。
您需要覆盖窗体OnPaintMethod以访问窗体Graphics对象,然后可以使用该对象在窗体上显示图像。
如果你想显示图像的一部分,你需要使用不同的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);
}
}