找回密码
 加入
搜索
查看: 16082|回复: 21

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

 火.. [复制链接]
发表于 2012-11-19 22:44:09 | 显示全部楼层 |阅读模式
本帖最后由 ATHSJF 于 2012-11-28 19:05 编辑

请问有图片背景时周期性更新标签内容怎么才能不闪?
其实就是更新一个倒计时
我的代码在比对从ini中读取的数组中的一组时间和当前的时间
$thour=_DateDiff ('h',_NowCalc(),_NowCalcDate()&" "&$tmparray[1][1]&":"&$tmparray[2][1]&":00")
$tmin=_DateDiff ('n',_NowCalc(),_NowCalcDate()&" "&$tmparray[1][1]&":"&$tmparray[2][1]&":00")-(60*$thour)
$tmm=_DateDiff ('s',_NowCalc(),_NowCalcDate()&" "&$tmparray[1][1]&":"&$tmparray[2][1]&":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)
此法依旧闪...


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

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


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2012-11-19 23:40:21 | 显示全部楼层
用 GDI+ 绘制。
或者用 $WS_EX_LAYERED 分层窗口的形式,图片在底层,文本在上层

评分

参与人数 1金钱 +10 收起 理由
ATHSJF + 10 谢谢您

查看全部评分

 楼主| 发表于 2012-11-20 00:13:47 | 显示全部楼层
回复 2# afan

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

评分

参与人数 1金钱 +10 收起 理由
ATHSJF + 10 谢谢您!

查看全部评分

发表于 2012-11-20 10:28:24 | 显示全部楼层
GDI 绘制主要包括以下步骤,可自行查阅帮助练习
_GDIPlus_ImageLoadFromFile() 载入图片
_GDIPlus_GraphicsDrawStringEx() 绘制文本
GUICreate() 创建带 $WS_EX_LAYERED 扩展样式窗口
_WinAPI_UpdateLayeredWindow() 将变化的数据实时更新窗口

评分

参与人数 1金钱 +10 收起 理由
annybaby + 10 感谢分享~~

查看全部评分

发表于 2012-11-20 15:52:33 | 显示全部楼层
前来学习...
很好的例子,值得收藏
 楼主| 发表于 2012-11-20 16:16:25 | 显示全部楼层
本帖最后由 ATHSJF 于 2012-11-20 16:22 编辑

回复 4# afan


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

您的代码在我的os中运行正常 没有闪的情况 正在尝试将您的代码运用到我自己的代码中  
发表于 2012-11-20 16:41:51 | 显示全部楼层
确实是很经典的例子,收藏备用。
 楼主| 发表于 2012-11-22 23:26:54 | 显示全部楼层
回复 4# afan


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


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



    去掉 $hGui 的 $WS_EX_LAYERED 扩展样式试试
 楼主| 发表于 2012-11-23 00:21:09 | 显示全部楼层
回复 10# afan


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

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


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


尤其是用浅色的颜色

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2012-11-23 23:20:33 | 显示全部楼层
回复  afan


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



    那个是透明滤色的颜色,如果你的字体颜色较浅,那么底色也可以设置浅一点,以下两行同时设置
GUISetBkColor(0x888888, $hCGui)
...
_API_SetLayeredWindowAttributes($hCGui, 0x888888, 200)
 楼主| 发表于 2012-11-23 23:44:07 | 显示全部楼层
回复 13# afan


    谢谢您~`我再好好研究一下  没有您的帮助 我是完不成这个的 呵呵~
发表于 2012-11-24 10:58:54 | 显示全部楼层
好程式,值得收藏!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-17 04:28 , Processed in 0.097877 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表