gpt4 book ai didi

c# - 只有一个 Paint 事件被调用

转载 作者:行者123 更新时间:2023-11-30 18:28:40 26 4
gpt4 key购买 nike

我的问题是我有 8 个图片框,其中只有一个在一次调用它们的绘制方法。

我的代码有点太大,所以我尽量缩小到受影响的部分。

我最好的猜测是这不是我代码中的错误,而是对绘制事件工作方式的误解。

我有一个继承自 PictureBox 的类,我正在使用它而不是 Picturebox。唯一的变化是构造函数

using System.Drawing;
using System.Windows.Forms;

public class DrawingSurface : PictureBox
{
public DrawingSurface(Rectangle bounds) : base() {
base.Dock = DockStyle.Fill;
base.SizeMode = PictureBoxSizeMode.Zoom;
//I set the size and bounds which is probably redundant because
//I was trying random things to fix the problem
base.Size = new Size(bounds.Width, bounds.Height);
base.Bounds = bounds;
base.Margin = new Padding(0) ;
base.BackColor = Color.Transparent;
}
}


public class MyForm:Form
{
public MyForm():base()
{
base.FormBorderStyle = FormBorderStyle.Sizable;
base.MaximizeBox = false;
base.MinimizeBox = false;
base.Bounds = Screen.PrimaryScreen.Bounds;
}

}

这是我的主课

class Program
{
static int Main()
{
short boardOffsetX, boardOffsetY, trayOffsetX, trayOffsetY;
MyForm gameImage = null;
Tray playerTray = null;
ScrabbleBoard board = null;
BagOfLetters bag = null;


AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);//this line of code doesn't work either if any of you can spot anything obvious here.

//this is my hacky way of centering the images, wouldn't mind you telling me
//a better way of doing this either.
boardOffsetX = (short)(Screen.PrimaryScreen.Bounds.Width/4);
boardOffsetY = (short)(Screen.PrimaryScreen.Bounds.Height/8);
trayOffsetX = (short)(Screen.PrimaryScreen.Bounds.Width / 3.3);
trayOffsetY = (short)(Screen.PrimaryScreen.Bounds.Height / 24);
try
{
gameImage = new MyForm();
bag = new BagOfLetters();
board = new ScrabbleBoard(gameImage, new Point(boardOffsetX, boardOffsetY));
playerTray = new Tray(bag, trayOffsetX, trayOffsetY, gameImage);
gameImage.ShowDialog();
}
finally
{
//Dispose all
}
}
}

我的图像是这样画的。我有一个带有大图像的大类(class),其中包含 7 个较小的类(class)及其图像。我尝试从我的大类初始化所有东西。

public class Tray{
private Image TrayImage;
private DrawingSurface TraySurface;
private short OffsetY = 0;
private short OffsetX = 0;
public List<LB> Tray;

public Tray(Bag bag, short offsetX, short offsetY, MyForm gameImage)
{
Letter tmp;

//paramater validation

TrayImage = Image.FromFile(PATHOFTRAY);
//GetBoundsAsRectangle is just getting the image dimensions as a rectangle
TraySurface = new DrawingSurface(GetBoundsAsRectangle()) ;
TraySurface.Location = new Point(offsetX, offsetY);

this.OffsetX = offsetX;
this.OffsetY = offsetY;

do
{
tmp = bag.PullLetter();
}
while (AddLetter(tmp, gameImage));
//make this image draw
TraySurface.Paint += new PaintEventHandler(this.Draw);
gameImage.Controls.Add(TraySurface);
TraySurface.SendToBack();
}


public bool AddLetter(Letter letter, MyForm gameImage) {
//argument validation
Count++;
letter.PutOnTray(Count, OffsetX, OffsetY);
gameImage.Controls.Add(letter.GetDrawingSurface());
if (letterCount >= MAXLETTERS)
{
return false;
}
return true;
}


public void Paint(Object sender, PaintEventArgs drawEvent)
{
//paramater validation here
Rectangle rectangleAreaToDrawImage = new Rectangle(OffsetX,
OffsetY,
TrayImage.Width,
TrayImage.Height);
// Draw image to screen.
drawEvent.Graphics.DrawImage(TrayImage, rectangleAreaToDrawImage);
}
}

public class Letter
{
private Image LetterImage;
private DrawingSurface LetterSurface;
private int PositionOnTray;

public Letter(char value, String fName) {
LetterImage = Image.FromFile(fName);
LetterSurface = new DrawingSurface(GetBoundsAsRectangle());
}


public void PutOnTray(short position, short x, short y)
{
//validation
PositionOnTray = position;
TrayOffsetX = (short)(x + (position*20));
TrayOffsetY = y;
IsOnTray = true;
LetterSurface.Location = new Point(TrayOffsetX, TrayOffsetY);
LetterSurface.Paint += new PaintEventHandler(this.Draw);
}
public void Paint(Object sender, PaintEventArgs drawEvent)
{
int x = 0, y = 0;

//paramater validation here
x = (TrayOffsetX + (LetterImage.Width * PositionOnTray));
y = (TrayOffsetY + 6);
Location = new Rectangle(x,
y,
LetterImage.Width,
LetterImage.Image.Height);
drawEvent.Graphics.DrawImage(LetterImage, Location);
}

所以基本上托盘有图像,7 个字母也有图像。这些字母现在被绘制在托盘的顶部,但在它们自己的图片框中。我为托盘和字母添加了一个绘制方法,并将它们添加到图片框 Paint thingy。我需要这些字母有单独的图片框,因为稍后我想添加功能以通过单击鼠标将它们拾取并在屏幕上拖动。

问题是没有调用绘制方法。就伪代码的理论而言,您将如何绘制它?我来自 Java/C/C++ 背景,图形从来都不是我关注的重点,所以我确信这不是错误,而是我的处理方式是错误的。

最佳答案

解决方案是删除所有图片框...所有这些事件都可以毫无问题地直接添加到表单中。我最初认为我需要通过图片框为所有内容提供单独的处理程序,但我错了。看起来 Pictureboxes 的事件部分几乎没有被使用,除非在极少数情况下,比如当您将它们添加到 tablelayoutpanel 时。

关于c# - 只有一个 Paint 事件被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24523495/

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