只调用一个Paint事件

我的问题是我有8个图片盒,其中只有一个是一次调用他们的绘图方法。

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

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

我有一个inheritance自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 } } } 

我的图像是这样绘制的。 我有一个大型类,一个大图像保存7个较小的类和他们的图像。 我试着从我的大class上初始化一切。

 public class Tray{ private Image TrayImage; private DrawingSurface TraySurface; private short OffsetY = 0; private short OffsetX = 0; public List 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。 我需要这些字母有单独的图片框,因为稍后我想添加function,让它们被拾取并用鼠标点击在屏幕上拖动。

问题是没有调用paint方法。 只是理论上与伪代码有关,你会怎么去画这个? 我来自Java / C / C ++背景,图形从来都不是我关注的焦点,所以我确信这不是一个bug,而是我如何解决这个问题。

解决方案是删除所有图片框……所有这些事件都可以直接添加到表单中而不会出现问题。 我原本以为我需要通过图片盒提供单独的处理程序,但我错了。 似乎Pictureboxes的事件部分几乎未被使用,除非在极少数情况下,例如将它们添加到tablelayoutpanel时。