xyold1 发表于 2010-8-22 15:31:03

[已解决]如何在用RedrawWindow刷新时不让桌面图标闪动

本帖最后由 xyold1 于 2010-8-23 17:16 编辑

下面是帮助里的一段代码,用于显示一个十字,再刷新屏幕,除去显示

我稍修改了一下,循环显示

我的问题是如何在刷新时不让桌面图标闪动,因为我见为别的程序刷新时很“安静”
#Include <WinAPI.au3>
_WinAPI_RedrawWindow($hWnd [, $tRect = 0 [, $hRegion = 0 [, $iFlags = 5]]])

是不是修改 $iFlags的值?

请求帮助!#include <WindowsConstants.au3>
#include <WinAPI.au3>
While 1
ShowCross(@DesktopWidth / 2, @DesktopHeight / 2, 20, 2, 0xFF, 3000)
WEnd
Func ShowCross($start_x, $start_y, $length, $width, $color, $time)
        Local $hDC, $hPen, $obj_orig

        $hDC = _WinAPI_GetWindowDC(0) ; DC of entire screen (desktop)
        $hPen = _WinAPI_CreatePen($PS_SOLID, $width, $color)
        $obj_orig = _WinAPI_SelectObject($hDC, $hPen)
       
        _WinAPI_DrawLine($hDC, $start_x - $length, $start_y, $start_x - 5, $start_y) ; horizontal left
        _WinAPI_DrawLine($hDC, $start_x + $length, $start_y, $start_x + 5, $start_y) ; horizontal right
        _WinAPI_DrawLine($hDC, $start_x, $start_y - $length, $start_x, $start_y - 5) ; vertical up
        ;        _WinAPI_DrawLine($hDC, $start_x, $start_y + $length, $start_x, $start_y + 5) ; vertical down
        _WinAPI_MoveTo($hDC, $start_x, $start_y + $length)
        _WinAPI_LineTo($hDC, $start_x, $start_y + 5)

        Sleep($time) ; show cross over screen for defined seconds

        ; refresh desktop (clear cross)
        _WinAPI_RedrawWindow(_WinAPI_GetDesktopWindow(), 0, 0, $RDW_INVALIDATE + $RDW_ALLCHILDREN)
        ; clear resources
        _WinAPI_SelectObject($hDC, $obj_orig)
        _WinAPI_DeleteObject($hPen)
        _WinAPI_ReleaseDC(0, $hDC)
EndFunc   ;==>ShowCross

afan 发表于 2010-8-22 15:38:15

刷新肯定要闪的,除非不刷新,找别的办法

xyold1 发表于 2010-8-22 16:26:28

清除所画的图形,除了刷新,还有别的方法吗

rolaka 发表于 2010-8-22 16:37:38

画在透明的窗体上呢?

xyold1 发表于 2010-8-22 16:47:11

回复 4# rolaka


    这个图形是画在屏幕上的

就是不知怎么清除

刷新可以,但会使桌面图标一闪,像按了F5似的

在DOS里一个clear就清屏了,这个怎么弄啊?

afan 发表于 2010-8-22 16:48:40

画在透明gui上,清除时直接GuiDelete就行了

xyold1 发表于 2010-8-22 17:12:47

回复 6# afan


    透明GUI还要做鼠标穿透{:face (207):}

算了,还是用这个代码吧,闪就闪吧{:face (370):}

rolaka 发表于 2010-8-22 19:21:13

回复afan


    透明GUI还要做鼠标穿透

算了,还是用这个代码吧,闪就闪吧{:face ( ...
xyold1 发表于 2010-8-22 17:12 http://www.autoitx.com/images/common/back.gif


    都有现成的东西...一搜就搜到了

lxz 发表于 2010-8-22 19:23:56

学习了.....

xyold1 发表于 2010-8-22 19:28:20

回复 8# rolaka

搜了一下,也试着做了一下,看着那长长的代码就感觉其效率不咋地

创建窗体,设置透明,再设鼠标穿透,再画图,最后删除窗体,远不如真接在屏幕上画图来得快

afan 发表于 2010-8-22 21:50:10

本帖最后由 afan 于 2010-8-22 21:52 编辑

回复 10# xyold1


    透明就不用穿透了吧… 你有何应用哦,举实例说明会更好
有时候代码虽长,但耗时1毫秒都不到,看怎么优化了。但优化不一定就是短代码,优化的是效率

xyold1 发表于 2010-8-22 22:38:45

回复 11# afan

仿一个迷你背单词的程序写的,用特大号的字在屏幕上显示当前朗读的内容

它是画在屏幕上的,切换很静,而我做不来

用透明窗口试过了,刷新窗口不能更新显示的文字

而Guidelete后,我的电脑桌面也会闪,虽然加了鼠标穿透,但是在切换显示时,弹出的鼠标右键菜单会消失

我还是用原来的办法吧

afan 发表于 2010-8-22 22:41:27

回复 12# xyold1


    什么软件,不大的话我下个看看

xyold1 发表于 2010-8-22 23:05:40

回复 13# afan
主程序也不大866K,就是压缩包里加了一个TTS引擎,使得压缩包为8M多
多特有下载
http://www.duote.com/soft/2679.html

afan 发表于 2010-8-23 00:56:25

回复 14# xyold1


    弄了半天,才调出那个所谓的大字…… 真晕
看了下。它的确是直接画在屏幕上的(而且只画在指定的区域),要达到这样的效果也很简单。
直接在_WinAPI_RedrawWindow()中设置第二个参数即可
页: [1] 2
查看完整版本: [已解决]如何在用RedrawWindow刷新时不让桌面图标闪动