您的位置:程序门 -> .net技术 -> c#



关于自绘图的刷新问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


关于自绘图的刷新问题[已结贴,结贴人:liangxf0022]
发表于:2007-02-14 11:22:57 楼主
我在窗口中使用wndproc中截获wm_ncpaint事件,然后自己绘制整个窗体。

现在就是有几个问题,1个是为什么我调整窗体的大小导致整个窗体刷新,这个是主要问题,就是用mfc写的程序刷新很快,而我写的程序刷新很慢,导致拖动的时候不停的闪烁,有没有什么好的办法解决这个问题?

双缓冲、用bitmap来缓冲、只绘标题区等等,全部都试过了,效果不明显。
发表于:2007-02-14 11:26:431楼 得分:0
还有就是如何设置标题区的大小,在对象中的3个rect有什么含义?

protected   override   void   wndproc(ref   message   m)
{
     
rectanglef   rectf;
switch   (m.msg)
{
case   wm_ncpaint   :
intptr   hrgn   =   m.wparam;
if   (   hrgn   !=   (intptr)1   )
{
region   rgn   =   region.fromhrgn(hrgn);
g   =   creategraphics();
rectf   =   rgn.getbounds(g);
paintnonclientarea(g,   rectf);
}
else
{
g   =   creategraphics();
rectf   =   new   rectanglef(0,-23,   width,   23);
paintnonclientarea(g,   rectf);
g.dispose();
}
     
//base.wndproc(ref   m);
break;
default   :
base.wndproc   (ref   m);
break;
}
}
发表于:2007-02-14 13:29:322楼 得分:30
我的想法是画到一个内存图片1上,画好之后拷贝到内存图片2上,然后在绘图事件中拷贝图片2到窗口上。注意收到绘图事件的时候并不重画,只是拷贝。这样你缓慢的绘图过程可以放在一个线程或者定时器事件中慢慢来,也不会因为画到一半收到重绘事件而影响刷新。
发表于:2007-02-14 13:29:513楼 得分:10
up
发表于:2007-02-14 13:34:584楼 得分:0
to   tony1978(突击召唤师)
前半部分已经做过了,为什么不直接拷贝图片1到窗口上?而是要拷贝图片2到窗口上?

后半部分用线程做过了,因为会导致2个线程同时绘的问题,有没有什么办法解决这个问题?
发表于:2007-02-14 14:53:325楼 得分:0
继续顶阿
发表于:2007-02-15 09:33:426楼 得分:0
再顶
发表于:2007-02-15 10:39:447楼 得分:40
你这个问题是连续产生wm_ncpaint事件的问题,上一个事件还没有画好,下个个事件跟着来了,造成界面频频刷新引起的。所以应该只在内存画,画好了一次过copy到graphics上,这样应该就没有闪烁了。
发表于:2007-02-15 11:41:318楼 得分:10
up
发表于:2007-02-15 12:06:199楼 得分:0
jimh(jimmy)   (   )     的话偶记住了!~~~
发表于:2007-02-25 12:11:4810楼 得分:0
to   jimh(jimmy)   :

我也知道是ncpaint的重入问题。
我也是在内存一个bitmap中画的图,然后在ncpaint中graphics.drawimage来画,结果在连续拖动的时候仍然没有被画出来。
就连.net自身的控件也有些不会被重画,如listview和treeview,而label这些控件则没有影响。

看看这个窗体,如果在窗体上不画任何东西则相应是很快的,但是如果放了10个左右的控件则标题栏刷新就会很恼火了
发表于:2007-02-26 11:55:5111楼 得分:0
发表于:2007-02-26 12:00:5712楼 得分:10
有个最快的办法,升级你机器的配置


快速检索

最新资讯
热门点击