问题描述
privatevoidpaintArea(Imageimg){this.Width=img.Width;//动态调节控件尺寸更大的图片尺寸this.Height=img.Height+pb_gaming.Location.Y+pb_gaming.Size.Height+1;pb_gaming.Location=newPoint((this.Width-50)/2,menu.Size.Height+1);Graphicsg=this.CreateGraphics();g.Clear(this.BackColor);g.DrawImage(img,newPoint(0,pb_gaming.Location.Y+pb_gaming.Size.Height+1));//绘制更大的}
this为所在窗体paintArea方法一共六行代码,其中前两行为窗体尺寸调节,第二行右侧代码的值视为常量就可以,同理第六行Point的构造函数参数也是视为常量就可以。如代码,假如调用两次,窗体假定初始为400*400,第一次是以300*300的图为参数,第二次是600*600的。据我调试,第一次可以完整绘制出300*300的图案(绘制前绘制区域足够300*300),然后第二次虽然参数是600*600的图案,但只能绘制出300*300的左上角部分。此时如果再次以600*600的图案为参数绘制,就可以完整绘制出来。另外,假如在窗体尺寸变更和绘制之间,就是倒数第二行的位置插上MessageBox.Show,就会可以正常输出,不过换成Thread.Sleep却不行。求大神指点。====================================另附MainForm代码usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Drawing.Drawing2D;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;usingMicrosoft.DirectX;usingMicrosoft.DirectX.DirectSound;usingSystem.Threading;usingSystem.Media;namespaceBoom{publicpartialclassMainForm:Form{publicMainForm(){InitializeComponent();}intmode=1;boolleftFlag_Menu=false;//记录是否按下左键,用于拖拽窗体boolleftFlag_Bomb=false;//左键记录标志位,扫雷用Pointmou;//记录拖拽窗口时相对于程序窗体的鼠标落点privatevoidpaintArea(Imageimg){this.Width=img.Width;//动态调节控件尺寸更大的图片尺寸this.Height=img.Height+pb_gaming.Location.Y+pb_gaming.Size.Height+1;pb_gaming.Location=newPoint((this.Width-50)/2,menu.Size.Height+1);Graphicsg=this.CreateGraphics();g.Clear(this.BackColor);g.DrawImage(img,newPoint(0,pb_gaming.Location.Y+pb_gaming.Size.Height+1));//绘制更大的}privatevoidMainForm_Load(objectsender,EventArgse){pb_gaming.Image=Properties.Resources.kuroko1;this.Width=Properties.Resources.p9_9.Width;//动态调节控件尺寸this.Height=Properties.Resources.p9_9.Height+84;pb_gaming.Location=newPoint((this.Width-50)/2,menu.Size.Height+1);}protectedoverridevoidOnPaint(PaintEventArgse){base.OnPaint(e);Graphicsg=e.Graphics;g.Clear(this.BackColor);g.DrawImage(Properties.Resources.p9_9,newPoint(0,pb_gaming.Location.Y+pb_gaming.Size.Height+1));}privatevoidpb_gaming_Click(objectsender,EventArgse){if(mode==1)paintArea(Properties.Resources.p9_9);elseif(mode==2)paintArea(Properties.Resources.p16_16);elseif(mode==3)paintArea(Properties.Resources.p16_30);}privatevoidpb_gaming_MouseDown(objectsender,MouseEventArgse){}privatevoid初级BToolStripMenuItem_Click(objectsender,EventArgse){mode=1;paintArea(Properties.Resources.p9_9);}privatevoid关于AToolStripMenuItem_Click(objectsender,EventArgse){}privatevoidmenu_MouseDown(objectsender,MouseEventArgse){if(e.Button==MouseButtons.Left){leftFlag_Menu=true;mou=this.PointToClient(Control.MousePosition);}}privatevoidmenu_MouseMove(objectsender,MouseEventArgse){if(leftFlag_Menu){Pointt=Control.MousePosition;Points=newPoint();s.X=t.X-mou.X;s.Y=t.Y-mou.Y;this.Location=s;}}privatevoidmenu_MouseUp(objectsender,MouseEventArgse){if(e.Button==MouseButtons.Left)leftFlag_Menu=false;}privatevoidmenu_MouseLeave(objectsender,EventArgse){leftFlag_Menu=false;}privatevoidMainForm_MouseDown(objectsender,MouseEventArgse){if(e.Button==MouseButtons.Left)leftFlag_Bomb=true;}privatevoidMainForm_MouseUp(objectsender,MouseEventArgse){leftFlag_Bomb=false;}privatevoidMainForm_MouseLeave(objectsender,EventArgse){leftFlag_Bomb=false;}privatevoid中级IToolStripMenuItem_Click(objectsender,EventArgse){mode=2;paintArea(Properties.Resources.p16_16);}privatevoid高级EToolStripMenuItem_Click(objectsender,EventArgse){mode=3;paintArea(Properties.Resources.p16_30);}}}
解决方案
解决方案二:
privatevoidpaintArea(Imageimg){this.Width=img.Width;this.Height=img.Height;Graphicsg=this.CreateGraphics();g.Clear(this.BackColor);g.DrawImage(img,newPoint(0,0));}privatevoidaaToolStripMenuItem_Click(objectsender,EventArgse){paintArea(Image.FromFile(@"C:1.jpg"));}privatevoidbbToolStripMenuItem_Click(objectsender,EventArgse){paintArea(Image.FromFile(@"C:2.jpg"));}
用你的部分代码做了下测试,窗体尺寸和绘制都会相应地变化。