当前位置:编程学习 > C#/ASP.NET >>

请教一个窗口刷新的思路

功能要求是这样的,要在一个图形上,显示一个矩形的可移动的透明的测量刻度尺

我用的GDI画的,目前是直接在一个面板控件表面上进行绘图,把绘图代码放在控件刷新事件里,只要控件刷新时,这份图形都会重绘。

移动的刻度尺我是单做的一个控件,因为要对尺子进行拖放拉伸等操作,直接在面板控件表面绘图画一个尺子不好进行操作。

我现在碰到的问题是:我在面板上绘好图后,对尺子进行拖放和拉伸操作时,都会引发面板控件刷新事件,拖动尺子时,面板重复刷新,屏幕闪烁得厉害。
我想只让面板局部刷新,但是不知道怎么具体实现。

请问对于实现这个功能,大家一般是个什么思路进行绘图操作? --------------------编程问答-------------------- 有没有用到双缓冲? --------------------编程问答--------------------
引用 1 楼 caozhy 的回复:
有没有用到双缓冲?

这个跟控件双缓冲倒没什么关系,我的尺子是自己写的控件,那个是使用了双缓冲的。

面板控件上,因为是要读取数据计算再绘图的,刷新次数多,肯定会闪烁,不关乎双缓冲吧 --------------------编程问答-------------------- 你可以分层,只重绘你要重绘的layer --------------------编程问答--------------------
引用 3 楼 angel6709 的回复:
你可以分层,只重绘你要重绘的layer

GDI绘图怎么分层? --------------------编程问答-------------------- 构造函数加个代码试试

 this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
            --------------------编程问答--------------------
引用 5 楼 hjywyj 的回复:
构造函数加个代码试试

 this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);


你说的是哪个控件使用这个设置?
尺子控件还是面板控件(panel),尺子控件是我自己写的,我有尝试过SetStyle,不过当时是为了使尺子透明,后来这个方法失败了。不过屏幕闪烁的问题,是面板控件重绘次数太多造成的,跟尺子控件没什么太大关系吧 --------------------编程问答--------------------
引用 6 楼 txfast 的回复:
你说的是哪个控件使用这个设置?

GDI在那个控件绘图,哪个控件闪烁就写在哪个控件的构造函数里。 --------------------编程问答--------------------
引用 7 楼 hjywyj 的回复:
引用 6 楼 txfast 的回复:你说的是哪个控件使用这个设置?
GDI在那个控件绘图,哪个控件闪烁就写在哪个控件的构造函数里。

是在面板控件里绘图的,不过那个,不在于缓冲,主要是刷新次数太多太频繁了 --------------------编程问答--------------------
引用 8 楼 txfast 的回复:
引用 7 楼 hjywyj 的回复:
引用 6 楼 txfast 的回复:你说的是哪个控件使用这个设置?
GDI在那个控件绘图,哪个控件闪烁就写在哪个控件的构造函数里。
是在面板控件里绘图的,不过那个,不在于缓冲,主要是刷新次数太多太频繁了

你玩3D游戏,1秒刷多少次?
你说的刷新=重绘吧? --------------------编程问答--------------------
引用 9 楼 wjfwd2010 的回复:
引用 8 楼 txfast 的回复:引用 7 楼 hjywyj 的回复:
引用 6 楼 txfast 的回复:你说的是哪个控件使用这个设置?
GDI在那个控件绘图,哪个控件闪烁就写在哪个控件的构造函数里。
是在面板控件里绘图的,不过那个,不在于缓冲,主要是刷新次数太多太频繁了
你玩3D游戏,1秒刷多少次?
你说的刷新=重绘吧?

3D游戏是用directX渲染的
我这个平时普通的控件是用GDI渲染的 --------------------编程问答--------------------
引用 9 楼 wjfwd2010 的回复:
引用 8 楼 txfast 的回复:引用 7 楼 hjywyj 的回复:
引用 6 楼 txfast 的回复:你说的是哪个控件使用这个设置?
GDI在那个控件绘图,哪个控件闪烁就写在哪个控件的构造函数里。
是在面板控件里绘图的,不过那个,不在于缓冲,主要是刷新次数太多太频繁了
你玩3D游戏,1秒刷多少次?
你说的刷新=重绘吧?

我说的刷新是等于重绘,因为面板控件上的所有图形,是我根据计算数据绘制的,每次窗口刷新时,面板控件上的图形,就重绘一次。
--------------------编程问答-------------------- 把绘制的方法封装了,刷新就重新调用下方法就可以了。 --------------------编程问答--------------------
引用 10 楼 txfast 的回复:
引用 9 楼 wjfwd2010 的回复:
引用 8 楼 txfast 的回复:引用 7 楼 hjywyj 的回复:
引用 6 楼 txfast 的回复:你说的是哪个控件使用这个设置?
GDI在那个控件绘图,哪个控件闪烁就写在哪个控件的构造函数里。
是在面板控件里绘图的,不过那个,不在于缓冲,主要是刷新次数太多太频繁了
你玩3D游戏,1秒刷多少次?
你说的刷新=重绘吧?
3D游戏是用……

那你就用directX做呗,这还不简单?
看你所言GDI渲染的没办法在刷新的时候不闪一下,那你就换呗 --------------------编程问答--------------------
引用 12 楼 SugerDPS 的回复:
把绘制的方法封装了,刷新就重新调用下方法就可以了。


本来就是这样做的,刷新是调用了那个方法在面板上绘图的 --------------------编程问答-------------------- 好久没看了,这帖子忘了
后来我不得已,把原来的绘图画到内存位图对象上,然后把内存位图对象当成背景图,这样的话,就不用刷新了。
背景图的遮挡绘制是windows自己的机制处理的,不用老绘制 --------------------编程问答-------------------- 封装成方法,需要刷新时就刷新。 --------------------编程问答-------------------- 需要注意:重绘(OnPaint)与刷新(Refresh)不是一回事。
应在重绘事件中写代码,而不是频繁的Refresh。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,