我正在设计一个HangMan游戏,以学习如何在DevExpress中使用C#.我的问题是我正在绘制相对于我正在绘制它的面板大小的大小的帖子,以便在调整窗口大小时重新计算其大小.我的代码看起来像这样:
namespace HangMan
{
public partial class HangMan : Form
{
public HangMan()
{
InitializeComponent();
this.Paint += new System.Windows.Forms.PaintEventHandler(HangMan_Paint);
}
void drawHangPost()
{
//Use panel size percentages to draw the post
double dWidth = pnlHang.Width; double dHeight = pnlHang.Height;
int x1 = (int)Math.Round(0.8 * dWidth); int x2 = (int)Math.Round(0.45 * dWidth);
int y1 = (int)Math.Round(dHeight); int y2 = (int)Math.Round(0.23 * dHeight);
int xInit = x1; int xFinal = x1 - x2;
int yInit = y1; int yMiddle = 10; int yFinal = y2;
//Paint Post
Graphics g = pnlHang.CreateGraphics();
Pen p = new Pen(Color.Brown, 10);
g.DrawLine(p, new Point(xInit, yInit), new Point(xInit, yMiddle));
g.DrawLine(p, new Point(xInit, yMiddle), new Point(xFinal, yMiddle));
g.DrawLine(p, new Point(xFinal, yMiddle), new Point(xFinal, yFinal));
}
private void HangMan_Paint(object sender, EventArgs e)
{
drawHangPost();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这对我来说非常有效,并且后期绘图也会调整大小.但是,当我手动调整窗口大小时,每个步骤都会绘制一个新帖子,因此会显示许多帖子.如果我最大化窗口,则会出现两个不同大小的帖子.
然而,当我最小化窗口并再次打开它时,只留下合适的绘图.有没有办法在绘制新图纸时擦除以前的图纸?
我应该在InitializeComponent()之后包含某种擦除命令吗?
因此,问题的主要部分是您正在响应表单的绘制事件,然后绘制到控件,该控件可能已失效,也可能尚未失效。
Graphics相反,您应该订阅面板的绘制事件,并使用传递到事件参数的对象进行绘制。此外,您还需要处理面板的调整大小事件以使其无效。我假设您正在使用锚点或对接来在调整表单大小时自动调整面板大小。如果没有,您需要更改它,以便在表单调整时调整面板的大小。
public Form1()
{
InitializeComponent();
pnlHang.Paint += PnlHangPaint;
pnlHang.Resize += (sender, args) => pnlHang.Invalidate();
}
private void pnlHang_Paint(object sender, PaintEventArgs paintEventArgs)
{
drawHangPost(paintEventArgs.Graphics);
}
void drawHangPost(Graphics g)
{
//Use panel size percentages to draw the post
double dWidth = pnlHang.Width;
double dHeight = pnlHang.Height;
int x1 = (int)Math.Round(0.8 * dWidth);
int x2 = (int)Math.Round(0.45 * dWidth);
int y1 = (int)Math.Round(dHeight);
int y2 = (int)Math.Round(0.23 * dHeight);
int xInit = x1;
int xFinal = x1 - x2;
int yInit = y1;
int yMiddle = 10;
int yFinal = y2;
//Paint Post
using (Pen p = new Pen(Color.Brown, 10))
{
g.DrawLine(p, new Point(xInit, yInit), new Point(xInit, yMiddle));
g.DrawLine(p, new Point(xInit, yMiddle), new Point(xFinal, yMiddle));
g.DrawLine(p, new Point(xFinal, yMiddle), new Point(xFinal, yFinal));
}
}
Run Code Online (Sandbox Code Playgroud)
另外,任何时候您创建 GDI 资源(例如钢笔或画笔)时,请务必将其丢弃!AC# using block 可以很好地为您完成这一任务。