ATHSJF 发表于 2012-11-19 22:44:09

[已解决]请问有图片背景时周期性更新标签内容怎么才能不闪?

本帖最后由 ATHSJF 于 2012-11-28 19:05 编辑

请问有图片背景时周期性更新标签内容怎么才能不闪?
其实就是更新一个倒计时
我的代码在比对从ini中读取的数组中的一组时间和当前的时间$thour=_DateDiff ('h',_NowCalc(),_NowCalcDate()&" "&$tmparray&":"&$tmparray&":00")
$tmin=_DateDiff ('n',_NowCalc(),_NowCalcDate()&" "&$tmparray&":"&$tmparray&":00")-(60*$thour)
$tmm=_DateDiff ('s',_NowCalc(),_NowCalcDate()&" "&$tmparray&":"&$tmparray&":00")-(60*$tmin)-(3600*$thour)将倒计时更新于标签上
根据搜索... 下列结果都不好用:
方法一 隐藏--修改--显示GUICtrlSetState($Labelth,$GUI_HIDE)
GUICtrlSetData($Labelth,$thour)
GUICtrlSetState($Labelth,$GUI_SHOW)
GUICtrlSetState($Labeltm,$GUI_HIDE)
GUICtrlSetData($Labeltm,$tmin)
GUICtrlSetState($Labeltm,$GUI_SHOW)
GUICtrlSetState($Labeltmm,$GUI_HIDE)
GUICtrlSetData($Labeltmm,$tmm)
GUICtrlSetState($Labeltmm,$GUI_SHOW)此法依旧闪...


方法二: 使用ControlSetTextControlSetText("$from","",$Labelth,$thour)
ControlSetText("$from","",$Labeltm,$tmin)
ControlSetText("$from","",$Labeltmm,$tmm)不闪了 但是改变的文字与原有的文字重叠 (原有的文字不清除 叠在一起) 也不行啊如果使用参数 重画窗体
带来的是如梦魔一样的全窗口闪 - - 还是闪白色- -

呜呜 怎么办吖
注意哦是以图片打底色 标签用了
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
如果不是图片背景 频率不高 不会太严重(但还是存在咯)
但是本处可能不得不使用图片背景
各位亲有木有什么好的办法么 ....谢谢大家


正解就在下面 afan大大的代码 成功实现了我的目标谢谢他 也谢谢大家的关注~

afan 发表于 2012-11-19 23:40:21

用 GDI+ 绘制。
或者用 $WS_EX_LAYERED 分层窗口的形式,图片在底层,文本在上层

ATHSJF 发表于 2012-11-20 00:13:47

回复 2# afan

谢谢版主回复
    正在紧急学习相关内容中 - -
我是新手 - -
    估计GDI有点难度 短时间有点...
试试分层,资料看起来不多(论坛不知关键字,关键字为分层结果不理想),
能给我写1条将图片设到底层的代码吗 >?
我来试着仿写...

afan 发表于 2012-11-20 10:12:24

回复 3# ATHSJF


    写了个分层的例子,我的Os是XP,不知道Win8是否通用#include <WindowsConstants.au3>

Local $Pic = RegRead('HKLM\SOFTWARE\AutoIt v3\AutoIt', 'InstallDir') & '\Examples\GUI\msoobe.jpg'
If Not FileExists($Pic) Then Exit MsgBox(48, '', '图片不存在,请检查')

Local $hGUI = GUICreate('不闪...@afan', 380, 200, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
GUICtrlCreatePic($Pic, -5, 0, 380 + 5, 200, -1, 0x00100000)
GUISetState()

Local $hCGui = GUICreate('', 300, 230, 0, 10, $WS_POPUP, $WS_EX_LAYERED + $WS_EX_MDICHILD, $hGUI)
GUISetBkColor(0x333333, $hCGui)
GUICtrlCreateLabel('Esc 键退出', 10, 0, 350, 12)
GUICtrlSetColor(-1, 0xEEEEEE)
Local $iLabel2 = GUICtrlCreateLabel('       ..........', 80, 110, 350, 20)
GUICtrlSetFont(-1, 12, 800, -1, '微软雅黑')
GUICtrlSetColor(-1, 0xFFFFFF)
_API_SetLayeredWindowAttributes($hCGui, 0x333333, 200)
GUISetState()

Local $sTime, $x = AdlibRegister('_MTimer', 100)
Do
Until GUIGetMsg() = -3

Func _MTimer()        ;设置时钟
        Local $Time = StringFormat('%02s 时, %02s 分, %02s 秒, %02s 毫秒', @Hour, @Min, @Sec, @MSEC)
        If $sTime <> $Time Then ControlSetText($hCGui, '', $iLabel2, $Time)
        $sTime = $Time
EndFunc   ;==>_MTimer

Func _API_SetLayeredWindowAttributes($hwnd, $i_transcolor, $Transparency = 255)        ;设置前景窗口透明
        $i_transcolor = Hex(String($i_transcolor), 6)
        $i_transcolor = Execute('0x00' & StringMid($i_transcolor, 5, 2) & StringMid($i_transcolor, 3, 2) & StringMid($i_transcolor, 1, 2))
        DllCall('user32.dll', 'int', 'SetLayeredWindowAttributes', 'hwnd', $hwnd, 'long', $i_transcolor, 'byte', $Transparency, 'long', 3)
EndFunc   ;==>_API_SetLayeredWindowAttributes

afan 发表于 2012-11-20 10:28:24

GDI 绘制主要包括以下步骤,可自行查阅帮助练习
_GDIPlus_ImageLoadFromFile() 载入图片
_GDIPlus_GraphicsDrawStringEx() 绘制文本
GUICreate() 创建带 $WS_EX_LAYERED 扩展样式窗口
_WinAPI_UpdateLayeredWindow() 将变化的数据实时更新窗口

xiehuahere 发表于 2012-11-20 15:52:33

前来学习...
很好的例子,值得收藏

ATHSJF 发表于 2012-11-20 16:16:25

本帖最后由 ATHSJF 于 2012-11-20 16:22 编辑

回复 4# afan


    非常感谢您!正在努力研究中....

您的代码在我的os中运行正常 没有闪的情况 正在尝试将您的代码运用到我自己的代码中{:face (209):}

jingygr 发表于 2012-11-20 16:41:51

确实是很经典的例子,收藏备用。

ATHSJF 发表于 2012-11-22 23:26:54

回复 4# afan


    afan您好 可以再问一个问题吗对于窗口退出时 想要运用 fade out 动画 但无论是顶层窗口 还是底层窗口 皆不能实现 这是为什么呢>?
        DllCall("user32.dll", "int", "AnimateWindow", "hwnd",$hGUI, "int", 500, "long", 0x00090000);fade-out

afan 发表于 2012-11-23 00:05:00

回复afan


    afan您好 可以再问一个问题吗对于窗口退出时 想要运用 fade out 动画 但无论是顶层 ...
ATHSJF 发表于 2012-11-22 23:26 http://www.autoitx.com/images/common/back.gif


    去掉 $hGui 的 $WS_EX_LAYERED 扩展样式试试

ATHSJF 发表于 2012-11-23 00:21:09

回复 10# afan


    谢谢您成功了~·~    不过去掉了这个样式 让我有点不能理解 顶层与底层的含义了

这个实例应该是创建了一个透明的 仅含文字的窗体 作为图片背景窗体的子窗体在关闭时由于有动画 清晰的看到 文字后消失...
我所有其他交互内容 也在 文字窗体上这样同时也导致 鼠标点击在图片背景上 发出 父窗口被锁定时的那种提示声。。。
为了避免 文字后消失 我用guictrlsetstate让他先消失了...
谢谢afan~~~~

ATHSJF 发表于 2012-11-23 23:13:38

回复 10# afan


   @ afan不好意思 又要麻烦您啦
   我发现两个窗体的文字颜色有很大的区别处于变化的标签那一层的文字总是带一层黑色的边
就好像颜料被染黑了一般


尤其是用浅色的颜色

这个能否去除呢实在不行也没关系啦   已经很好看啦呵呵~~~

afan 发表于 2012-11-23 23:20:33

回复afan


   @ afan不好意思 又要麻烦您啦
   我发现两个窗体的文字颜色有很大的区别处于变化 ...
ATHSJF 发表于 2012-11-23 23:13 http://www.autoitx.com/images/common/back.gif


    那个是透明滤色的颜色,如果你的字体颜色较浅,那么底色也可以设置浅一点,以下两行同时设置
GUISetBkColor(0x888888, $hCGui)
...
_API_SetLayeredWindowAttributes($hCGui, 0x888888, 200)

ATHSJF 发表于 2012-11-23 23:44:07

回复 13# afan


    谢谢您~`我再好好研究一下没有您的帮助 我是完不成这个的 呵呵~

tiger_47 发表于 2012-11-24 10:58:54

好程式,值得收藏!{:face (88):}
页: [1] 2
查看完整版本: [已解决]请问有图片背景时周期性更新标签内容怎么才能不闪?