Graphics在方法DrawImage遇到的‘延时’问题,求解

问题描述

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"));}

用你的部分代码做了下测试,窗体尺寸和绘制都会相应地变化。

时间: 2024-08-01 22:07:40

Graphics在方法DrawImage遇到的‘延时’问题,求解的相关文章

《C语言程序设计:问题与求解方法》——3.2节用计算机求解问题的步骤

3.2 用计算机求解问题的步骤 前面介绍了很多有关C语言的基础语法知识,但仍然让人感觉千头万绪,不知从何处下手.其实,在进行编程时,只需重点关注变量.表达式.赋值语句(等少数几类语句).输入数据到变量和输出变量(或者表达式)的值.其中,变量是我们解决实际编程问题时的核心和主线. 遇到编程问题,思考的要点是: 1)对此问题需要定义哪些类型的几个变量. 2)哪些变量的值需要输入,即哪些已知的变量需要初始化. 3)如何根据已知的变量构造出合适的表达式,从而用赋值语句来求出未知变量的值. 4)将求出的变

java中paint方法和paintComponent方法的不同

/*    1.由Component.java源代码中可以看见其中的paint()方法体是空的,在Container中重写了该方法,其子类Window等也重写了该方法    2.由JComponent.java源代码中可以看见其中的paint()方法中调用paintComponent, paintChildren, paintBorder等方法:      所以该类中的paint方法会影响子组件的绘制, 而paintComponent方法只会影响该组件本身      3.paint方法 和 pa

ASP组件AspJpeg(加水印)生成缩略图等使用方法_应用技巧

一.为图片添加水印 复制代码 代码如下: <% Dim Jpeg ''''//声明变量 Set Jpeg = Server.CreateObject("Persits.Jpeg") ''''//调用组件 Jpeg.Open Server.MapPath("aaa.JPG") ''''//源图片位置 Jpeg.Canvas.Font.Color = &H000000 ''''//水印字体颜色 Jpeg.Canvas.Font.Family = "

ASP组件AspJpeg(加水印)生成缩略图等使用方法

一.为图片添加水印 复制代码 代码如下: <% Dim Jpeg ''''//声明变量 Set Jpeg = Server.CreateObject("Persits.Jpeg") ''''//调用组件 Jpeg.Open Server.MapPath("aaa.JPG") ''''//源图片位置 Jpeg.Canvas.Font.Color = &H000000 ''''//水印字体颜色 Jpeg.Canvas.Font.Family = "

《51单片机应用开发从入门到精通》——2.4 延时时间计算实例

2.4 延时时间计算实例 51单片机应用开发从入门到精通 在单片机的实时控制系统中,常常需要用到延时操作,所以,延时子程序往往是编写单片机程序中不可缺少的一部分.延时方法有硬件延时和软件延时,硬件延时将在后面有关章节中介绍,本节将介绍软件延时方法. 所谓软件延时,就是让计算机重复执行一些无具体任务的程序,利用执行程序的时间来达到延时的目的. 2.4.1 机器周期和指令周期 单片机读.写操作都需要消耗一定的时间,机器周期是指单片机完成一个基本操作所用的时间,如读操作.写操作等.当石英晶体为12MH

使用Java设置字型和颜色的方法详解_java

Java绘图中,显示文字的方法主要有三种: (1)drawString(String str,int x,int y):在指定的位置显示字符串. (2)drawChars(char data[],int offset,int length, int x, int y):在指定的位置显示字符数组中的文字,从字符数组的offset位置开始,最多显示length个字符. (3)drawBytes(byte data[],int offset,int length,int x,int y), 在指定的位

简析LIVE555中的延时队列

最近在看LIVE555的源码,对其中的延时队列感觉有点乱,网上查询资料,于是就总结一下. 首先描述一下LIVE555中的延时队列的设计理念.如下图,A,B,C分别为时间轴上的三个事件点,而head表示当前时间点. 要描述一个事件发生的时间,通常可以有两种方法:一种方法直接描述事件发生的绝对时间:另一种方法则是可以描述和另一事件发生的相对时间.而LIVE555中采用的就是后者.   在LIVE555中,首先将所有的事件点以发生时间的先后进行排序,然后每个事件对应的时间都是相对于前一事件发生的时间差

Python查找函数f(x)=0根的解决方法

  这篇文章主要介绍了Python查找函数f(x)=0根的解决方法,涉及Python数学运算函数求解的相关技巧,需要的朋友可以参考下 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 ''' root = ridder(f,a,b,tol=1.0e-9). Finds a root of f(x) = 0 with Ridder's method. The root m

方法-widow.print()打印会有页眉和页脚 怎么去掉呢?

问题描述 widow.print()打印会有页眉和页脚 怎么去掉呢? 网上找了一些方法 也只对ie有用 求解火狐之类的浏览器怎么去掉页眉页脚呢 代码实现 解决方案 window.print调用的是浏览器自带的打印服务,控制不了,只能由用户通过系统自带的设置来配置是否打印页头页脚. 不知道网上有没有插件实现firefox打印的插件,谷歌了下视乎没找到..~ ie也是用的acx来实现的吧