gpt4 book ai didi

c# - 慢速图片框

转载 作者:可可西里 更新时间:2023-11-01 11:28:13 25 4
gpt4 key购买 nike

我正在为我在学校的项目编写一个简单的 Ludus Latrunculorum 游戏,并使用图片框来表示游戏的各个部分。

但是,当我使用背景图像时——我放置作品的面板的任何背景图像,它绘制它们的速度非常慢。就好像它把 1 张图片放在左上角,然后等待大约 0.005 并放置下一张,直到板子被填满。我试过用 1x1 白色图像替换背景图像,结果相同。但是,当我将背景设置为颜色时 (this.board.BackColor = Color.Green;),它会立即打印这些片段。此外,当我将背景颜色设置为透明时,我会看到整个表格的原始背景,再次打印非常慢。但是当我使用 Color.Tan 时,它是我的窗体透明度键,我会看到窗体后面的任何内容,并且这些片段会立即打印出来。我觉得这很奇怪,因为我猜 CPU 获取表单后面的任何内容并打印其上的部分比获取背景图像并在其上打印更困难。

为什么会这样?如何让图片立即打印出来?

期望的行为 - 立即打印作品。实际行为 - 作品打印缓慢。解决同样问题的短代码:Form1.Designer.cs

using System.Drawing;

namespace WindowsFormsApplication6
{
partial class Form1
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;

/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}

#region Windows Form Designer generated code

/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.SuspendLayout();
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackgroundImage = (Image)Image.FromFile(@"C:\Users\gold\Documents\Visual Studio 2013\Projects\Ludus Latrunculorum\Ludus Latrunculorum\images\Background.png", true); // Comment that and see how it prints the pictures immediately
this.ClientSize = new System.Drawing.Size(907, 595);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);

}

#endregion
}
}

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication6
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
PrintBoard();
}

private PictureBox[,] piecesImg;

private void PrintBoard()
{

this.piecesImg = new PictureBox[8, 8];

for (int i = 0; i < 8; i++)
for (int j = 0; j < 8; j++)
{
this.piecesImg[i, j] = new PictureBox();
this.piecesImg[i, j].ClientSize = new Size(52, 52);
this.piecesImg[i, j].Image = (Image)Image.FromFile(@"C:\Users\gold\Documents\Visual Studio 2013\Projects\Ludus Latrunculorum\Ludus Latrunculorum\images\White Pawn.png", true);
this.piecesImg[i, j].BackColor = Color.Transparent;
this.piecesImg[i, j].Location = new Point(j * 57, i * 57);
this.Controls.Add(this.piecesImg[i, j]);
}
}



}
}

最佳答案

我的第一个建议是:不要使用 PictureBox,因为这个控件很重。如果要绘制图像,只需在 OnPaint 方法中绘制即可。

第二个建议:将所有图像添加到资源中,这样您就可以更轻松地通过名称而不是完整路径访问它们。

还有一件事:删除背景。我们也会画出来。无需设置。所以,这是我的完整示例。

资源.resx resources

Form1.cs

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
DoubleBuffered = true;
}

protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.DrawImage(Properties.Resources.Background, 0, 0);
for (int i = 0; i < 8; i++)
for (int j = 0; j < 8; j++)
e.Graphics.DrawImage(Properties.Resources.Pawn, new Rectangle(j * 57, i * 57, 52, 52));
}
}

申请
screenshot

请注意,我在构造函数中设置了 DoubleBuffered 标志以消除闪烁。

关于c# - 慢速图片框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28689358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com