yiruirui 发表于 2010-8-23 11:51:40

SetBitmap这个函数该如何理解?函数已经列出!(已解决)

本帖最后由 yiruirui 于 2010-8-30 09:13 编辑

http://www.autoitx.com/forum.php?mod=viewthread&tid=13262&highlight=%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 Then
                                                                                $LabelArray[$i] = 1 ;状态 = over
                                                                                SetBitmap($GUI, $Over[$i], 255)
                                                                        EndIf
                                                                Case 1 ;如果按下按钮
                                                                        If $LabelArray[$i] <> 2 Then
                                                                                $LabelArray[$i] = 2 ;状态 = pressed
                                                                                SetBitmap($GUI, $Pressed[$i], 255)
                                                                        EndIf
好了,求高手的分析,多谢!

yiruirui 发表于 2010-8-23 13:46:38

本帖最后由 yiruirui 于 2010-8-23 20:05 编辑

请大家帮忙!先说谢谢!礼多人不怪嘛!

rolaka 发表于 2010-8-23 17:23:21

知道也不告诉你 我还想回来着

回答不是义务 交流是兴趣 不要搞混了

xjdjpbp 发表于 2010-8-23 17:53:23

如果LZ能在多一點耐心、少一點脾氣

可能效果會更好

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

回答不是義務 交流是興趣

http://www.autoitx.com/forum.php?mod=redirect&goto=findpost&ptid=17822&pid=198190&fromuid=7640437

修養自身做起,學習從頭學起

yiruirui 发表于 2010-8-24 09:21:19

回复 4# xjdjpbp


    多谢多谢!平静下来!一定要冷静!

yiruirui 发表于 2010-8-24 09:22:57

回复 3# rolaka


    刚开始,冲动了。非常渴望看到你回答的第2句话究竟是什么内容,渴望得到你的帮助!

xjdjpbp 发表于 2010-8-24 12:51:01

回复 6# yiruirui

不用期待我的回帖,因為我自己也不懂{:1_428:}

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

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

http://www.autoitx.com/forum.php?mod=viewthread&tid=2452

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

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

http://tlcheng.twbbs.org/TLCheng/WinAPI/winapi.asp

yiruirui 发表于 2010-8-24 12:55:50

回复 7# xjdjpbp


    3KS all the same!下面的那个链接好像失效了!

xjdjpbp 发表于 2010-8-24 13:07:53

回复 8# yiruirui

可能是網路的關係

(那個網站是台灣主機)

http://www.autoitx.com/forum.php?mod=viewthread&tid=15708&highlight=winapi

ACN高手漢化的WINAPI,你看看

yiruirui 发表于 2010-8-24 13:56:20

$tSize = DllStructCreate($tagSIZE) 这个就看不懂了,tagsize这个变量前面也没定义,直接就跑出来,就算形成了新的结构体,谁也不知道里面包含哪些元素,是不?汗!

afan 发表于 2010-8-24 13:58:31

$tagSIZE 是个常量 = "int X;int Y"

yiruirui 发表于 2010-8-24 14:16:59

回复 11# afan


    首先感谢A版,请问$tagPOINT,$tagBLENDFUNCTION, 也是常量?那分别代表什么东西呢?

afan 发表于 2010-8-24 14:21:49

回复 12# yiruirui


都是常量,可以在帮助文档中找到定义
$tagPOINT = "int X;int Y" 定义点的 X 和 Y 坐标
$tagBLENDFUNCTION = "byte Op;byte Flags;byte Alpha;byte Format" 控制源位图到目标位图的混合

rolaka 发表于 2010-8-24 16:10:11

本帖最后由 rolaka 于 2010-8-24 16:11 编辑

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

rolaka 发表于 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我也没办法 我只能告诉你自重
页: [1] 2 3
查看完整版本: SetBitmap这个函数该如何理解?函数已经列出!(已解决)