除了InvalidateRect()、RedrawWindow和Invalidate;还有什么方法可以快速刷新窗口? ( 积分: 300 )

  • 主题发起人 主题发起人 YuZi
  • 开始时间 开始时间
Y

YuZi

Unregistered / Unconfirmed
GUEST, unregistred user!
现在我用下面的方法更新窗口,
SetWindowPos(Handle, 0, 0, 0, Width, Height+1, SWP_NOMOVE);
SetWindowPos(Handle, 0, 0, 0, Width, Height-1, SWP_NOMOVE);
比用InvalidateRect()、RedrawWindow和Invalidate等方法闪烁情况好一些。我是通过用SetWindowPos调整大小来达到间接刷新窗口的目的,但SetWindowPos只有在调整后的大小跟原来不一样才会刷新窗口,所以用了两行代码,有什么办法不用改变大小也能刷新窗口吗?
如果能解决这个微小的闪烁问题,那也就达到了QQ的效果了。

=================================================================
如何实现QQ屏幕截图功能中的“区域选取”功能,注意我的问题不是问如何截图,而是问如何实现那种“区域选取”的效果,即如何实现选取区域周围有8个黑色小方块,并且可以通过它们实时调整区域大小,可以移动区域矩形。请不要贴TStretchHandle、TSizeControl之类控件的代码,用这些控件+TImage实现的效果太差了,我要的不仅仅是运行期改变控件大小的效果。
我也曾想用Image直接实现,但Image没有句柄无法利用WM_NCHITTEST消息改变大小,后来继承TwinControl+WS_EX_TRANSPARENT写了一个,效果已经很接近QQ了,但移动时背景却无法透明更新。。。
 
现在我用下面的方法更新窗口,
SetWindowPos(Handle, 0, 0, 0, Width, Height+1, SWP_NOMOVE);
SetWindowPos(Handle, 0, 0, 0, Width, Height-1, SWP_NOMOVE);
比用InvalidateRect()、RedrawWindow和Invalidate等方法闪烁情况好一些。我是通过用SetWindowPos调整大小来达到间接刷新窗口的目的,但SetWindowPos只有在调整后的大小跟原来不一样才会刷新窗口,所以用了两行代码,有什么办法不用改变大小也能刷新窗口吗?
如果能解决这个微小的闪烁问题,那也就达到了QQ的效果了。

=================================================================
如何实现QQ屏幕截图功能中的“区域选取”功能,注意我的问题不是问如何截图,而是问如何实现那种“区域选取”的效果,即如何实现选取区域周围有8个黑色小方块,并且可以通过它们实时调整区域大小,可以移动区域矩形。请不要贴TStretchHandle、TSizeControl之类控件的代码,用这些控件+TImage实现的效果太差了,我要的不仅仅是运行期改变控件大小的效果。
我也曾想用Image直接实现,但Image没有句柄无法利用WM_NCHITTEST消息改变大小,后来继承TwinControl+WS_EX_TRANSPARENT写了一个,效果已经很接近QQ了,但移动时背景却无法透明更新。。。
 
以前做过一个地图浏览的小程序,选取区域用的方法是,用一个TShape来实现的。
 
自己画不行吗?
我作画笔时就是自己画的,来调整选择区域的大小
 
真是有缘哦。我昨天刚开始研究这个问题。qq是用一个edit控件实现的,具体实现还在研究中..
 
做到类似的效果很容易,但要做到实时缩放,不闪烁就不知怎么做了,我不需要理论,希望看到切实可行的方法或演示,谢谢!
 
to iamy:跟QQ截图的效果一样吗?用处理WM_NCHITTEST消息的方法会有个虚线框
to tswhq:能给个演示看一下吗?
to forever2005:有什么新发现吗?
 
qq用的一个窗体和一个edit控件,都是不可见的。外框和那些黑色的小方框都是自己画的
 
肯定有高人做过类似的程序,恳请高人指点 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 
直接调用QQ的DLL就可以了,看看我的软件http://gz.onlinedown.net/soft/11484.htm,下载后(无需安装,只有一个执行文件),选择升级后再用就看到效果了。
 
升级不了,而且感觉那个软件大概是从别人的什么源码改写过来的(包括升级模块)
另外,如果直接调用别人的DLL的话,那我的问题也就没有意义了。。。。。。
而且乱加IE按钮,真是让人讨厌!!!
 
借用别的帖子的回复,不知道能不能解决楼主的问题。
Perform(WM_SETREDRAW, 0, 0); //锁屏幕
frmChildWin := TfrmChildWin.Create(Self);
frmChildWin.WindowState := wsMaximized;
frmChildWin.Show;

Perform(WM_SETREDRAW, 1, 0); //解锁屏幕并重画
RedrawWindow(Handle, Nil, 0, RDW_FRAME + RDW_INVALIDATE +
RDW_ALLCHILDREN + RDW_NOINTERNALPAINT);
 
谢谢dragontop,可惜在移动区域时这样的方法仍然比SetWindowPos刷新的慢。SetWindowPos执行后到底发了什么消息呢?我想不是WM_PAINT的原因,对一个带有WS_EX_TRANSPARENT扩展风格的窗口,发送WM_PAINT根本就没有变化,那它是用什么方法快速更新区域的呢?

这是我现在的效果,有比这个效果好的朋友请大力帮忙,谢谢!:
http://leeten.go3.icpcn.com/downloads/区域选择.rar
 
用Form.Update可以重画窗口
设置双缓冲Form.DoubleBuffer:=true 可以解决闪烁问题
 
谢谢hangguojun!呵呵,这个。。。。

如果用画图的方法能实现同样的效果,也请大侠出手支援一下,我实在不愿意相信大富翁在走下坡路。。。。。
 
罢了,先结了
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
772
import
I
后退
顶部