找回密码
 加入
搜索
查看: 6347|回复: 14

[GUI管理] 窗口动画影响GDI显示,求教!【已解决】

 火.. [复制链接]
发表于 2012-8-8 13:29:17 | 显示全部楼层 |阅读模式
本帖最后由 xiehuahere 于 2012-8-13 11:13 编辑

不罗嗦,直接上代码示例:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>

Global Const $GUI_EN_ANI_FROM_TOP = 0x40004

Local Const $SW = @DesktopWidth
Local Const $SH = @DesktopHeight
Local $png = @ScriptDir & '\au3logo.png'
Local $pngW, $pngH

InetGet("http://www.autoitscript.com/site/wp-content/themes/TheCorporation/images/logo.png", $png, 1)

$MGUI = GUICreate("", $SW, $SH, 0, 0, $WS_POPUP, $WS_EX_TOPMOST)
GUISetBkColor(0x000000, $MGUI)
; Load PNG image
_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($MGUI)
$hImage = _GDIPlus_ImageLoadFromFile($png)
$pngW = _GDIPlus_ImageGetWidth($hImage)
$pngH = _GDIPlus_ImageGetHeight($hImage)
GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")
;GUISetState()
_GUIEnhanceAnimateWin($MGUI, 1500, $GUI_EN_ANI_FROM_TOP)

HotKeySet("{ESC}", "_Exit")
While 1
        Sleep(100)
WEnd

Func MY_WM_PAINT($hWnd, $msg, $wParam, $lParam)
    #forceref $hWnd, $Msg, $wParam, $lParam
    _WinAPI_RedrawWindow($MGUI, 0, 0, $RDW_UPDATENOW)
        _GDIPlus_GraphicsDrawImage($hGraphic, $hImage, ($SW-$pngW)/2, ($SH-$pngH)/2)
    _WinAPI_RedrawWindow($MGUI, 0, 0, $RDW_VALIDATE)
    Return $GUI_RUNDEFMSG
EndFunc                ;==>MY_WM_PAINT

Func _GUIEnhanceAnimateWin($hWnd, $iTimeMs, $iType)
        Local $aRet = DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $hWnd, "int", $iTimeMs, "long", $iType)
        If $aRet[0] = 0 Then Return SetError(1, 0, 0)
        Return 1
EndFunc   ;==>_GUIEnhanceAnimateWin

Func _Exit()
        Exit
EndFunc        ;==>_Exit
问题:图片无法正常显示出来。
但去除窗口动画,即放开23行的GUISetState(),并将其下面一句注释掉,则没有任何问题,图片能正常显示。
求教~~
 楼主| 发表于 2012-8-8 18:08:53 | 显示全部楼层
本帖最后由 xiehuahere 于 2012-8-8 18:16 编辑

自己顶。。。
如果不能解决,我在想有没有迂回的办法。比如给窗口做个帘子,用拉帘子的方法:
创建GUI前先 _ScreenCapture_Capture(@ScriptDir & '\desktop.bmp', 0, 0, $SW, $SH, False) 把桌面截个屏当帘子用。
用 GUISetState() 显示出窗口后,遮帘子,然后慢慢拉低直至全部显露。
拉帘子的代码如下,但不知道为何就不显示呢? 晕了。。。GDI真的很难学,做个动画效果不容易啊不容易,不容易啊不容易。。。
For $height = $SH To 0 Step -1
        ; Draw bitmap to GUI
        $hBMP = _GDIPlus_BitmapCloneArea(@ScriptDir & '\desktop.bmp', 0, $SH - $height, $SW, $height)
        $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBMP)
        _GDIPlus_GraphicsDrawImage($hGraphic, $hBitmap, 0, $SH - $height)
Next

评分

参与人数 1金钱 +1 收起 理由
lpxx + 1

查看全部评分

发表于 2012-8-8 21:18:20 | 显示全部楼层
GDI真的是一窍不通啊,也想学习一下!
发表于 2012-8-9 02:58:18 | 显示全部楼层
本帖最后由 netegg 于 2012-8-9 03:00 编辑

lz 如果用gdi操作动画图像就不要用api,用api就不要用gdi,gdi操作的不是界面而是图像所处的环境,api操作的广义界面元素
或者通过把界面句柄转换为场景句柄进行操作
发表于 2012-8-9 08:06:41 | 显示全部楼层
不错,当屏保算了
发表于 2012-8-9 17:31:40 | 显示全部楼层
本帖最后由 happytc 于 2012-8-9 18:40 编辑
lz 如果用gdi操作动画图像就不要用api,用api就不要用gdi,gdi操作的不是界面而是图像所处的环境,api操作的 ...
netegg 发表于 2012-8-9 02:58


这是什么道理呀?不明白!

我是被楼主的红色标题给吸过来的。接着又看见楼主发了源码,一般有源码的问题帖我都喜欢回
看看我写的代码能不能达到你的要求


#include <GDIPlus.au3>
#include <GDIP.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPIEx.au3>

Local Const $STM_SETIMAGE = 0x0172
Local $hImage, $iWidth, $iHeight, $hContext, $hBmp, $hGui, $hPic

_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\au3logo.png")
$iWidth = _GDIPlus_ImageGetWidth($hImage)
$iHeight = _GDIPlus_ImageGetHeight($hImage)
$hBitmap = _GDIPlus_BitmapCreateFromScan0(@DesktopWidth, @DesktopHeight)
$hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap)
_GDIPlus_GraphicsDrawImage($hContext, $hImage, (@DesktopWidth - $iWidth) / 2, (@DesktopHeight - $iHeight) / 2)
$hBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_GraphicsDispose($hContext)

$hGui = GUICreate("", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, $WS_EX_TOOLWINDOW)
GUISetBkColor(0x000000, $hGui)
$hPic = GUICtrlCreatePic("", 0, 0, $iWidth, $iHeight)
GUICtrlSetState($hPic, $GUI_DISABLE)
GUICtrlSendMsg($hPic, $STM_SETIMAGE, 0, $hBmp)
_WinAPI_DeleteObject($hPic)
_WinAPI_DeleteObject($hBmp)
_GDIPlus_Shutdown()
GUISetState(@SW_HIDE, $hGui)
_WinAPI_AnimateWindow($hGui, 0x40004, 1500)
_WinAPI_SetForegroundWindow($hGui)
While True
        If GUIGetMsg() == -3 Then ExitLoop
WEnd

评分

参与人数 1金钱 +40 收起 理由
xiehuahere + 40 很棒,works!

查看全部评分

发表于 2012-8-9 18:39:37 | 显示全部楼层
回复 7# happytc
这样不还是用api操作界面,gdi操作图像吗,按我的理解,lz似乎想直接用gdi操作界面
发表于 2012-8-9 18:47:03 | 显示全部楼层
回复 8# netegg


    其实不用gdi+,完全用api也可以的。我只是按照楼主的思路和所用方法写了下。

当然,所谓的api,其实也是调用gdi,仅仅不是gdi+而已。反之,也可以完全用gdi+操作图像和所谓的界面(其实在gdi+里,只是Graphics而已)

也就是达到楼主的要求,三种方法都很容易:纯api,纯gdi+,api和gdi+混合。
发表于 2012-8-9 18:51:29 | 显示全部楼层
回复 9# happytc
这倒是
 楼主| 发表于 2012-8-9 19:25:39 | 显示全部楼层
回复 7# happytc

终于有高人站出来了,没白费我仅存的一张变色卡啊~
家里没环境,明天到公司去验证。先谢过!

又是GDIP.au3又是GDIPlus.au3的,挺复杂。
再看9#,水真深。。。别把新人吓着了
发表于 2012-8-9 20:20:29 | 显示全部楼层
本帖最后由 happytc 于 2012-8-9 20:23 编辑
回复  happytc

终于有高人站出来了,没白费我仅存的一张变色卡啊~
家里没环境,明天到公司去验证。先谢 ...
xiehuahere 发表于 2012-8-9 19:25


又是GDIP.au3又是GDIPlus.au3的,挺复杂。
再看9#,水真深。。。别把新人吓着了

你不想include这两个,你可以象你在一楼那样,所有的,都用DLLCALL嘛

话说你的变色卡道具,是怎么得到的?偶尔看到一些人发的帖是非黑色的标题,我还以为是版主看到所发问题深刻,特意变色的呢
发表于 2012-8-9 20:31:54 | 显示全部楼层
回复 7# happytc


    #include <GDIP.au3>
在哪里有下载?
发表于 2012-8-9 20:57:43 | 显示全部楼层
回复 13# gzh888666

就是有的写着是GDIPlusEx.au3

但写这个UDF的人定义的是GDIP.au3
本论坛就有下载的,你没有搜吧:http://www.autoitx.com/forum.php ... highlight=gdiplusex
 楼主| 发表于 2012-8-9 21:40:18 | 显示全部楼层
本帖最后由 xiehuahere 于 2012-8-9 21:44 编辑

回复 11# happytc

非常好,就是要这个效果!
   
想起明天下午部门要出去旅游了,还是把环境搞好测试了一把。
从变量定义都看出你的专业严谨:$iWidth,$iHeight,i开头表示为整数。
  
变色卡好像是可以花论坛金币在道具商店购买的,就是一道具,用后24小时有效。很久以前买的啦,想着有朝一日会用到,都快忘记它的存在了。

我的原代码里面其实不光是图片,还包括gif动画(loading)和文字等,是个全屏的启动界面。
让我再理解一下,梳理一下,GUICtrlSendMsg没用过,还有窗口扩展风格为什么要用 $WS_EX_TOOLWINDOW。

总之,等我下周一旅游回来再结贴吧。恕我动作慢点,呵呵~
 楼主| 发表于 2012-8-13 11:12:19 | 显示全部楼层
本帖最后由 xiehuahere 于 2012-8-13 11:14 编辑

主要是在创建Graphics对象句柄时有不同:
我是通过 _GDIPlus_GraphicsCreateFromHWND 从窗口句柄创建的,这样需要重绘。
而happytc是从BMP图片对象句柄创建的,能做到独立于窗口界面。
一定要转为BMP图像吗。。。

至于窗口扩展风格,还是得用$WS_EX_TOPMOST,否则按ctrl+D会有问题。
虽然还有很多不明白的地方,但暂时也不知道从何问起,因为帮助里GDI+相关的例子都还没怎么看。
结贴。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-2 23:35 , Processed in 0.093160 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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