把从串口接收的数据传给绘图函数。Graphics gp = Graphics.FromHwnd(this.Handle);
获取窗体的Graphics对象实例。然后调用Graphics的方法进行绘图。
但是窗体被覆盖之后图形就不见了。我不想把绘图函数放进OnPaint()函数。
这样无法给绘图函数传递数据,无法实现动态绘图。请高手指点一二,谢谢!
获取窗体的Graphics对象实例。然后调用Graphics的方法进行绘图。
但是窗体被覆盖之后图形就不见了。我不想把绘图函数放进OnPaint()函数。
这样无法给绘图函数传递数据,无法实现动态绘图。请高手指点一二,谢谢!
参看
http://blog.csdn.net/Knight94/archive/2006/08/18/1094078.aspx
窗体被覆盖住图像就没有了啊。
因为在OnPaint()中没有相应的画图动作啊。
能否解释的详细点,谢谢。
能否解释的详细点,谢谢。用窗体同样大小来产生一个bitmap,然后在bitmap进行绘画。
在form的paint事件中调用e.Graphics.DrawImage来显示。
区别于普通的边画边显示,就是画好了再显示呗,玩了几年图形了,这个怎会不知。在内存中画,途中不需要显示,绘制快,就不易感觉闪烁,当然也节约系统资源下面你来补充吧
Graphics g = Graphics.FromImage( yourBufferImage );
//Draw data using "g"this.Invalidate();//Refresh form
那窗口被盖住之后,图像不就全都没有了。我试过把图像放在pictrueBox可以解决这个问题,但是不用这个控件就解决不了么?
那窗口被盖住之后,图像不就全都没有了。不是给你说了吗,你需要在Form的Paint事件中去画
//Form paint event
e.Graphics.DrawImage( yourBufferImage, new Point(0,0) );
试一试!!
//in your form load event
yourBufferImage = new Bitmap( this.ClientSize );//Init bitmap
实现实时绘图,请老大解释一下,谢谢!
实现实时绘图,请老大解释一下,谢谢!yun~仔细看前面的代码,在处理完buffer后,调用Invalidate方法来使窗体刷新。
数据更新的时候,就是你原来画图的地方,Draw() 一下
OnPaint() 里,Draw() 一下。
需要重绘的时候Invalidate()。
最全面的程序开发资料网www.mylinux.com.cn
包罗java,linux,数据库,安全等等技术资料,更有众多软件外包项目我们的qq群:15096318 学习程序的都可以来华资软件作为一家专业的软件公司,现公开承接各种软件外包项目.
www.mylinux.com.cn国内最大的网上软件加工厂,提供最完善的软件外包服务,采用流水型操作流程。中国软件业的发展不缺人才也不缺资金,缺的是人才的组织和管理,MyLinux平台的建设解决了软件人才的组织和管理问题,将每一项目最合适的软件开发人才以最有效率的形式组织在一起,从而取得1+1〉2的效果。
MyLinux(www. MyLinux.com.cn)由上海巨灵信息技术有限公司主办,是目前国内最大的网上软件加工厂,该网站将提供最完善的软件外包服务,采用流水型操作流程。详情请登陆www. MyLinux.com.cn
您可把您的具体要求发布在http://www.mylinux.com.cn/guiderAction.do?type=7上,并留下联系方式,我们网站的技术部门和客服会在第一时间审核安排.~~
Graphics gp = Graphics.FromImage(m_Off);
// 在这个上画图// OnPaint里
if (m_Off != null)
pe.Graphics.DrawImage(m_Off, 0, 0);
但是窗体被覆盖之后图形就不见了。
================因为不是在onpaint中写的我不想把绘图函数放进OnPaint()函数。
这样无法给绘图函数传递数据,无法实现动态绘图。
================楼上有人说用picturebox,很好,你还可以控制picturebox的visible属性
第二,用不用PictureBox不是问题。最主要的是在数据更新时重绘。解决方法是:在要绘画的窗口类中增加一个保存绘制数据的属性,比如你是用PictureBox则:class MyPictureBox : PictureBox
{
private PaintData data;
public PaintData PaintData
{
set
{
//设置数据。
data = value;
Invalidate();
}
get
{
}
}}
就是在数据更新时,重新绘制即可。很简单的一个问题。一般AutoCad或类似的软件基本都是这样一个思路来解决这个问题的。
//***************************定义画标题的类********************************//
private void DrwTtl(Graphics g)
{
string str1 = "车站综合技术作业表";
FontFamily fntFam1 = new FontFamily("宋体");
Font myFnt1 = new Font(fntFam1,36,FontStyle.Bold,GraphicsUnit.Pixel);
SolidBrush bsh1 = new SolidBrush(Color.Green);
Rectangle fw1 = new Rectangle(8,8,600,50);
StringFormat fmt1 = new StringFormat();
fmt1.Alignment = StringAlignment.Near;
fmt1.LineAlignment = StringAlignment.Center; string str2 = "时间:" + dtp_ks.Text.ToString() + tx_ks.Text + "点 -- " + dtp_js.Text.ToString() + tx_js.Text + "点";
FontFamily fntFam2 = new FontFamily("宋体");
Font myFnt2 = new Font(fntFam2,18,FontStyle.Bold,GraphicsUnit.Pixel);
SolidBrush bsh2 = new SolidBrush(Color.Green);
Rectangle fw2 = new Rectangle(8,26,600,72);
StringFormat fmt2 = new StringFormat();
fmt2.Alignment = StringAlignment.Near;
fmt2.LineAlignment = StringAlignment.Center;
g.DrawString(str1,myFnt1,bsh1,fw1,fmt1);
g.DrawString(str2,myFnt2,bsh2,fw2,fmt2);
bsh1.Dispose();
bsh2.Dispose();
}//****************************定义画表头的类*******************************//
private void DrwTblHeader(Graphics g)
{
}//****************************定义画空表的类******************************//
private void DrwGrid(Graphics g)
{
Pen grnPen = new Pen(Color.Green,1);
//水平线
for(int i=72;i<bmp.Height+1;i+=20)
{
g.DrawLine(grnPen,0,i,bmp.Width-24,i);
}
//垂直线
for(int j=0;j<bmp.Width+1;j+=24)
{
g.DrawLine(grnPen,j,72,j,bmp.Height-10);
}
grnPen.Dispose();
}//*****************定义画线的类***********************//
private void DrwLcdd(PointF pnt1,PointF pnt2,PointF pnt3,PointF pnt4,string ddcc,int ddcs)
{
pnt1 = new PointF(10.0f,10.0f);
pnt2 = new PointF(15.0f,30.0f);
pnt3 = new PointF(15.0f,100.0f);
pnt4 = new PointF(100.0f,100.0f); ddcc = "23456";
ddcs = 23;
}private Bitmap bmp = null;private void Paper_Paint(object sender,PaintEventArgs pe)
{
if (bmp != null)
pe.Graphics.DrawImage(bmp, 0, 0);
}private void button1_Click(object sender, System.EventArgs e)
{ Graphics g = this.Paper.CreateGraphics();
g.Clear(Color.White); //创建一个临时绘图表面
bmp = new Bitmap(this.Paper.Width,this.Paper.Height);
Graphics gl = Graphics.FromImage(bmp); DrwTtl(gl);
DrwGrid(gl);
g.DrawImage(bmp,0,0);
g.Dispose();
gl.Dispose();
// bmp.Dispose();}private void button2_Click(object sender, System.EventArgs e)
{
PointF pnt1,pnt2,pnt3,pnt4;
string ddcc;int ddcs;
pnt1 = new PointF(10.0f,10.0f);
pnt2 = new PointF(15.0f,30.0f);
pnt3 = new PointF(15.0f,100.0f);
pnt4 = new PointF(100.0f,100.0f);
PointF[] pnts = {pnt1,pnt2,pnt3,pnt4}; ddcc = "23456";
ddcs = 23; if(bmp != null)
{
Graphics g = this.Paper.CreateGraphics();
g.Clear(Color.White); Graphics gl = Graphics.FromImage(bmp);
Pen bluPen = new Pen(Color.Blue,2);
gl.DrawLines(bluPen,pnts);
g.DrawImage(bmp,0,0);
g.Dispose();
gl.Dispose(); }}