| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1857 人关注过本帖
标题:窗体画图形问题
只看楼主 加入收藏
cobby
Rank: 1
等 级:新手上路
威 望:1
帖 子:565
专家分:0
注 册:2007-7-11
收藏
得分:0 
以下是引用师妃暄在2007-10-11 11:49:51的发言:


一点该窗体失去焦点,在显示的时候.刚刚绘制的图形将不会重新显示.这就设计到windows程序的重绘问题.

系统自带的控件本身也是绘制出来的,但是他们自身会自动重绘,但是我们自己绘制的图形这种情况下不会自动重绘.

这时候我们要采用另外一中方法:
private void Form1_Paint(object sender, PaintEventArgs e)
{//捕获窗体的重绘事件
//把绘图代码放在这里
}

我以前就按照这个思路试过,可是行不通。有两个原因,请帮忙想想
1、好像paint事件几乎一直处于激发状态,我一运行,窗体就重绘个不停,占用大量系统资源,几乎做不了其它的操作;
2、出于软件本身的要求,绘制图形的代码只能写到其它事件或函数里,又该怎么办?


努力成为菜鸟!
2007-10-11 14:09
andey
Rank: 2
等 级:新手上路
威 望:4
帖 子:938
专家分:0
注 册:2007-7-18
收藏
得分:0 
学习一下啦...

msdn == 葵花宝典!!!
QQ:122768959
2007-10-11 16:06
jacklee
Rank: 7Rank: 7Rank: 7
来 自:XAplus
等 级:贵宾
威 望:32
帖 子:1769
专家分:104
注 册:2006-11-3
收藏
得分:0 
TOCOBY:
你可以用绘图的方式画到图形到一个建立的BITMAP上,之后放置一个PICTUREBOX,你想更新图片时就重画一次更新到PICTUREBOX,如何更新不用说了吧?就是PICTUREBOX1.IMAGE=(IMAGE)YOURBITMAP;
这样一来也不占资源也不闪,还不会被擦掉。

XAplus!
讨论群:51090447
删吧删吧,把我的号给删了!
2007-10-12 08:13
jxnuwy04
Rank: 2
等 级:新手上路
威 望:4
帖 子:768
专家分:0
注 册:2006-9-15
收藏
得分:0 

我这里有个实例,保存为.cs文件,通过csc可以编译成exe,然后运行可以看到效果.
using System;
using System.Drawing;
using System.Windows.Forms;

class BezierArt:Form
{
const int iNum = 100;

public static void Main()
{
Application.Run(new BezierArt());
}

public BezierArt()
{
Text = "Bezier Art";
}

protected override void OnPaint(PaintEventArgs pea)
{
Graphics grfx = pea.Graphics;
int cx = ClientSize.Width;
int cy = ClientSize.Height;
Color clr = Color.Blue;
Pen pen = new Pen(clr);
PointF[] aptf = new PointF[4];

for(int i = 0;i<iNum;i++)
{
double dAngle = 2*i*Math.PI/iNum;
aptf[0].X = cx/2+cx/2*(float)Math.Cos(dAngle);
aptf[0].Y = 5*cy/8+cy/16*(float)Math.Sin(dAngle);

aptf[1] = new PointF(cx/2,-cy);
aptf[2] = new PointF(cx/2,2*cy);

dAngle += Math.PI;

aptf[3].X = cx/2+cx/4*(float)Math.Cos(dAngle);
aptf[3].Y = cy/2+cy/16*(float)Math.Sin(dAngle);

grfx.DrawBeziers(pen,aptf);
}
}

protected override void OnResize(EventArgs ea)
{
Invalidate(false);
}
}


------------------不为别的,就为你,我的理想!-----------------
2007-10-12 08:26
cobby
Rank: 1
等 级:新手上路
威 望:1
帖 子:565
专家分:0
注 册:2007-7-11
收藏
得分:0 
以下是引用jacklee在2007-10-12 8:13:16的发言:
TOCOBY:
你可以用绘图的方式画到图形到一个建立的BITMAP上,之后放置一个PICTUREBOX,你想更新图片时就重画一次更新到PICTUREBOX,如何更新不用说了吧?就是PICTUREBOX1.IMAGE=(IMAGE)YOURBITMAP;
这样一来也不占资源也不闪,还不会被擦掉。

看上去方法不错,能具体指导下如何建立bitmap并在上面绘图吗?


努力成为菜鸟!
2007-10-12 09:07
jacklee
Rank: 7Rank: 7Rank: 7
来 自:XAplus
等 级:贵宾
威 望:32
帖 子:1769
专家分:104
注 册:2006-11-3
收藏
得分:0 
这是双缓冲:

BITMAP MAP=NEW BITMAP(W,H);
GRAPHICS G=GRAPHICS.FROMIMAGE(MAP);
G.DRAWRECT(...);
G.DISPOSE();

PICTUREBOX1.IMAGE=MAP; (OR PICTUREBOX1.IMAGE=(IMAGE)MAP;)

XAplus!
讨论群:51090447
删吧删吧,把我的号给删了!
2007-10-12 09:19
梦心
Rank: 4
来 自:福建平和
等 级:贵宾
威 望:13
帖 子:1910
专家分:0
注 册:2007-5-11
收藏
得分:0 

都是这么高深的东西~
还是不懂~唉

我清高和我骄傲的倔强,在风中大声的唱:我不听,我不听~~做我自己最特别,呼呼~~啦啦~~~
我的博客园地址: [url]http://[/url]
2007-10-12 12:50
快速回复:窗体画图形问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034406 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved