1

我正在尝试使用由字母表中的字母组成的自定义构建的 .PNG 文件来为我的游戏提供一些漂亮的文本图形。但是,由于我的 WinForms 游戏的核心功能使用最少的图形工作(我设置了一个计时器来触发一个小动画例程,当用户输入他们已经尝试过的单词时,它会淡出单词“Guessed” - 这已经完成使用 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) 所以我给了它'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 将是矫枉过正。

4

1 回答 1

2

您需要覆盖表单 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);
    }

}
于 2012-12-04T19:38:02.153 回答