找回密码
 加入
搜索
查看: 20516|回复: 42

[AU3基础] SetBitmap这个函数该如何理解?函数已经列出!(已解决)

 火... [复制链接]
发表于 2010-8-23 11:51:40 | 显示全部楼层 |阅读模式
本帖最后由 yiruirui 于 2010-8-30 09:13 编辑

http://www.autoitx.com/forum.php ... hlight=%CD%B8%C3%F7
这个里面的内容相信大家应该都看过,小弟也下载了源代码,但是里面有个函数看不太懂,在此把问题提出来,希望能理解的高手们帮帮小弟和一些不知道的人吧!

Func SetBitmap($hGUI, $hImage, $iOpacity)
        Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend
        $hScrDC = _WinAPI_GetDC(0)
        $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
        $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
        $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
        $tSize = DllStructCreate($tagSIZE)
        $pSize = DllStructGetPtr($tSize)
        DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
        DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
        $tSource = DllStructCreate($tagPOINT)
        $pSource = DllStructGetPtr($tSource)
        $tBlend = DllStructCreate($tagBLENDFUNCTION)
        $pBlend = DllStructGetPtr($tBlend)
        DllStructSetData($tBlend, "Alpha", $iOpacity)
        DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
        _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
        _WinAPI_ReleaseDC(0, $hScrDC)
        _WinAPI_SelectObject($hMemDC, $hOld)
        _WinAPI_DeleteObject($hBitmap)
        _WinAPI_DeleteDC($hMemDC)
EndFunc   ;==>SetBitmap

字面意思是设置图片,调用形式如下(大家看看源代码,里面有的):
Case 0 ;如果没有按下按钮
                                                                        If $LabelArray[$i][1] <> 1 Then
                                                                                $LabelArray[$i][1] = 1 ;状态 = over
                                                                                SetBitmap($GUI, $Over[$i], 255)
                                                                        EndIf
                                                                Case 1 ;如果按下按钮
                                                                        If $LabelArray[$i][1] <> 2 Then
                                                                                $LabelArray[$i][1] = 2 ;状态 = pressed
                                                                                SetBitmap($GUI, $Pressed[$i], 255)
                                                                        EndIf
好了,求高手的分析,多谢!
 楼主| 发表于 2010-8-23 13:46:38 | 显示全部楼层
本帖最后由 yiruirui 于 2010-8-23 20:05 编辑

请大家帮忙!先说谢谢!礼多人不怪嘛!
发表于 2010-8-23 17:23:21 | 显示全部楼层
知道也不告诉你 我还想回来着

回答不是义务 交流是兴趣 不要搞混了
发表于 2010-8-23 17:53:23 | 显示全部楼层
如果LZ能在多一點耐心、少一點脾氣

可能效果會更好

這裡是個論壇,並不是你的小王國

回答不是義務 交流是興趣



修養自身做起,學習從頭學起
 楼主| 发表于 2010-8-24 09:21:19 | 显示全部楼层
回复 4# xjdjpbp


    多谢多谢!平静下来!一定要冷静!
 楼主| 发表于 2010-8-24 09:22:57 | 显示全部楼层
回复 3# rolaka


    刚开始,冲动了。非常渴望看到你回答的第2句话究竟是什么内容,渴望得到你的帮助!
发表于 2010-8-24 12:51:01 | 显示全部楼层
回复 6# yiruirui

不用期待我的回帖,因為我自己也不懂

我不知道你是winapi函式看不懂....還是哪邊看不懂

我把我找到的po給你,你看有沒有用



上面那個連結是ACN之前有人提問過得,不過也是不了了之。

下面那個連結是WINAPI函式查詢,希望對你有幫助

 楼主| 发表于 2010-8-24 12:55:50 | 显示全部楼层
回复 7# xjdjpbp


    3KS all the same!下面的那个链接好像失效了!
发表于 2010-8-24 13:07:53 | 显示全部楼层
回复 8# yiruirui

可能是網路的關係

(那個網站是台灣主機)



ACN高手漢化的WINAPI,你看看
 楼主| 发表于 2010-8-24 13:56:20 | 显示全部楼层
$tSize = DllStructCreate($tagSIZE) 这个就看不懂了,tagsize这个变量前面也没定义,直接就跑出来,就算形成了新的结构体,谁也不知道里面包含哪些元素,是不?汗!
发表于 2010-8-24 13:58:31 | 显示全部楼层
$tagSIZE 是个常量 = "int X;int Y"
 楼主| 发表于 2010-8-24 14:16:59 | 显示全部楼层
回复 11# afan


    首先感谢A版,请问$tagPOINT,$tagBLENDFUNCTION, 也是常量?那分别代表什么东西呢?
发表于 2010-8-24 14:21:49 | 显示全部楼层
回复 12# yiruirui


都是常量,可以在帮助文档中找到定义
$tagPOINT = "int X;int Y" 定义点的 X 和 Y 坐标
$tagBLENDFUNCTION = "byte Op;byte Flags;byte Alpha;byte Format" 控制源位图到目标位图的混合
发表于 2010-8-24 16:10:11 | 显示全部楼层
本帖最后由 rolaka 于 2010-8-24 16:11 编辑

oh 我鸭梨好大 我觉得这是没有教养的表现 渣滓

本帖子中包含更多资源

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

×
发表于 2010-8-24 16:42:48 | 显示全部楼层
本帖最后由 rolaka 于 2010-8-24 16:46 编辑
Func SetBitmap($hGUI, $hImage, $iOpacity)
        Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend
        ;调用GetDC 返回一个桌面的dc句柄
        $hScrDC = _WinAPI_GetDC(0)
        ;获取一个与窗口对应dc句柄
        $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
        ;获取一个png文件的位图句柄
        $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
        ;选择/保存 $hBitmap为使用在$hMemDC上的对象
        $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
        ;创建两个用于传参的Struct结构 ($tagSIZE与$tSIZE)
        $tSize = DllStructCreate($tagSIZE)
        $pSize = DllStructGetPtr($tSize)
        ;设置参数
        DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
        DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
        $tSource = DllStructCreate($tagPOINT)
        $pSource = DllStructGetPtr($tSource)
        $tBlend = DllStructCreate($tagBLENDFUNCTION)
        $pBlend = DllStructGetPtr($tBlend)
        DllStructSetData($tBlend, "Alpha", $iOpacity)
        DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
        ;更新$hGUI 相当于绘图操作
        _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
        ;释放ReleaseDC句柄
        _WinAPI_ReleaseDC(0, $hScrDC)
        ;恢复_WinAPI_SelectObject($hMemDC, $hBitmap)的修改
        _WinAPI_SelectObject($hMemDC, $hOld)
        ;删除$hBitmap句柄
        _WinAPI_DeleteObject($hBitmap)
        ;删除$hMemDC句柄
        _WinAPI_DeleteDC($hMemDC)
EndFunc   ;==>SetBitmap
msdn上资料有点少 参照了http://support.microsoft.com/kb/77060/en-us/的官方介绍

通过dc内存缓冲区来绘图 大概就这么个意思

如果有错误希望能够指证...

如果lz觉得你的问题解决了 就请实现你的诺言 要你换mj我也没办法 我只能告诉你自重

评分

参与人数 2威望 +2 金钱 +80 收起 理由
水木子 + 50 呵呵!说什么好呢!
afan + 2 + 30

查看全部评分

您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-16 20:24 , Processed in 0.087212 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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