Graphics问题

wolf_life 2008-09-04 11:20:48

我想用它画一个钟表,在每次秒针移动时把前一秒画的秒针线给去除。。这个怎么做啊。。。。
搞了好半天。。。。没找到好的方法。
...全文
189 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
TengGaoqing 2008-09-04
  • 打赏
  • 举报
回复
写一个clear的方法,来clear掉上一条线,然后再重新把当前这条线给画出来。
如果还不知道的话,那么你把你的代码给大家伙看看。
优途科技 2008-09-04
  • 打赏
  • 举报
回复
GDI就可以实现啊。每秒绘制一次。刷新一次。
卧_槽 2008-09-04
  • 打赏
  • 举报
回复
重画钟面
  • 打赏
  • 举报
回复
记住位置。用背景色填充一下不行?
yatobiaf 2008-09-04
  • 打赏
  • 举报
回复
还有一种办法,就是用一个不规则窗体来绘制,每秒钟都改变这个不规则窗体的形状(region).
yatobiaf 2008-09-04
  • 打赏
  • 举报
回复
我还以为是在一个窗口里画呢,原来是直接在桌面上画,这个刷新就不是很好弄了,要用到windows API,像InvalidateRect或者UpdateWindow之类的刷新桌面句柄.
LorenLiu 2008-09-04
  • 打赏
  • 举报
回复
如果是我做的话,我会这么做
1. 设置Form的BorderStyle为None,TransparencyKey为BackColor的颜色(一般是Control),给Form一个成员变量Image,赋值给它一个外部的PNG图片,图片是透明底色,上面一圈写着1到12共12个数字
2. 在Form里设置一个Timer成员变量,每1秒钟tick一次,在tick的时候做this.Invalidate();(刷新Form)
3. override Form的Onpaint方法,做两件事,第一是画背景,调用e.Graphics.DrawImage(mImage, this.ClientRectangle);第二是画时针,根据DateTime.Now得到当前的小时,分和秒,分别算出三条线的起始和终止点,调用e.Graphics.DrawLine()方法就可以了
wolf_life 2008-09-04
  • 打赏
  • 举报
回复
不是。。。谢谢。。。不知道有没有更好的放。。
我现在整了个这样的解决方案。。。。

俺分来,,用两种颜色标识秒针,,这样后面的图还在,但也能实时的看到秒针在动。。哈哈

希望大家给个更好的技术解决方案。。哈哈
TengGaoqing 2008-09-04
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 wolf_life 的回复:]
17楼。。你说的是,,,我没有好好设计,,我的最初目的就是在我的桌面上画一个表,,感兴趣而已,,哈哈。。

我想要的是透明的,,不会挡住我的桌面文件,,


C# code
[DllImport("user32.dll")]
static extern IntPtr GetDC(IntPtr hWnd);
deskHandle = GetDC(IntPtr.Zero); //NULL

gh = Graphics.FromHdc(deskHandle);



通过上面的代码取得左面的画图类。。然后…
[/Quote]
那现在的问题就是怎么去做你的透明咯。
结帖吧!
LorenLiu 2008-09-04
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 wolf_life 的回复:]
上面是和16说的。。。打错了。。

17楼兄弟,,1秒的间隔让我看不到表了。。哈哈
[/Quote]

哦~~我以为你的表的背景是在Form的Onpaint里做的呢~~
wolf_life 2008-09-04
  • 打赏
  • 举报
回复
上面是和16说的。。。打错了。。

17楼兄弟,,1秒的间隔让我看不到表了。。哈哈
wolf_life 2008-09-04
  • 打赏
  • 举报
回复
17楼。。你说的是,,,我没有好好设计,,我的最初目的就是在我的桌面上画一个表,,感兴趣而已,,哈哈。。

我想要的是透明的,,不会挡住我的桌面文件,,


[DllImport("user32.dll")]
static extern IntPtr GetDC(IntPtr hWnd);
deskHandle = GetDC(IntPtr.Zero); //NULL

gh = Graphics.FromHdc(deskHandle);


通过上面的代码取得左面的画图类。。然后画图的。。


yatobiaf 2008-09-04
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 TengGaoqing 的回复:]
有两种方法:
第一:
条件:你画的线的颜色是你的线所在的背景的反色。
解决方法:
取得你的线上每一个pixel的rgb值,然后取反,在上面再画一条线。
第二:
条件:你是以某一个image做为背景,同时你画的线是在一个透明的image上画的。
解决方案:
把透明的image给全部清除,然后再画你当前的线。

如果是别的话,很难去只去重画一条线。
[/Quote]

完全不需要这么麻烦,17楼的代码比较接近了.唯一的缺陷是他不能控制重画的时间.我马上给你写个例子.很简单的.
LorenLiu 2008-09-04
  • 打赏
  • 举报
回复
这样行不?

private void timer1_Tick(object sender, EventArgs e)
{


PaintLine();
}

int x1 = 100;
int y1 = 100;
int x2 = 200;
int y2 = 200;
private void PaintLine()
{
gh = this.CreateGraphics();

gh.DrawLine(Pens.Blue, new Point(x1 += 10, y1 += 10), new Point(x2 += 10, y2 += 10));

this.Invalidate();
}
TengGaoqing 2008-09-04
  • 打赏
  • 举报
回复
所以说,你当时的设计就存在问题。
你要把你的表设置为两层的东西,最底层是你的背景,上面是一个透明的纸。
你就可以在纸上画东西了,怎么画都可以。
当然你要是想再弄的好一点的话,你要知道你在什么地方设置为一个透明的。
比如说你的表针会经过的地方,其它的地方都是不透明的。
这样就可以了。
wolf_life 2008-09-04
  • 打赏
  • 举报
回复
private void clear()
{
gh.DrawLine(new pen(backColor), new Point(x1 , y1 ), new Point(x2 , y2));
}



是这么说的。。但问题是我要把他放到桌面上桌面的背景色是会变得。。还有取背景色吗?
TengGaoqing 2008-09-04
  • 打赏
  • 举报
回复
private void clear()
{
gh.DrawLine(new pen(backColor), new Point(x1 , y1 ), new Point(x2 , y2));
}
TengGaoqing 2008-09-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wolf_life 的回复:]
大家说的都不行。。。。

4楼说的写一个clear方法,怎么写啊。。我想知道的就是怎么样去掉上一条线。
private void timer1_Tick(object sender, EventArgs e)
{


PaintLine();
}

int x1 = 100;
int y1 = 100;
int x2 = 200;
int y2 = 200;
private void PaintLine()
{
gh = this.CreateGraphics();

[/Quote]
TengGaoqing 2008-09-04
  • 打赏
  • 举报
回复
有两种方法:
第一:
条件:你画的线的颜色是你的线所在的背景的反色。
解决方法:
取得你的线上每一个pixel的rgb值,然后取反,在上面再画一条线。
第二:
条件:你是以某一个image做为背景,同时你画的线是在一个透明的image上画的。
解决方案:
把透明的image给全部清除,然后再画你当前的线。

如果是别的话,很难去只去重画一条线。
wolf_life 2008-09-04
  • 打赏
  • 举报
回复
我顶。。。期待解决中。。。。
加载更多回复(6)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧