找回密码
 加入
搜索
查看: 11023|回复: 43

[GUI管理] 纯png背景和按钮界面,如何再添加按钮和更改按钮尺寸和添加鼠标动作?

 火..   [复制链接]
发表于 2018-4-24 18:23:28 | 显示全部楼层 |阅读模式
个人比较喜欢图片做的GUI,经搜索发现论坛有发哥从英文论坛转帖的png按钮实例,

编译环境是自由天空au3最新版

原贴链接
http://www.autoit3.cn/forum.php? ... =png%2B%B0%B4%C5%A5http://www.autoit3.cn/forum.php? ... =png%2B%B0%B4%C5%A5
我常识着做一个有6个不同大小的png按钮,依据发哥的转帖做界面,琢磨了好久遇到困难始终无法解决,只能向论坛长老和大神求教

想做的png演示界面

请教的问题:
一,要添加6个或者更多不同大小的png按钮,但是依据原始贴我只能添加3个按钮并且按钮都不执行鼠标动作(就是按下或者按上图片不变化,也没有执行动作)
二,原始帖子中图片按钮是用i定义的,执行动作时用的case 0 ,case 1这种,如何写成case 按钮1,case按钮2这种?

我做的源码
;发哥原贴地址链接http://www.autoit3.cn/forum.php?mod=viewthread&tid=27066&highlight=png%2B%B0%B4%C5%A5
 
#include <WinAPI.au3>
#include <GDIPlus.au3>
 #include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>



 
 
Opt("TrayAutoPause", 0)
OnAutoItExitRegister("DisposeAll")
 
_GDIPlus_Startup()
 
 
;Global $GT = "GUI Title", $ImgA[3],$ImgA1[3],$ImgA2[3], $PosA[7][2], $Tab[5], $TabA[5][3], $But[3], $ButA[3][3], $TabNum = 4 
Global $GT = "    PNG图片按钮示例", $ImgA[4],  $ImgA1[4],$ImgA2[4],$PosA[7][2], $Tab[5], $TabA[5][3], $But[4], $ButA[4][4], $TabNum = 4
 ;定义界面大小
$width77 =799
$height77 = 407
 ;定义界面大小
;AAA第一个图片按钮
$ImgA[0] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu1a.png")
$ImgA[1] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\annniu1b.png")
$ImgA[2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu1a.png")
;AAA第一个图片按钮

;AAA第个二图片按钮
$ImgA1[0] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu2a.png")
$ImgA1[1] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu2b.png")
$ImgA1[2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu2a.png")
;AAA第个二图片按钮


;AAA第个三图片按钮
$ImgA2[0] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu3a.png")
$ImgA2[1] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu3b.png")
$ImgA2[2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu3a.png")
;AAA第个三图片按钮


;AAA第个三图片按钮
;第四个按钮我怎么也就添加不上去了


;AAA这是设限第一层背景图片
Local $Img1 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\bg.png")
;AAA这是设限第一层背景图片


;AAA这是设限第二层背景图片
Local $Img2 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\bg1.png")
 ;AAA这是设限第二层背景图片
 
 
; main GUI with title
Global $USWin = GUICreate($GT,  $width77, $height77, (@DesktopWidth-$width77)/2,(@DesktopHeight-$height77)/2, 0x80000000, BitOR(0x00080000, 0x00000008));, 0x80)
Local $hGraphic1a = _GDIPlus_GraphicsCreateFromHWND(_WinAPI_GetDesktopWindow())
Local $hBitmapa = _GDIPlus_BitmapCreateFromGraphics(799, 407, $hGraphic1a);这是设置界面背景的地方
Local $hGraphic2a = _GDIPlus_ImageGetGraphicsContext($hBitmapa)

;这是设置第一层背景的地方
_GDIPlus_GraphicsDrawImageRect($hGraphic2a, $Img1,0, 0, 799, 407)
;这是设置第一层背景的地方

;这是设置第二层背景的地方
_GDIPlus_GraphicsDrawImageRect($hGraphic2a, $Img2,0, 0, 799, 407)
;这是设置第二层背景的地方

_GDIPlus_GraphicsDrawString_($hGraphic2a, $GT, 0, 11, "Comic Sans MS", 12)
_GDIPlus_GraphicsDispose($hGraphic2a)
_GDIPlus_GraphicsDispose($hGraphic1a)
SetBitmap($USWin, $hBitmapa, 255)
_GDIPlus_GraphicsDispose($hBitmapa)
_GDIPlus_ImageDispose($Img1)
_GDIPlus_ImageDispose($Img2)
 






$PosA[4][0] = GUICtrlCreateLabel("", 0, 198, 157, 30)
$PosA[$TabNum + 1][0] = GUICtrlCreateLabel("", 137, 402, 160, 35); save button
$PosA[$TabNum + 2][0] = GUICtrlCreateLabel("", 317, 402, 160, 35); close button




 For $i = 1 To $TabNum + 2

        $PosA[$i][1] = 0
next

; 第一个按钮的位置设置  (310, 175,是设置位置的,前两个数值不知道是干什么用的)
$But[1] = GUICreate($GT, 245, 38, 342, 175, 0x80000000, BitOR(0x00080000, 0x00000008, 0x00000040, 0x08000000), $USWin)
DrawImg($ButA, 1, $ImgA, "这是第一个按钮", 10, 4, "Comic Sans MS", 11)
SetBitmap($But[1], $ButA[1][0], 255)
 ; 第一个按钮的位置设置
 

; 第二个按钮的位置设置  (文字提示的长度我不知道从哪里更改)
$But[2] = GUICreate($GT, 345, 38, 455, 125, 0x80000000, BitOR(0x00080000, 0x00000008, 0x00000040, 0x08000000), $USWin)
DrawImg($ButA, 2, $ImgA1, "这是第二个按钮", 10, 4, "Comic Sans MS", 11)
SetBitmap($But[2], $ButA[2][0], 255)
; 第二个按钮的位置设置  
 
; 第三个按钮的位置设置  
$But[3] = GUICreate($GT, 645, 38, 628, 75, 0x80000000, BitOR(0x00080000, 0x00000008, 0x00000040, 0x08000000), $USWin)
DrawImg($ButA, 3, $ImgA2, "这是第三个按钮", 10, 4, "Comic Sans MS", 11)
SetBitmap($But[3], $ButA[3][0], 255)
; 第三个按钮的位置设置  
 
 

 
 
 
; release loaded images
_GDIPlus_ImageDispose($ImgA[0])
_GDIPlus_ImageDispose($ImgA[1])
_GDIPlus_ImageDispose($ImgA[2])
_GDIPlus_ImageDispose($ImgA[3])

 
; tab controls GUI
$AGUI_Text = GUICreate($GT, 528, 440, 0, 0, 0x80000000, BitOR(0x00080000, 0x00000040), $USWin)
GUISetBkColor(0x003842, $AGUI_Text)
GUICtrlCreateLabel("", 160, 60, 335, 325); label used to hide tab control
GUICtrlSetBkColor(-1, -2)
$TabC = GUICtrlCreateTab(160, 60, 335, 325, -1, 0x00100000)



_WinAPI_SetLayeredWindowAttributes($AGUI_Text, 0x003842, 255)
 
; show all GUIs - kind of like an animation effect
GUISetState(@SW_SHOW, $USWin)
For $i = 1 To $TabNum
        GUISetState(@SW_SHOW, $Tab[$i])
Next
GUISetState(@SW_SHOW, $But[1])
GUISetState(@SW_SHOW, $But[2])
GUISetState(@SW_SHOW, $But[3])
GUISetState(@SW_SHOW, $AGUI_Text)
 
; set the first tab button as pressed
$curr = 1
;$prev = 0
 
While 1
        For $i = 1 To $TabNum + 2; 4 tabs + 2 buttons
                Switch $i
                        Case 1 To $TabNum; tab buttons - 2-state
                                If $curr = $i Then ContinueLoop; don't check the state of the current tab
                                $pos = GUIGetCursorInfo($USWin)
                                If $pos[4] = $PosA[$i][0] Then
                                        If $pos[3] = 1 Then ExitLoop
                                        If $pos[2] = 1 Then ExitLoop
                                        While $pos[4] = $PosA[$i][0]
                                                If GUIGetMsg() = -3 Then Exit
                                                $pos = GUIGetCursorInfo($USWin)
                                                Switch $pos[2]
                                                        Case 0; not pressed
                                                                If $PosA[$i][1] <> 1 Then
                                                                        SetBitmap($Tab[$i], $TabA[$i][1], 255)
                                                                        $PosA[$i][1] = 1
                                                                EndIf
                                                        Case 1; pressed - change tab
                                                                If $PosA[$i][1] <> 2 Then
                                                                        SetBitmap($Tab[$curr], $TabA[$curr][0], 255)
                                                                        SetBitmap($Tab[$i], $TabA[$i][2], 255)
                                                                        GUICtrlSendMsg($TabC, 0x1300 + 48, $i - 1, 0)
                                                                        $PosA[$i][1] = 2
                                                                        ;$prev = $curr
                                                                        $curr = $i
                                                                        ExitLoop
                                                                EndIf
                                                EndSwitch
                                                Sleep(10)
                                        WEnd
                                        If $curr <> $i Then SetBitmap($Tab[$i], $TabA[$i][0], 255)
                                        $PosA[$i][1] = 0
                                EndIf
                        Case Else; save and close buttons - 3-state
                                $pos = GUIGetCursorInfo($USWin)
                                If $pos[4] = $PosA[$i][0] Then
                                        If $pos[3] = 1 Then ExitLoop
                                        If $pos[2] = 1 Then ExitLoop
                                        While $pos[4] = $PosA[$i][0]
                                                $pos = GUIGetCursorInfo($USWin)
                                                Switch $pos[2]
                                                        Case 0; not pressed
                                                                If $PosA[$i][1] <> 1 Then
                                                                        SetBitmap($But[$i - $TabNum], $ButA[$i - $TabNum][1], 255)
                                                                        $PosA[$i][1] = 1
                                                                EndIf
                                                        Case 1
                                                                While $pos[2] = 1; holding pressed
                                                                        $pos = GUIGetCursorInfo($USWin)
                                                                        Switch $pos[4]
                                                                                Case $PosA[$i][0]; on button, pressed
                                                                                        If $PosA[$i][1] <> 2 Then
                                                                                                SetBitmap($But[$i - $TabNum], $ButA[$i - $TabNum][2], 255)
                                                                                                $PosA[$i][1] = 2
                                                                                        EndIf
                                                                                Case Else; not on button, pressed
                                                                                        If $PosA[$i][1] <> 3 Then
                                                                                                SetBitmap($But[$i - $TabNum], $ButA[$i - $TabNum][1], 255)
                                                                                                $PosA[$i][1] = 3
                                                                                        EndIf
                                                                        EndSwitch
                                                                        Sleep(10)
                                                                WEnd
                                                                If $pos[4] = $PosA[$i][0] Then
                                                                        Switch $i - $TabNum
                                                                                                                                                        Case 1; 第一个按钮动作从这里产生(不知道怎么改成 case $But[1] 执行某一个动作,case $But[2] 执行某一个动作这样子的)
                                                                                                                                                                
                                                                                        MsgBox(0 + 262144, $GT, "Saved")
                                        
                                                                                Case 2; 第二个按钮动作从这里产生
                                                                                        Exit
                                                                        EndSwitch
                                                                EndIf
                                                EndSwitch
                                                Sleep(10)
                                        WEnd
                                        SetBitmap($But[$i - $TabNum], $ButA[$i - $TabNum][0], 255)
                                        $PosA[$i][1] = 0
                                EndIf
                EndSwitch
        Next
        Switch GUIGetMsg(); this is for tab controls
                Case -3
                        Exit
                
        EndSwitch
        Sleep(10)
WEnd
 
Func DisposeAll()
      
       
        For $i = 1 To 2
                _GDIPlus_BitmapDispose($ButA[$i][0])
                _GDIPlus_BitmapDispose($ButA[$i][1])
                _GDIPlus_BitmapDispose($ButA[$i][2])
                                 
        Next
EndFunc   ;==>DisposeAll
 
 
 
 
 ;按钮的大小可以从这里设置,但是成统一的大小89*89了
Func DrawImg(ByRef $RetA, $indx, $Imgs, $text, $xx, $yy, $sFont = "Comic Sans MS", $nSize = 10, $ncol = "000000", $iFormat = 0)
        For $i = 0 To 2
                Local $hGraphic1 = _GDIPlus_GraphicsCreateFromHWND(_WinAPI_GetDesktopWindow())
                Local $hBitmap = _GDIPlus_BitmapCreateFromGraphics(89, 89, $hGraphic1)
                Local $hGraphic2 = _GDIPlus_ImageGetGraphicsContext($hBitmap)
                _GDIPlus_GraphicsDrawImageRect($hGraphic2, $Imgs[$i], 0, 0, 89, 89)
                _GDIPlus_GraphicsDrawString_($hGraphic2, $text, $xx, $yy, $sFont, $nSize, $ncol, $iFormat)
                _GDIPlus_GraphicsDispose($hGraphic2)
                _GDIPlus_GraphicsDispose($hGraphic1)
                $RetA[$indx][$i] = $hBitmap
        Next
EndFunc   ;==>DrawImg
 
Func _GDIPlus_GraphicsDrawString_($hGraphics, $sString, $nX, $nY, $sFont = "Comic Sans MS", $nSize = 10, $ncol = "000000", $iFormat = 0)
        If StringLeft($ncol, 2) = "0x" Then $ncol = StringTrimLeft($ncol, 2)
        Local $hBrush = _GDIPlus_BrushCreateSolid("0xFF" & $ncol)
        Local $hFormat = _GDIPlus_StringFormatCreate($iFormat)
        Local $hFamily = _GDIPlus_FontFamilyCreate($sFont)
        Local $hFont = _GDIPlus_FontCreate($hFamily, $nSize)
        Local $tLayout = _GDIPlus_RectFCreate($nX, $nY, 0, 0)
        Local $aInfo = _GDIPlus_GraphicsMeasureString($hGraphics, $sString, $hFont, $tLayout, $hFormat)
        Local $aResult = _GDIPlus_GraphicsDrawStringEx($hGraphics, $sString, $hFont, $aInfo[0], $hFormat, $hBrush)
        Local $iError = @error
        _GDIPlus_FontDispose($hFont)
        _GDIPlus_FontFamilyDispose($hFamily)
        _GDIPlus_StringFormatDispose($hFormat)
        _GDIPlus_BrushDispose($hBrush)
        Return SetError($iError, 0, $aResult)
EndFunc   ;==>_GDIPlus_GraphicsDrawString_




Func SetBitmap($hGUI, $hImage, $iOpacity)
    Local $hScrDC = _WinAPI_GetDC(0)
    Local $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
    Local $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    Local $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    $tSize = DllStructCreate("long X;long Y")
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
    DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
    $tSource = DllStructCreate("long X;long Y")
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate("byte Op;byte Flags;byte Alpha;byte Format")
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", $iOpacity)
    DllStructSetData($tBlend, "Format", 1)
    _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, 0x02)
    _WinAPI_ReleaseDC(0, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC($hMemDC)
EndFunc   ;==>SetBitmap
图片素材和未完工源码压缩包上传,求大神帮忙解决问题。

本帖子中包含更多资源

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

×
发表于 2018-4-24 21:54:25 | 显示全部楼层
回复 1# 沉默的斗鱼

樓主改的有問題................
   
在你的 180 跟 181 中間  加入

ConsoleWrite("這是第"&$i&"個按鈕")

然後 你在 原始 的一樣的位置 加入

ConsoleWrite("這是第"&$i&"個按鈕")

這兩個你執行看看

原始的 第一個按鈕  第二個按鈕 第三個按鈕 第四個按鈕  依序  而且 每個 $I 對應的按鈕都是對的

1 就是 1  2就是2

而你的並不是這樣...............

表示你中間改的有問題
发表于 2018-4-24 22:01:57 | 显示全部楼层
本帖最后由 kk_lee69 于 2018-4-24 22:03 编辑

回复 1# 沉默的斗鱼

; 第一個按鈕的位置設置  (310, 175,是設置位置的,前兩個數值不知道是幹什麼用的)

你真的有認真研究??

GUICreate
創建 GUI 窗口.


GUICreate ( "標題" [, 寬度 [, 高度 [, 左側 [, 頂部 [, 樣式 [, 擴展樣式 [, 父窗]]]]]]] )


手冊上面基礎的 一個函數  你要跟我說 不知道 前兩個位置是幹嘛的??
发表于 2018-4-24 22:25:49 | 显示全部楼层
回复 1# 沉默的斗鱼

把我改的 跟你的圖片放一起  你就可以知道.........

首先 我改了   tab button 1~4 的位置  如果你只改這個位置  那麼你的按鈕功能就會失效

所以你還得改 $PosA[1][0]~ $PosA[4][0] 的位置

那個位置其實它是建立了 四個 空白的 GUICtrlCreateLabel

而 GUICtrlCreateLabel 本身就會響應 點擊事件


#include <WinAPI.au3>
#include <GDIPlus.au3>
 
Opt("TrayAutoPause", 0)
OnAutoItExitRegister("DisposeAll")
 
_GDIPlus_Startup()
 
Global $GT = "GUI Title", $ImgA[3], $PosA[7][2], $Tab[5], $TabA[5][3], $But[3], $ButA[3][3], $TabNum = 4
 
; loading images
$ImgA[0] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu1a.png")
$ImgA[1] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu1b.png")
$ImgA[2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu4a.png")
Local $Img1 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\bg.png")
Local $Img2 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\title_button.png")
 
; main GUI with title
Global $USWin = GUICreate($GT, 528, 440, -1, -1, 0x80000000, BitOR(0x00080000, 0x00000008));, 0x80)
Local $hGraphic1a = _GDIPlus_GraphicsCreateFromHWND(_WinAPI_GetDesktopWindow())
Local $hBitmapa = _GDIPlus_BitmapCreateFromGraphics(528, 440, $hGraphic1a)
Local $hGraphic2a = _GDIPlus_ImageGetGraphicsContext($hBitmapa)
_GDIPlus_GraphicsDrawImageRect($hGraphic2a, $Img1, 88, 0, 440, 440)
_GDIPlus_GraphicsDrawImageRect($hGraphic2a, $Img2, 138, 5, 198, 45)
_GDIPlus_GraphicsDrawString_($hGraphic2a, $GT, 148, 11, "Comic Sans MS", 12)
_GDIPlus_GraphicsDispose($hGraphic2a)
_GDIPlus_GraphicsDispose($hGraphic1a)
SetBitmap($USWin, $hBitmapa, 255)
_GDIPlus_GraphicsDispose($hBitmapa)
_GDIPlus_ImageDispose($Img1)
_GDIPlus_ImageDispose($Img2)
 
; position labels for all buttons
$PosA[1][0] = GUICtrlCreateLabel("",400, 99, 157, 30); tab buttons
$PosA[2][0] = GUICtrlCreateLabel("",300 , 132, 157, 30)
$PosA[3][0] = GUICtrlCreateLabel("",200, 165, 157, 30)
$PosA[4][0] = GUICtrlCreateLabel("",100, 198, 157, 30)
$PosA[$TabNum + 1][0] = GUICtrlCreateLabel("", 137, 402, 160, 35); save button
$PosA[$TabNum + 2][0] = GUICtrlCreateLabel("", 317, 402, 160, 35); close button
For $i = 1 To $TabNum + 2
        $PosA[$i][1] = 0
Next
 
; tab button 1
$Tab[1] = GUICreate($GT, 165, 227, 400, 100, 0x80000000, BitOR(0x00080000, 0x00000008, 0x00000040, 0x08000000), $USWin)
DrawImg($TabA, 1, $ImgA, "Tab 1", 10, 4, "Comic Sans MS", 11)
SetBitmap($Tab[1], $TabA[1][2], 255); set the first tab button as pressed
 
; tab button 2
$Tab[2] = GUICreate($GT, 165, 227, 300, 133, 0x80000000, BitOR(0x00080000, 0x00000008, 0x00000040, 0x08000000), $USWin)
DrawImg($TabA, 2, $ImgA, "Tab 2", 10, 4, "Comic Sans MS", 11)
SetBitmap($Tab[2], $TabA[2][0], 255)
 
; tab button 3
$Tab[3] = GUICreate($GT, 165, 227, 200, 166, 0x80000000, BitOR(0x00080000, 0x00000008, 0x00000040, 0x08000000), $USWin)
DrawImg($TabA, 3, $ImgA, "Tab 3", 10, 4, "Comic Sans MS", 11)
SetBitmap($Tab[3], $TabA[3][0], 255)
 
; tab button 4
$Tab[4] = GUICreate($GT, 165, 227, 100, 199, 0x80000000, BitOR(0x00080000, 0x00000008, 0x00000040, 0x08000000), $USWin)
DrawImg($TabA, 4, $ImgA, "Tab 4", 10, 4, "Comic Sans MS", 11)
SetBitmap($Tab[4], $TabA[4][0], 255)
 
; save button
$But[1] = GUICreate($GT, 345, 38, 138, 405, 0x80000000, BitOR(0x00080000, 0x00000008, 0x00000040, 0x08000000), $USWin)
DrawImg($ButA, 1, $ImgA, "Save", 10, 4, "Comic Sans MS", 11)
SetBitmap($But[1], $ButA[1][0], 255)
 
; close button
$But[2] = GUICreate($GT, 345, 38, 318, 405, 0x80000000, BitOR(0x00080000, 0x00000008, 0x00000040, 0x08000000), $USWin)
DrawImg($ButA, 2, $ImgA, "Close", 10, 4, "Comic Sans MS", 11)
SetBitmap($But[2], $ButA[2][0], 255)
 
; release loaded images
_GDIPlus_ImageDispose($ImgA[0])
_GDIPlus_ImageDispose($ImgA[1])
_GDIPlus_ImageDispose($ImgA[2])
 
; tab controls GUI
$AGUI_Text = GUICreate($GT, 528, 440, 0, 0, 0x80000000, BitOR(0x00080000, 0x00000040), $USWin)
GUISetBkColor(0x003842, $AGUI_Text)
GUICtrlCreateLabel("", 160, 60, 335, 325); label used to hide tab control
GUICtrlSetBkColor(-1, -2)
$TabC = GUICtrlCreateTab(160, 60, 335, 325, -1, 0x00100000)
GUICtrlCreateTabItem("T1")
$1 = GUICtrlCreateButton("Button 1", 200, 100, 100, 25)
GUICtrlSetState(-1, 2048)
GUICtrlCreateTabItem("T2")
$2 = GUICtrlCreateButton("Button 2", 200, 150, 100, 25)
GUICtrlSetState(-1, 2048)
GUICtrlCreateTabItem("T3")
$3 = GUICtrlCreateButton("Button 3", 200, 200, 100, 25)
GUICtrlSetState(-1, 2048)
GUICtrlCreateTabItem("T4")
$4 = GUICtrlCreateButton("Button 4", 200, 250, 100, 25)
GUICtrlSetState(-1, 2048)
GUICtrlCreateTabItem("")
_WinAPI_SetLayeredWindowAttributes($AGUI_Text, 0x003842, 255)
 
; show all GUIs - kind of like an animation effect
GUISetState(@SW_SHOW, $USWin)
For $i = 1 To $TabNum
        GUISetState(@SW_SHOW, $Tab[$i])
Next
GUISetState(@SW_SHOW, $But[1])
GUISetState(@SW_SHOW, $But[2])
GUISetState(@SW_SHOW, $AGUI_Text)
 
; set the first tab button as pressed
$curr = 1
;$prev = 0
 
While 1
        For $i = 1 To $TabNum + 2; 4 tabs + 2 buttons
                Switch $i
                        Case 1 To $TabNum; tab buttons - 2-state
                                If $curr = $i Then ContinueLoop; don't check the state of the current tab
                                $pos = GUIGetCursorInfo($USWin)
                                If $pos[4] = $PosA[$i][0] Then
                                        If $pos[3] = 1 Then ExitLoop
                                        If $pos[2] = 1 Then ExitLoop
                                        While $pos[4] = $PosA[$i][0]
                                                If GUIGetMsg() = -3 Then Exit
                                                $pos = GUIGetCursorInfo($USWin)
                                                Switch $pos[2]
                                                        Case 0; not pressed
                                                                If $PosA[$i][1] <> 1 Then
                                                                        SetBitmap($Tab[$i], $TabA[$i][1], 255)
                                                                        $PosA[$i][1] = 1
                                                                EndIf
                                                        Case 1; pressed - change tab
                                                                If $PosA[$i][1] <> 2 Then
                                                                        SetBitmap($Tab[$curr], $TabA[$curr][0], 255)
                                                                        SetBitmap($Tab[$i], $TabA[$i][2], 255)
                                                                        GUICtrlSendMsg($TabC, 0x1300 + 48, $i - 1, 0)
                                                                        $PosA[$i][1] = 2
                                                                        ;$prev = $curr
                                                                        $curr = $i
                                                                                                                                                ConsoleWrite("這是第"&$i&"個按鈕")
                                                                        ExitLoop
                                                                EndIf
                                                EndSwitch
                                                Sleep(10)
                                        WEnd
                                        If $curr <> $i Then SetBitmap($Tab[$i], $TabA[$i][0], 255)
                                        $PosA[$i][1] = 0
                                EndIf
                        Case Else; save and close buttons - 3-state
                                $pos = GUIGetCursorInfo($USWin)
                                If $pos[4] = $PosA[$i][0] Then
                                        If $pos[3] = 1 Then ExitLoop
                                        If $pos[2] = 1 Then ExitLoop
                                        While $pos[4] = $PosA[$i][0]
                                                $pos = GUIGetCursorInfo($USWin)
                                                Switch $pos[2]
                                                        Case 0; not pressed
                                                                If $PosA[$i][1] <> 1 Then
                                                                        SetBitmap($But[$i - $TabNum], $ButA[$i - $TabNum][1], 255)
                                                                        $PosA[$i][1] = 1
                                                                EndIf
                                                        Case 1
                                                                While $pos[2] = 1; holding pressed
                                                                        $pos = GUIGetCursorInfo($USWin)
                                                                        Switch $pos[4]
                                                                                Case $PosA[$i][0]; on button, pressed
                                                                                        If $PosA[$i][1] <> 2 Then
                                                                                                SetBitmap($But[$i - $TabNum], $ButA[$i - $TabNum][2], 255)
                                                                                                $PosA[$i][1] = 2
                                                                                        EndIf
                                                                                Case Else; not on button, pressed
                                                                                        If $PosA[$i][1] <> 3 Then
                                                                                                SetBitmap($But[$i - $TabNum], $ButA[$i - $TabNum][1], 255)
                                                                                                $PosA[$i][1] = 3
                                                                                        EndIf
                                                                        EndSwitch
                                                                        Sleep(10)
                                                                WEnd
                                                                If $pos[4] = $PosA[$i][0] Then
                                                                        Switch $i - $TabNum
                                                                                Case 1; save button pressed
                                                                                        MsgBox(0 + 262144, $GT, "Saved")
                                                                                Case 2; close button pressed
                                                                                        Exit
                                                                        EndSwitch
                                                                EndIf
                                                EndSwitch
                                                Sleep(10)
                                        WEnd
                                        SetBitmap($But[$i - $TabNum], $ButA[$i - $TabNum][0], 255)
                                        $PosA[$i][1] = 0
                                EndIf
                EndSwitch
        Next
        Switch GUIGetMsg(); this is for tab controls
                Case -3
                        Exit
                Case $1, $2, $3, $4
                        MsgBox(0 + 262144, $GT, "You have pressed a Button")
        EndSwitch
        Sleep(10)
WEnd
 
Func DisposeAll()
        For $i = 1 To $TabNum
                _GDIPlus_BitmapDispose($TabA[$i][0])
                _GDIPlus_BitmapDispose($TabA[$i][1])
                _GDIPlus_BitmapDispose($TabA[$i][2])
        Next
        For $i = 1 To 2
                _GDIPlus_BitmapDispose($ButA[$i][0])
                _GDIPlus_BitmapDispose($ButA[$i][1])
                _GDIPlus_BitmapDispose($ButA[$i][2])
        Next
EndFunc   ;==>DisposeAll
 
Func DrawImg(ByRef $RetA, $indx, $Imgs, $text, $xx, $yy, $sFont = "Comic Sans MS", $nSize = 10, $ncol = "000000", $iFormat = 0)
        For $i = 0 To 2
                Local $hGraphic1 = _GDIPlus_GraphicsCreateFromHWND(_WinAPI_GetDesktopWindow())
                Local $hBitmap = _GDIPlus_BitmapCreateFromGraphics(165, 38, $hGraphic1)
                Local $hGraphic2 = _GDIPlus_ImageGetGraphicsContext($hBitmap)
                _GDIPlus_GraphicsDrawImageRect($hGraphic2, $Imgs[$i], 0, 0, 165, 38)
                _GDIPlus_GraphicsDrawString_($hGraphic2, $text, $xx, $yy, $sFont, $nSize, $ncol, $iFormat)
                _GDIPlus_GraphicsDispose($hGraphic2)
                _GDIPlus_GraphicsDispose($hGraphic1)
                $RetA[$indx][$i] = $hBitmap
        Next
EndFunc   ;==>DrawImg
 
Func _GDIPlus_GraphicsDrawString_($hGraphics, $sString, $nX, $nY, $sFont = "Comic Sans MS", $nSize = 10, $ncol = "000000", $iFormat = 0)
        If StringLeft($ncol, 2) = "0x" Then $ncol = StringTrimLeft($ncol, 2)
        Local $hBrush = _GDIPlus_BrushCreateSolid("0xFF" & $ncol)
        Local $hFormat = _GDIPlus_StringFormatCreate($iFormat)
        Local $hFamily = _GDIPlus_FontFamilyCreate($sFont)
        Local $hFont = _GDIPlus_FontCreate($hFamily, $nSize)
        Local $tLayout = _GDIPlus_RectFCreate($nX, $nY, 0, 0)
        Local $aInfo = _GDIPlus_GraphicsMeasureString($hGraphics, $sString, $hFont, $tLayout, $hFormat)
        Local $aResult = _GDIPlus_GraphicsDrawStringEx($hGraphics, $sString, $hFont, $aInfo[0], $hFormat, $hBrush)
        Local $iError = @error
        _GDIPlus_FontDispose($hFont)
        _GDIPlus_FontFamilyDispose($hFamily)
        _GDIPlus_StringFormatDispose($hFormat)
        _GDIPlus_BrushDispose($hBrush)
        Return SetError($iError, 0, $aResult)
EndFunc   ;==>_GDIPlus_GraphicsDrawString_
 
Func SetBitmap($hGUI, $hImage, $iOpacity)
    Local $hScrDC = _WinAPI_GetDC(0)
    Local $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
    Local $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    Local $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    $tSize = DllStructCreate("long X;long Y")
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
    DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
    $tSource = DllStructCreate("long X;long Y")
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate("byte Op;byte Flags;byte Alpha;byte Format")
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", $iOpacity)
    DllStructSetData($tBlend, "Format", 1)
    _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, 0x02)
    _WinAPI_ReleaseDC(0, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC($hMemDC)
EndFunc   ;==>SetBitmap
 楼主| 发表于 2018-4-24 23:46:23 | 显示全部楼层
回复 4# kk_lee69

谢谢大佬热心,小弟刚看见大佬改的代码,

或许是小弟表述不清楚吧

[img][/img]

这个当然清楚,但是我的意思是它在我改的这个窗体上上不起作用,是靠这个Local $hBitmapa = _GDIPlus_BitmapCreateFromGraphics(799, 407, $hGraphic1a)来定义窗体大小的

此外,我的意思是不需要tab,我是单纯想要6个不同背景和尺寸的png按钮添加动作,如果按照发哥的转帖,我直接把tab和按钮背景换了就行了

按钮大小可以从这里更改,

但是源代码里改成统一大小了,我需要的是按钮1,安按钮2,按钮3尺寸都不一样大。

今晚琢磨着已经把6个按钮(不要tab!!!!)添加上去了,但是按钮和动作无效

按钮无动作,png按钮不能自定义大小,这是现在遇到的问题,我把我今晚改的代码上传,劳烦大神再看一下。

如有表述不妥冒犯之处大神谅解。

下面是把6个按钮图片按钮放上去的代码,
;发哥原贴地址链接http://www.autoit3.cn/forum.php?mod=viewthread&tid=27066&highlight=png%2B%B0%B4%C5%A5


;这是把6个按钮图片按钮放上去的代码,但无法定义每个按钮大小和鼠标动作
 
#include <WinAPI.au3>
#include <GDIPlus.au3>
 #include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>



 
 
Opt("TrayAutoPause", 0)
OnAutoItExitRegister("DisposeAll")
 
_GDIPlus_Startup()
 
 
;Global $GT = "GUI Title", $ImgA[3],$ImgA1[3],$ImgA2[3], $PosA[7][2], $Tab[5], $TabA[5][3], $But[3], $ButA[3][3], $TabNum = 4 
Global $GT = "    PNG图片按钮示例", $ImgA[8],  $ImgA1[8],$ImgA2[8],$ImgA3[8],$ImgA4[8],$ImgA5[8],$PosA[8][2], $Tab[8], $TabA[8][3], $But[8], $ButA[8][8], $TabNum = 4
 ;定义界面大小
$width77 =799
$height77 = 407
 ;定义界面大小
;AAA第一个图片按钮
$ImgA[0] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu1a.png")
$ImgA[1] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\annniu1b.png")
$ImgA[2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu1a.png")
;AAA第一个图片按钮

;AAA第个二图片按钮
$ImgA1[0] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu2a.png")
$ImgA1[1] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu2b.png")
$ImgA1[2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu2a.png")
;AAA第个二图片按钮


;AAA第个三图片按钮
$ImgA2[0] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu3a.png")
$ImgA2[1] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu3b.png")
$ImgA2[2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu3a.png")
;AAA第个三图片按钮


;AAA第个三图片按钮
;第四个按钮我怎么也就添加不上去了
$ImgA3[0] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu4a.png")
$ImgA3[1] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu4b.png")
$ImgA3[2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu4a.png")


;;第四个按钮我怎么也就添加不上去了
$ImgA4[0] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu5a.png")
$ImgA4[1] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu5b.png")
$ImgA4[2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu5a.png")

;;第四个按钮我怎么也就添加不上去了
$ImgA5[0] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu6a.png")
$ImgA5[1] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu6b.png")
$ImgA5[2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu6a.png")

;AAA这是设限第一层背景图片
Local $Img1 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\bg.png")
;AAA这是设限第一层背景图片


;AAA这是设限第二层背景图片
;Local $Img2 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\bg1.png")
 ;AAA这是设限第二层背景图片
 
 
; main GUI with title
Global $USWin = GUICreate($GT,  $width77, $height77, (@DesktopWidth-$width77)/2,(@DesktopHeight-$height77)/2, 0x80000000, BitOR(0x00080000, 0x00000008));, 0x80)
Local $hGraphic1a = _GDIPlus_GraphicsCreateFromHWND(_WinAPI_GetDesktopWindow())
Local $hBitmapa = _GDIPlus_BitmapCreateFromGraphics(799, 407, $hGraphic1a);这是设置界面背景的地方
Local $hGraphic2a = _GDIPlus_ImageGetGraphicsContext($hBitmapa)

;这是设置第一层背景的地方
_GDIPlus_GraphicsDrawImageRect($hGraphic2a, $Img1,0, 0, 799, 407)
;这是设置第一层背景的地方

;这是设置第二层背景的地方
;_GDIPlus_GraphicsDrawImageRect($hGraphic2a, $Img2,0, 0, 799, 407)
;这是设置第二层背景的地方

_GDIPlus_GraphicsDrawString_($hGraphic2a, $GT, 0, 11, "Comic Sans MS", 12)
_GDIPlus_GraphicsDispose($hGraphic2a)
_GDIPlus_GraphicsDispose($hGraphic1a)
SetBitmap($USWin, $hBitmapa, 255)
_GDIPlus_GraphicsDispose($hBitmapa)
_GDIPlus_ImageDispose($Img1)
;_GDIPlus_ImageDispose($Img2)
 






$PosA[6][0] = GUICtrlCreateLabel("", 0, 198, 157, 30)
$PosA[$TabNum + 1][0] = GUICtrlCreateLabel("", 137, 402, 160, 35); save button
$PosA[$TabNum + 2][0] = GUICtrlCreateLabel("", 317, 402, 160, 35); close button
$PosA[$TabNum + 3][0] = GUICtrlCreateLabel("", 517, 402, 160, 35); close button



 For $i = 1 To $TabNum + 2

        $PosA[$i][1] = 8
next

; 第一个按钮的位置设置  (310, 175,是设置位置的,前两个数值不知道是干什么用的)
$But[1] = GUICreate($GT, 245, 38, 312, 125, 0x80000000, BitOR(0x00080000, 0x00000008, 0x00000040, 0x08000000), $USWin)
DrawImg($ButA, 1, $ImgA, "", 10, 4, "Comic Sans MS", 11)
SetBitmap($But[1], $ButA[1][0], 255)
 ; 第一个按钮的位置设置
 

; 第二个按钮的位置设置  (文字提示的长度我不知道从哪里更改)
$But[2] = GUICreate($GT, 345, 38, 455, 125, 0x80000000, BitOR(0x00080000, 0x00000008, 0x00000040, 0x08000000), $USWin)
DrawImg($ButA, 2, $ImgA1, "这是第二个按钮", 10, 4, "Comic Sans MS", 11)
SetBitmap($But[2], $ButA[2][0], 255)
; 第二个按钮的位置设置  
 
; 第三个按钮的位置设置  
$But[3] = GUICreate($GT, 645, 38, 628, 75, 0x80000000, BitOR(0x00080000, 0x00000008, 0x00000040, 0x08000000), $USWin)
DrawImg($ButA, 3, $ImgA2, "这是第三个按钮", 10, 4, "Comic Sans MS", 11)
SetBitmap($But[3], $ButA[3][0], 255)
; 第三个按钮的位置设置  
 
 
; 第三个按钮的位置设置  
$But[4] = GUICreate($GT, 545, 338, 318, 305, 0x80000000, BitOR(0x00080000, 0x00000008, 0x00000040, 0x08000000), $USWin)
DrawImg($ButA, 4, $ImgA3, "这是第四个按钮", 10, 4, "Comic Sans MS", 11)
SetBitmap($But[4], $ButA[4][0], 255)
; 第三个按钮的位置设置  
 
 ; 第三个按钮的位置设置  
$But[5] = GUICreate($GT, 545, 338, 500, 290, 0x80000000, BitOR(0x00080000, 0x00000008, 0x00000040, 0x08000000), $USWin)
DrawImg($ButA, 5, $ImgA4, "这是第五个按钮", 10, 4, "Comic Sans MS", 11)
SetBitmap($But[5], $ButA[5][0], 255)
; 第三个按钮的位置设置  

; 第三个按钮的位置设置  
$But[6] = GUICreate($GT, 645, 38, 648, 258, 0x80000000, BitOR(0x00080000, 0x00000008, 0x00000040, 0x08000000), $USWin)
DrawImg($ButA, 6, $ImgA5, "这是第六个按钮", 10, 4, "Comic Sans MS", 11)
SetBitmap($But[6], $ButA[6][0], 255)
; 第三个按钮的位置设置  

 
; release loaded images
_GDIPlus_ImageDispose($ImgA[0])
_GDIPlus_ImageDispose($ImgA[1])
_GDIPlus_ImageDispose($ImgA[2])
_GDIPlus_ImageDispose($ImgA[3])
_GDIPlus_ImageDispose($ImgA[4])
 _GDIPlus_ImageDispose($ImgA[5])
  _GDIPlus_ImageDispose($ImgA[6])
    _GDIPlus_ImageDispose($ImgA[7])
; tab controls GUI
$AGUI_Text = GUICreate($GT, 528, 440, 0, 0, 0x80000000, BitOR(0x00080000, 0x00000040), $USWin)
GUISetBkColor(0x003842, $AGUI_Text)
GUICtrlCreateLabel("", 160, 60, 335, 325); label used to hide tab control
GUICtrlSetBkColor(-1, -2)




_WinAPI_SetLayeredWindowAttributes($AGUI_Text, 0x003842, 255)
 
; show all GUIs - kind of like an animation effect
GUISetState(@SW_SHOW, $USWin)
For $i = 1 To $TabNum
        GUISetState(@SW_SHOW, $Tab[$i])
Next
GUISetState(@SW_SHOW, $But[1])
GUISetState(@SW_SHOW, $But[2])
GUISetState(@SW_SHOW, $But[3])
GUISetState(@SW_SHOW, $But[4])
GUISetState(@SW_SHOW, $But[5])
GUISetState(@SW_SHOW, $But[6])
GUISetState(@SW_SHOW, $AGUI_Text)
 
; set the first tab button as pressed
$curr = 1
;$prev = 0
 
While 1
        For $i = 1 To $TabNum + 2; 4 tabs + 2 buttons
                Switch $i
                        Case 1 To $TabNum; tab buttons - 2-state
                                If $curr = $i Then ContinueLoop; don't check the state of the current tab
                                $pos = GUIGetCursorInfo($USWin)
                                If $pos[4] = $PosA[$i][0] Then
                                        If $pos[3] = 1 Then ExitLoop
                                        If $pos[2] = 1 Then ExitLoop
                                        While $pos[4] = $PosA[$i][0]
                                                If GUIGetMsg() = -3 Then Exit
                                                $pos = GUIGetCursorInfo($USWin)
                                                Switch $pos[2]
                                                        Case 0; not pressed
                                                                If $PosA[$i][1] <> 1 Then
                                                                        SetBitmap($Tab[$i], $TabA[$i][1], 255)
                                                                        $PosA[$i][1] = 1
                                                                EndIf
                                                EndSwitch          
                                                                
                                                                                WEND
ENDIF
                                                        Case Else; save and close buttons - 3-state
                                $pos = GUIGetCursorInfo($USWin)
                                If $pos[4] = $PosA[$i][0] Then
                                        If $pos[3] = 1 Then ExitLoop
                                        If $pos[2] = 1 Then ExitLoop
                                        While $pos[4] = $PosA[$i][0]
                                                $pos = GUIGetCursorInfo($USWin)
                                                Switch $pos[2]
                                                        Case 0; not pressed
                                                                If $PosA[$i][1] <> 1 Then
                                                                        SetBitmap($But[$i - $TabNum], $ButA[$i - $TabNum][1], 255)
                                                                        $PosA[$i][1] = 1
                                                                EndIf
                                                        Case 1
                                                                While $pos[2] = 1; holding pressed
                                                                        $pos = GUIGetCursorInfo($USWin)
                                                                        Switch $pos[4]
                                                                                Case $PosA[$i][0]; on button, pressed
                                                                                        If $PosA[$i][1] <> 2 Then
                                                                                                SetBitmap($But[$i - $TabNum], $ButA[$i - $TabNum][2], 255)
                                                                                                $PosA[$i][1] = 2
                                                                                        EndIf
                                                                                Case Else; not on button, pressed
                                                                                        If $PosA[$i][1] <> 3 Then
                                                                                                SetBitmap($But[$i - $TabNum], $ButA[$i - $TabNum][1], 255)
                                                                                                $PosA[$i][1] = 3
                                                                                        EndIf
                                                                        EndSwitch
                                                                        Sleep(10)
                                                                WEnd
                                                                If $pos[4] = $PosA[$i][0] Then
                                                                        Switch $i - $TabNum
                                                                                                                                                        Case 1; 第一个按钮动作从这里产生(不知道怎么改成 case $But[1] 执行某一个动作,case $But[2] 执行某一个动作这样子的)
                                                                                                                                                                
                                                                                        MsgBox(0 + 262144, $GT, "Saved")
                                        
                                                                                Case 2; 第二个按钮动作从这里产生
                                                                                        Exit
                                                                        EndSwitch
                                                                EndIf
                                                EndSwitch
                                                Sleep(10)
                                        WEnd
                                        SetBitmap($But[$i - $TabNum], $ButA[$i - $TabNum][0], 255)
                                        $PosA[$i][1] = 0
                                EndIf
                EndSwitch
        Next
        Switch GUIGetMsg(); this is for tab controls
                Case -3
                        Exit
                
        EndSwitch
        Sleep(10)
WEnd
 
Func DisposeAll()
      
       
        For $i = 1 To 6
                _GDIPlus_BitmapDispose($ButA[$i][0])
                _GDIPlus_BitmapDispose($ButA[$i][1])
                _GDIPlus_BitmapDispose($ButA[$i][2])
                                   _GDIPlus_BitmapDispose($ButA[$i][3])
                                     _GDIPlus_BitmapDispose($ButA[$i][4])
                                            _GDIPlus_BitmapDispose($ButA[$i][5])
        Next
EndFunc   ;==>DisposeAll
 
 
 
 
 ;按钮的大小可以从这里设置,但是成统一的大小89*89了
Func DrawImg(ByRef $RetA, $indx, $Imgs, $text, $xx, $yy, $sFont = "Comic Sans MS", $nSize = 10, $ncol = "000000", $iFormat = 0)
        For $i = 0 To UBound($Imgs)-1
                Local $hGraphic1 = _GDIPlus_GraphicsCreateFromHWND(_WinAPI_GetDesktopWindow())
                Local $hBitmap = _GDIPlus_BitmapCreateFromGraphics(89, 89, $hGraphic1)
                Local $hGraphic2 = _GDIPlus_ImageGetGraphicsContext($hBitmap)
                _GDIPlus_GraphicsDrawImageRect($hGraphic2, $Imgs[$i],$xx, $yy, 89, 89)
                _GDIPlus_GraphicsDrawString_($hGraphic2, $text, $xx, $yy, $sFont, $nSize, $ncol, $iFormat)
                _GDIPlus_GraphicsDispose($hGraphic2)
                _GDIPlus_GraphicsDispose($hGraphic1)
                $RetA[$indx][$i] = $hBitmap
        Next
EndFunc   ;==>DrawImg
 
Func _GDIPlus_GraphicsDrawString_($hGraphics, $sString, $nX, $nY, $sFont = "Comic Sans MS", $nSize = 10, $ncol = "000000", $iFormat = 0)
        If StringLeft($ncol, 2) = "0x" Then $ncol = StringTrimLeft($ncol, 2)
        Local $hBrush = _GDIPlus_BrushCreateSolid("0xFF" & $ncol)
        Local $hFormat = _GDIPlus_StringFormatCreate($iFormat)
        Local $hFamily = _GDIPlus_FontFamilyCreate($sFont)
        Local $hFont = _GDIPlus_FontCreate($hFamily, $nSize)
        Local $tLayout = _GDIPlus_RectFCreate($nX, $nY, 0, 0)
        Local $aInfo = _GDIPlus_GraphicsMeasureString($hGraphics, $sString, $hFont, $tLayout, $hFormat)
        Local $aResult = _GDIPlus_GraphicsDrawStringEx($hGraphics, $sString, $hFont, $aInfo[0], $hFormat, $hBrush)
        Local $iError = @error
        _GDIPlus_FontDispose($hFont)
        _GDIPlus_FontFamilyDispose($hFamily)
        _GDIPlus_StringFormatDispose($hFormat)
        _GDIPlus_BrushDispose($hBrush)
        Return SetError($iError, 0, $aResult)
EndFunc   ;==>_GDIPlus_GraphicsDrawString_




Func SetBitmap($hGUI, $hImage, $iOpacity)
    Local $hScrDC = _WinAPI_GetDC(0)
    Local $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
    Local $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    Local $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    $tSize = DllStructCreate("long X;long Y")
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
    DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
    $tSource = DllStructCreate("long X;long Y")
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate("byte Op;byte Flags;byte Alpha;byte Format")
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", $iOpacity)
    DllStructSetData($tBlend, "Format", 1)
    _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, 0x02)
    _WinAPI_ReleaseDC(0, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC($hMemDC)
EndFunc   ;==>SetBitmap

本帖子中包含更多资源

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

×
发表于 2018-4-25 00:06:16 | 显示全部楼层
回复 5# 沉默的斗鱼

你沒照我上面的測試 你的按鈕 本來是有效的... 現在你的按鈕無效的..........

另外....按鈕 跟 TAB框一點關係都沒有........

你要先弄懂人家的 每一段程式在做啥 為什麼要這樣做

你才可能去改它的程式......
 楼主| 发表于 2018-4-25 00:06:31 | 显示全部楼层
回复 5# 沉默的斗鱼


    大神,我最终需要的效果是

就是全图片png按钮,不要按钮上的文字提示,恳请大神支招。
发表于 2018-4-25 00:15:21 | 显示全部楼层
本帖最后由 kk_lee69 于 2018-4-25 00:18 编辑

回复 5# 沉默的斗鱼

TAB 我幫你拿掉了   

只有圖片 跟按鈕 還是 拿發哥的改

剩下的自己再改吧.................

圖片用你的  

請實際 執行 並且按按看

另外  GUICreate 是子窗時  子窗的座標  限制在 父窗 的客戶區內
這就是 為何 你下的 數值 無法作用問題  

#AutoIt3Wrapper_Res_Fileversion=1.1.0.0
 
#include <WinAPI.au3>
#include <GDIPlus.au3>
 
Opt("TrayAutoPause", 0)
OnAutoItExitRegister("DisposeAll")
 
_GDIPlus_Startup()
 
Global $GT = "GUI Title", $ImgA[3], $PosA[7][2], $BBT[5], $BBTA[5][3], $But[3], $ButA[3][3], $BBTNum = 4
 
; loading images
$ImgA[0] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu1a.png")
$ImgA[1] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu1b.png")
$ImgA[2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu4a.png")
Local $Img1 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\bg.png")
Local $Img2 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\title_button.png")
 
; main GUI with title
Global $USWin = GUICreate($GT, 528, 440, -1, -1, 0x80000000, BitOR(0x00080000, 0x00000008));, 0x80)
Local $hGraphic1a = _GDIPlus_GraphicsCreateFromHWND(_WinAPI_GetDesktopWindow())
Local $hBitmapa = _GDIPlus_BitmapCreateFromGraphics(528, 440, $hGraphic1a)
Local $hGraphic2a = _GDIPlus_ImageGetGraphicsContext($hBitmapa)
_GDIPlus_GraphicsDrawImageRect($hGraphic2a, $Img1, 88, 0, 440, 440)
_GDIPlus_GraphicsDrawImageRect($hGraphic2a, $Img2, 138, 5, 198, 45)
_GDIPlus_GraphicsDrawString_($hGraphic2a, $GT, 148, 11, "Comic Sans MS", 12)
_GDIPlus_GraphicsDispose($hGraphic2a)
_GDIPlus_GraphicsDispose($hGraphic1a)
SetBitmap($USWin, $hBitmapa, 255)
_GDIPlus_GraphicsDispose($hBitmapa)
_GDIPlus_ImageDispose($Img1)
_GDIPlus_ImageDispose($Img2)
 
; position labels for all buttons
$PosA[1][0] = GUICtrlCreateLabel("",400, 99, 157, 30); tab buttons
$PosA[2][0] = GUICtrlCreateLabel("",300 , 132, 157, 30)
$PosA[3][0] = GUICtrlCreateLabel("",200, 165, 157, 30)
$PosA[4][0] = GUICtrlCreateLabel("",100, 198, 157, 30)
$PosA[$BBTNum + 1][0] = GUICtrlCreateLabel("", 137, 402, 160, 35); save button
$PosA[$BBTNum + 2][0] = GUICtrlCreateLabel("", 317, 402, 160, 35); close button
For $i = 1 To $BBTNum + 2
        $PosA[$i][1] = 0
Next
 
; tab button 1
$BBT[1] = GUICreate($GT, 165, 227, 400, 100, 0x80000000, BitOR(0x00080000, 0x00000008, 0x00000040, 0x08000000), $USWin)
DrawImg($BBTA, 1, $ImgA, "按鈕 1", 10, 4, "Comic Sans MS", 11)
SetBitmap($BBT[1], $BBTA[1][2], 255); set the first tab button as pressed
 
; tab button 2
$BBT[2] = GUICreate($GT, 165, 227, 300, 133, 0x80000000, BitOR(0x00080000, 0x00000008, 0x00000040, 0x08000000), $USWin)
DrawImg($BBTA, 2, $ImgA, "按鈕 2", 10, 4, "Comic Sans MS", 11)
SetBitmap($BBT[2], $BBTA[2][0], 255)
 
; tab button 3
$BBT[3] = GUICreate($GT, 165, 227, 200, 166, 0x80000000, BitOR(0x00080000, 0x00000008, 0x00000040, 0x08000000), $USWin)
DrawImg($BBTA, 3, $ImgA, "按鈕 3", 10, 4, "Comic Sans MS", 11)
SetBitmap($BBT[3], $BBTA[3][0], 255)
 
; tab button 4
$BBT[4] = GUICreate($GT, 165, 227, 100, 199, 0x80000000, BitOR(0x00080000, 0x00000008, 0x00000040, 0x08000000), $USWin)
DrawImg($BBTA, 4, $ImgA, "按鈕 4", 10, 4, "Comic Sans MS", 11)
SetBitmap($BBT[4], $BBTA[4][0], 255)
 
; save button
$But[1] = GUICreate($GT, 345, 38, 138, 405, 0x80000000, BitOR(0x00080000, 0x00000008, 0x00000040, 0x08000000), $USWin)
DrawImg($ButA, 1, $ImgA, "Save", 10, 4, "Comic Sans MS", 11)
SetBitmap($But[1], $ButA[1][0], 255)
 
; close button
$But[2] = GUICreate($GT, 345, 38, 318, 405, 0x80000000, BitOR(0x00080000, 0x00000008, 0x00000040, 0x08000000), $USWin)
DrawImg($ButA, 2, $ImgA, "Close", 10, 4, "Comic Sans MS", 11)
SetBitmap($But[2], $ButA[2][0], 255)
 
; release loaded images
_GDIPlus_ImageDispose($ImgA[0])
_GDIPlus_ImageDispose($ImgA[1])
_GDIPlus_ImageDispose($ImgA[2])
 

 
; show all GUIs - kind of like an animation effect
GUISetState(@SW_SHOW, $USWin)
For $i = 1 To $BBTNum
        GUISetState(@SW_SHOW, $BBT[$i])
Next
GUISetState(@SW_SHOW, $But[1])
GUISetState(@SW_SHOW, $But[2])

 
; set the first tab button as pressed
$curr = 1
;$prev = 0
 
While 1
        For $i = 1 To $BBTNum + 2; 4 tabs + 2 buttons
                Switch $i
                        Case 1 To $BBTNum; tab buttons - 2-state
                                If $curr = $i Then ContinueLoop; don't check the state of the current tab
                                $pos = GUIGetCursorInfo($USWin)
                                If $pos[4] = $PosA[$i][0] Then
                                        If $pos[3] = 1 Then ExitLoop
                                        If $pos[2] = 1 Then ExitLoop
                                        While $pos[4] = $PosA[$i][0]
                                                If GUIGetMsg() = -3 Then Exit
                                                $pos = GUIGetCursorInfo($USWin)
                                                Switch $pos[2]
                                                        Case 0; not pressed
                                                                If $PosA[$i][1] <> 1 Then
                                                                        SetBitmap($BBT[$i], $BBTA[$i][1], 255)
                                                                        $PosA[$i][1] = 1
                                                                EndIf
                                                        Case 1; pressed - change tab
                                                                If $PosA[$i][1] <> 2 Then
                                                                        SetBitmap($BBT[$curr], $BBTA[$curr][0], 255)
                                                                        SetBitmap($BBT[$i], $BBTA[$i][2], 255)
                                                                        _WinAPI_ShowMsg("這是第"&$i&"個按鈕")
                                                                        $PosA[$i][1] = 2
                                                                        ;$prev = $curr
                                                                        $curr = $i
                                                                                                                                                
                                                                        ExitLoop
                                                                EndIf
                                                EndSwitch
                                                Sleep(10)
                                        WEnd
                                        If $curr <> $i Then SetBitmap($BBT[$i], $BBTA[$i][0], 255)
                                        $PosA[$i][1] = 0
                                EndIf
                        Case Else; save and close buttons - 3-state
                                $pos = GUIGetCursorInfo($USWin)
                                If $pos[4] = $PosA[$i][0] Then
                                        If $pos[3] = 1 Then ExitLoop
                                        If $pos[2] = 1 Then ExitLoop
                                        While $pos[4] = $PosA[$i][0]
                                                $pos = GUIGetCursorInfo($USWin)
                                                Switch $pos[2]
                                                        Case 0; not pressed
                                                                If $PosA[$i][1] <> 1 Then
                                                                        SetBitmap($But[$i - $BBTNum], $ButA[$i - $BBTNum][1], 255)
                                                                        $PosA[$i][1] = 1
                                                                EndIf
                                                        Case 1
                                                                While $pos[2] = 1; holding pressed
                                                                        $pos = GUIGetCursorInfo($USWin)
                                                                        Switch $pos[4]
                                                                                Case $PosA[$i][0]; on button, pressed
                                                                                        If $PosA[$i][1] <> 2 Then
                                                                                                SetBitmap($But[$i - $BBTNum], $ButA[$i - $BBTNum][2], 255)
                                                                                                $PosA[$i][1] = 2
                                                                                        EndIf
                                                                                Case Else; not on button, pressed
                                                                                        If $PosA[$i][1] <> 3 Then
                                                                                                SetBitmap($But[$i - $BBTNum], $ButA[$i - $BBTNum][1], 255)
                                                                                                $PosA[$i][1] = 3
                                                                                        EndIf
                                                                        EndSwitch
                                                                        Sleep(10)
                                                                WEnd
                                                                If $pos[4] = $PosA[$i][0] Then
                                                                        Switch $i - $BBTNum
                                                                                Case 1; save button pressed
                                                                                        MsgBox(0 + 262144, $GT, "Saved")
                                                                                Case 2; close button pressed
                                                                                        Exit
                                                                        EndSwitch
                                                                EndIf
                                                EndSwitch
                                                Sleep(10)
                                        WEnd
                                        SetBitmap($But[$i - $BBTNum], $ButA[$i - $BBTNum][0], 255)
                                        $PosA[$i][1] = 0
                                EndIf
                EndSwitch
        Next
        Switch GUIGetMsg(); this is for tab controls
                Case -3
                        Exit

        EndSwitch
        Sleep(10)
WEnd
 
Func DisposeAll()
        For $i = 1 To $BBTNum
                _GDIPlus_BitmapDispose($BBTA[$i][0])
                _GDIPlus_BitmapDispose($BBTA[$i][1])
                _GDIPlus_BitmapDispose($BBTA[$i][2])
        Next
        For $i = 1 To 2
                _GDIPlus_BitmapDispose($ButA[$i][0])
                _GDIPlus_BitmapDispose($ButA[$i][1])
                _GDIPlus_BitmapDispose($ButA[$i][2])
        Next
EndFunc   ;==>DisposeAll
 
Func DrawImg(ByRef $RetA, $indx, $Imgs, $text, $xx, $yy, $sFont = "Comic Sans MS", $nSize = 10, $ncol = "000000", $iFormat = 0)
        For $i = 0 To 2
                Local $hGraphic1 = _GDIPlus_GraphicsCreateFromHWND(_WinAPI_GetDesktopWindow())
                Local $hBitmap = _GDIPlus_BitmapCreateFromGraphics(165, 38, $hGraphic1)
                Local $hGraphic2 = _GDIPlus_ImageGetGraphicsContext($hBitmap)
                _GDIPlus_GraphicsDrawImageRect($hGraphic2, $Imgs[$i], 0, 0, 165, 38)
                _GDIPlus_GraphicsDrawString_($hGraphic2, $text, $xx, $yy, $sFont, $nSize, $ncol, $iFormat)
                _GDIPlus_GraphicsDispose($hGraphic2)
                _GDIPlus_GraphicsDispose($hGraphic1)
                $RetA[$indx][$i] = $hBitmap
        Next
EndFunc   ;==>DrawImg
 
Func _GDIPlus_GraphicsDrawString_($hGraphics, $sString, $nX, $nY, $sFont = "Comic Sans MS", $nSize = 10, $ncol = "000000", $iFormat = 0)
        If StringLeft($ncol, 2) = "0x" Then $ncol = StringTrimLeft($ncol, 2)
        Local $hBrush = _GDIPlus_BrushCreateSolid("0xFF" & $ncol)
        Local $hFormat = _GDIPlus_StringFormatCreate($iFormat)
        Local $hFamily = _GDIPlus_FontFamilyCreate($sFont)
        Local $hFont = _GDIPlus_FontCreate($hFamily, $nSize)
        Local $tLayout = _GDIPlus_RectFCreate($nX, $nY, 0, 0)
        Local $aInfo = _GDIPlus_GraphicsMeasureString($hGraphics, $sString, $hFont, $tLayout, $hFormat)
        Local $aResult = _GDIPlus_GraphicsDrawStringEx($hGraphics, $sString, $hFont, $aInfo[0], $hFormat, $hBrush)
        Local $iError = @error
        _GDIPlus_FontDispose($hFont)
        _GDIPlus_FontFamilyDispose($hFamily)
        _GDIPlus_StringFormatDispose($hFormat)
        _GDIPlus_BrushDispose($hBrush)
        Return SetError($iError, 0, $aResult)
EndFunc   ;==>_GDIPlus_GraphicsDrawString_
 
Func SetBitmap($hGUI, $hImage, $iOpacity)
    Local $hScrDC = _WinAPI_GetDC(0)
    Local $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
    Local $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    Local $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    $tSize = DllStructCreate("long X;long Y")
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
    DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
    $tSource = DllStructCreate("long X;long Y")
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate("byte Op;byte Flags;byte Alpha;byte Format")
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", $iOpacity)
    DllStructSetData($tBlend, "Format", 1)
    _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, 0x02)
    _WinAPI_ReleaseDC(0, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC($hMemDC)
EndFunc   ;==>SetBitmap
 楼主| 发表于 2018-4-25 00:46:49 | 显示全部楼层
回复 8# kk_lee69


    大神你太厉害了,我从去年把这个代码琢磨到现在了,过一段时间琢磨一阵子,始终找不到头绪,大神你好厉害呀。

问题得到解决,心情非常激动,连夜测试,基本可以实现我的需求,但是仍有一事不明,比如给按钮2添加动作,执行一次后第二次就会鼠标按上和按下按钮图片不会更改,按下其他按钮后再按下按钮2方能执行动作和变换按钮背景图片,不知道这是为何,

此外,把每个按钮设置成不同尺寸这一点,小弟始终找不到头绪和方法,知道改的地方,但无法下手更改,恳请大神支招呀!
发表于 2018-4-25 00:51:04 | 显示全部楼层
回复 9# 沉默的斗鱼

你為何要用這個例子?? 論壇很多更簡單的  其實 發哥這個算是蠻複雜的

老實說  我不看你的程式 是 我根本也還搞不懂 它的做法  尤其它加了很多的陣列作變化

你亂改 就會產生 我說的 一開始你的按鈕幾乎是錯誤的 號碼  同樣一顆 我第一次按 他說4號按鈕 第二次按 他說 1號按鈕


這就表示 你動了他的陣列 卻又沒搞清它的邏輯....
 楼主| 发表于 2018-4-25 01:02:31 | 显示全部楼层
回复 8# kk_lee69


    谢谢大神,想到一个笨办法了,png只能是统一大小,那就把png放成统一大小,把上面显示的图像放成不同大小就可以啦。

比如;都是89*89图像

这是图像占据88像素的按钮1
[img][url][/url][/img]


我们可以把按钮2用ps处理小,但画布是89*89,图像是40*40


这就可以解决png按钮设置不同大小了,方法虽笨,但能解决问题。大神见笑啦!

本帖子中包含更多资源

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

×
发表于 2018-4-25 01:03:17 | 显示全部楼层
回复 9# 沉默的斗鱼

改好了 既然知道是哪個函數控管  

多幾個一樣的不就好了

#include <WinAPI.au3>
#include <GDIPlus.au3>
 
Opt("TrayAutoPause", 0)
OnAutoItExitRegister("DisposeAll")
 
_GDIPlus_Startup()
 
Global $GT = "GUI Title", $ImgA[3], $PosA[7][2], $BBT[5], $BBTA[5][3], $But[3], $ButA[3][3], $BBTNum = 4
 
; loading images
$ImgA[0] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu1a.png")
$ImgA[1] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu1b.png")
$ImgA[2] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\anniu4a.png")
Local $Img1 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\bg.png")
Local $Img2 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\title_button.png")
 
; main GUI with title
Global $USWin = GUICreate($GT, 528, 440, -1, -1, 0x80000000, BitOR(0x00080000, 0x00000008));, 0x80)
Local $hGraphic1a = _GDIPlus_GraphicsCreateFromHWND(_WinAPI_GetDesktopWindow())
Local $hBitmapa = _GDIPlus_BitmapCreateFromGraphics(528, 440, $hGraphic1a)
Local $hGraphic2a = _GDIPlus_ImageGetGraphicsContext($hBitmapa)
_GDIPlus_GraphicsDrawImageRect($hGraphic2a, $Img1, 88, 0, 440, 440)
_GDIPlus_GraphicsDrawImageRect($hGraphic2a, $Img2, 138, 5, 198, 45)
_GDIPlus_GraphicsDrawString_($hGraphic2a, $GT, 148, 11, "Comic Sans MS", 12)
_GDIPlus_GraphicsDispose($hGraphic2a)
_GDIPlus_GraphicsDispose($hGraphic1a)
SetBitmap($USWin, $hBitmapa, 255)
_GDIPlus_GraphicsDispose($hBitmapa)
_GDIPlus_ImageDispose($Img1)
_GDIPlus_ImageDispose($Img2)
 
; position labels for all buttons
$PosA[1][0] = GUICtrlCreateLabel("",450, 99, 157, 30); tab buttons
$PosA[2][0] = GUICtrlCreateLabel("",350 , 132, 157, 30)
$PosA[3][0] = GUICtrlCreateLabel("",200, 165, 157, 30)
$PosA[4][0] = GUICtrlCreateLabel("",100, 198, 157, 30)
$PosA[$BBTNum + 1][0] = GUICtrlCreateLabel("", 137, 402, 160, 35); save button
$PosA[$BBTNum + 2][0] = GUICtrlCreateLabel("", 317, 402, 160, 35); close button
For $i = 1 To $BBTNum + 2
        $PosA[$i][1] = 0
Next
 
; tab button 1
$BBT[1] = GUICreate($GT, 165, 227, 450, 100, 0x80000000, BitOR(0x00080000, 0x00000008, 0x00000040, 0x08000000), $USWin)
DrawImg2($BBTA, 1, $ImgA, "按鈕 1", 10, 4, "Comic Sans MS", 11)
SetBitmap($BBT[1], $BBTA[1][2], 255); set the first tab button as pressed
 
; tab button 2
$BBT[2] = GUICreate($GT, 165, 227, 350, 133, 0x80000000, BitOR(0x00080000, 0x00000008, 0x00000040, 0x08000000), $USWin)
DrawImg3($BBTA, 2, $ImgA, "按鈕 2", 10, 4, "Comic Sans MS", 11)
SetBitmap($BBT[2], $BBTA[2][0], 255)
 
; tab button 3
$BBT[3] = GUICreate($GT, 165, 227, 200, 166, 0x80000000, BitOR(0x00080000, 0x00000008, 0x00000040, 0x08000000), $USWin)
DrawImg($BBTA, 3, $ImgA, "按鈕 3", 10, 4, "Comic Sans MS", 11)
SetBitmap($BBT[3], $BBTA[3][0], 255)
 
; tab button 4
$BBT[4] = GUICreate($GT, 165, 227, 100, 199, 0x80000000, BitOR(0x00080000, 0x00000008, 0x00000040, 0x08000000), $USWin)
DrawImg($BBTA, 4, $ImgA, "按鈕 4", 10, 4, "Comic Sans MS", 11)
SetBitmap($BBT[4], $BBTA[4][0], 255)
 
; save button
$But[1] = GUICreate($GT, 345, 38, 138, 405, 0x80000000, BitOR(0x00080000, 0x00000008, 0x00000040, 0x08000000), $USWin)
DrawImg($ButA, 1, $ImgA, "Save", 10, 4, "Comic Sans MS", 11)
SetBitmap($But[1], $ButA[1][0], 255)
 
; close button
$But[2] = GUICreate($GT, 345, 38, 318, 405, 0x80000000, BitOR(0x00080000, 0x00000008, 0x00000040, 0x08000000), $USWin)
DrawImg($ButA, 2, $ImgA, "Close", 10, 4, "Comic Sans MS", 11)
SetBitmap($But[2], $ButA[2][0], 255)
 
; release loaded images
_GDIPlus_ImageDispose($ImgA[0])
_GDIPlus_ImageDispose($ImgA[1])
_GDIPlus_ImageDispose($ImgA[2])
 

 
; show all GUIs - kind of like an animation effect
GUISetState(@SW_SHOW, $USWin)
For $i = 1 To $BBTNum
        GUISetState(@SW_SHOW, $BBT[$i])
Next
GUISetState(@SW_SHOW, $But[1])
GUISetState(@SW_SHOW, $But[2])

 
; set the first tab button as pressed
$curr = 1
;$prev = 0
 
While 1
        For $i = 1 To $BBTNum + 2; 4 tabs + 2 buttons
                Switch $i
                        Case 1 To $BBTNum; tab buttons - 2-state
                                If $curr = $i Then ContinueLoop; don't check the state of the current tab
                                $pos = GUIGetCursorInfo($USWin)
                                If $pos[4] = $PosA[$i][0] Then
                                        If $pos[3] = 1 Then ExitLoop
                                        If $pos[2] = 1 Then ExitLoop
                                        While $pos[4] = $PosA[$i][0]
                                                If GUIGetMsg() = -3 Then Exit
                                                $pos = GUIGetCursorInfo($USWin)
                                                Switch $pos[2]
                                                        Case 0; not pressed
                                                                If $PosA[$i][1] <> 1 Then
                                                                        SetBitmap($BBT[$i], $BBTA[$i][1], 255)
                                                                        $PosA[$i][1] = 1
                                                                EndIf
                                                        Case 1; pressed - change tab
                                                                If $PosA[$i][1] <> 2 Then
                                                                        SetBitmap($BBT[$curr], $BBTA[$curr][0], 255)
                                                                        SetBitmap($BBT[$i], $BBTA[$i][2], 255)
                                                                        _WinAPI_ShowMsg("這是第"&$i&"個按鈕")
                                                                        $PosA[$i][1] = 2
                                                                        ;$prev = $curr
                                                                        $curr = $i
                                                                                                                                                
                                                                        ExitLoop
                                                                EndIf
                                                EndSwitch
                                                Sleep(10)
                                        WEnd
                                        If $curr <> $i Then SetBitmap($BBT[$i], $BBTA[$i][0], 255)
                                        $PosA[$i][1] = 0
                                EndIf
                        Case Else; save and close buttons - 3-state
                                $pos = GUIGetCursorInfo($USWin)
                                If $pos[4] = $PosA[$i][0] Then
                                        If $pos[3] = 1 Then ExitLoop
                                        If $pos[2] = 1 Then ExitLoop
                                        While $pos[4] = $PosA[$i][0]
                                                $pos = GUIGetCursorInfo($USWin)
                                                Switch $pos[2]
                                                        Case 0; not pressed
                                                                If $PosA[$i][1] <> 1 Then
                                                                        SetBitmap($But[$i - $BBTNum], $ButA[$i - $BBTNum][1], 255)
                                                                        $PosA[$i][1] = 1
                                                                EndIf
                                                        Case 1
                                                                While $pos[2] = 1; holding pressed
                                                                        $pos = GUIGetCursorInfo($USWin)
                                                                        Switch $pos[4]
                                                                                Case $PosA[$i][0]; on button, pressed
                                                                                        If $PosA[$i][1] <> 2 Then
                                                                                                SetBitmap($But[$i - $BBTNum], $ButA[$i - $BBTNum][2], 255)
                                                                                                $PosA[$i][1] = 2
                                                                                        EndIf
                                                                                Case Else; not on button, pressed
                                                                                        If $PosA[$i][1] <> 3 Then
                                                                                                SetBitmap($But[$i - $BBTNum], $ButA[$i - $BBTNum][1], 255)
                                                                                                $PosA[$i][1] = 3
                                                                                        EndIf
                                                                        EndSwitch
                                                                        Sleep(10)
                                                                WEnd
                                                                If $pos[4] = $PosA[$i][0] Then
                                                                        Switch $i - $BBTNum
                                                                                Case 1; save button pressed
                                                                                        MsgBox(0 + 262144, $GT, "Saved")
                                                                                Case 2; close button pressed
                                                                                        Exit
                                                                        EndSwitch
                                                                EndIf
                                                EndSwitch
                                                Sleep(10)
                                        WEnd
                                        SetBitmap($But[$i - $BBTNum], $ButA[$i - $BBTNum][0], 255)
                                        $PosA[$i][1] = 0
                                EndIf
                EndSwitch
        Next
        Switch GUIGetMsg(); this is for tab controls
                Case -3
                        Exit

        EndSwitch
        Sleep(10)
WEnd
 
Func DisposeAll()
        For $i = 1 To $BBTNum
                _GDIPlus_BitmapDispose($BBTA[$i][0])
                _GDIPlus_BitmapDispose($BBTA[$i][1])
                _GDIPlus_BitmapDispose($BBTA[$i][2])
        Next
        For $i = 1 To 2
                _GDIPlus_BitmapDispose($ButA[$i][0])
                _GDIPlus_BitmapDispose($ButA[$i][1])
                _GDIPlus_BitmapDispose($ButA[$i][2])
        Next
EndFunc   ;==>DisposeAll
 
Func DrawImg(ByRef $RetA, $indx, $Imgs, $text, $xx, $yy, $sFont = "Comic Sans MS", $nSize = 10, $ncol = "000000", $iFormat = 0)
        For $i = 0 To 2
                Local $hGraphic1 = _GDIPlus_GraphicsCreateFromHWND(_WinAPI_GetDesktopWindow())
                Local $hBitmap = _GDIPlus_BitmapCreateFromGraphics(165, 38, $hGraphic1)
                Local $hGraphic2 = _GDIPlus_ImageGetGraphicsContext($hBitmap)
                _GDIPlus_GraphicsDrawImageRect($hGraphic2, $Imgs[$i], 0, 0, 165, 38)
                _GDIPlus_GraphicsDrawString_($hGraphic2, $text, $xx, $yy, $sFont, $nSize, $ncol, $iFormat)
                _GDIPlus_GraphicsDispose($hGraphic2)
                _GDIPlus_GraphicsDispose($hGraphic1)
                $RetA[$indx][$i] = $hBitmap
        Next
EndFunc   ;==>DrawImg

Func DrawImg2(ByRef $RetA, $indx, $Imgs, $text, $xx, $yy, $sFont = "Comic Sans MS", $nSize = 10, $ncol = "000000", $iFormat = 0)
        For $i = 0 To 2
                Local $hGraphic1 = _GDIPlus_GraphicsCreateFromHWND(_WinAPI_GetDesktopWindow())
                Local $hBitmap = _GDIPlus_BitmapCreateFromGraphics(165, 38, $hGraphic1)
                Local $hGraphic2 = _GDIPlus_ImageGetGraphicsContext($hBitmap)
                _GDIPlus_GraphicsDrawImageRect($hGraphic2, $Imgs[$i], 0, 0, 46, 46)
                _GDIPlus_GraphicsDrawString_($hGraphic2, $text, $xx, $yy, $sFont, $nSize, $ncol, $iFormat)
                _GDIPlus_GraphicsDispose($hGraphic2)
                _GDIPlus_GraphicsDispose($hGraphic1)
                $RetA[$indx][$i] = $hBitmap
        Next
EndFunc   ;==>DrawImg

Func DrawImg3(ByRef $RetA, $indx, $Imgs, $text, $xx, $yy, $sFont = "Comic Sans MS", $nSize = 10, $ncol = "000000", $iFormat = 0)
        For $i = 0 To 2
                Local $hGraphic1 = _GDIPlus_GraphicsCreateFromHWND(_WinAPI_GetDesktopWindow())
                Local $hBitmap = _GDIPlus_BitmapCreateFromGraphics(165, 128, $hGraphic1)
                Local $hGraphic2 = _GDIPlus_ImageGetGraphicsContext($hBitmap)
                _GDIPlus_GraphicsDrawImageRect($hGraphic2, $Imgs[$i], 0, 0, 128, 128)
                _GDIPlus_GraphicsDrawString_($hGraphic2, $text, $xx, $yy, $sFont, $nSize, $ncol, $iFormat)
                _GDIPlus_GraphicsDispose($hGraphic2)
                _GDIPlus_GraphicsDispose($hGraphic1)
                $RetA[$indx][$i] = $hBitmap
        Next
EndFunc   ;==>DrawImg

Func _GDIPlus_GraphicsDrawString_($hGraphics, $sString, $nX, $nY, $sFont = "Comic Sans MS", $nSize = 10, $ncol = "000000", $iFormat = 0)
        If StringLeft($ncol, 2) = "0x" Then $ncol = StringTrimLeft($ncol, 2)
        Local $hBrush = _GDIPlus_BrushCreateSolid("0xFF" & $ncol)
        Local $hFormat = _GDIPlus_StringFormatCreate($iFormat)
        Local $hFamily = _GDIPlus_FontFamilyCreate($sFont)
        Local $hFont = _GDIPlus_FontCreate($hFamily, $nSize)
        Local $tLayout = _GDIPlus_RectFCreate($nX, $nY, 0, 0)
        Local $aInfo = _GDIPlus_GraphicsMeasureString($hGraphics, $sString, $hFont, $tLayout, $hFormat)
        Local $aResult = _GDIPlus_GraphicsDrawStringEx($hGraphics, $sString, $hFont, $aInfo[0], $hFormat, $hBrush)
        Local $iError = @error
        _GDIPlus_FontDispose($hFont)
        _GDIPlus_FontFamilyDispose($hFamily)
        _GDIPlus_StringFormatDispose($hFormat)
        _GDIPlus_BrushDispose($hBrush)
        Return SetError($iError, 0, $aResult)
EndFunc   ;==>_GDIPlus_GraphicsDrawString_
 
Func SetBitmap($hGUI, $hImage, $iOpacity)
    Local $hScrDC = _WinAPI_GetDC(0)
    Local $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
    Local $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    Local $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    $tSize = DllStructCreate("long X;long Y")
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
    DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
    $tSource = DllStructCreate("long X;long Y")
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate("byte Op;byte Flags;byte Alpha;byte Format")
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", $iOpacity)
    DllStructSetData($tBlend, "Format", 1)
    _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, 0x02)
    _WinAPI_ReleaseDC(0, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC($hMemDC)
EndFunc   ;==>SetBitmap
发表于 2018-4-25 01:04:20 | 显示全部楼层
回复 11# 沉默的斗鱼

不用這麼麻煩  本身函數就可以 放大縮小
 楼主| 发表于 2018-4-25 01:07:06 | 显示全部楼层
回复 10# kk_lee69


    比如给按钮2添加动作,执行一次后第二次就会鼠标按上和按下按钮图片不会更改,按下其他按钮后再按下按钮2方能执行动作和变换按钮背景图片,不知道这是为何,


这个问题也可以解决,不用循环变量就可以解决“按钮2添加动作,执行一次后第二次就会鼠标按上和按下按钮图片不会更改,按下其他按钮后再按下按钮2方能执行动作和变换按钮背景图片”的问题
Case 1; pressed - change tab
                                                                If $PosA[2][1] Then
                                                                        SetBitmap($BBT[$curr], $BBTA[$curr][0], 255)
                                                                        SetBitmap($BBT[2], $BBTA[2][2], 255)
                                                                                                                                                RunWait("BeiKelSystem319.exe")
                                                                        _WinAPI_ShowMsg("這是第"&2&"個按鈕")
                                                                        $PosA[2][1] = 2
                                                                        ;$prev = $curr
把这里改成绝对值就可以了,但是其他按钮加动作用这办法就不会了。原谅小弟基础差对变量头疼吧。

如果不嫌小弟啰嗦帮忙分离成每按一个按钮执行动作而不是用变量定义整体动作。谢谢谢
 楼主| 发表于 2018-4-25 01:13:03 | 显示全部楼层

用函数能解决,我知道,对你大神来说是小菜一碟,可是对我来说就是一座大山,我都不好意思让你再教我了。



我知道,论坛上有很多png按钮例子,说实话我都挨个研究了,或许有点夸大吧,但是我觉得发哥这个转帖含金量极高,代码很值得研究,最重要的一点,和其他函数混用不冲突,所以就一直琢磨这个脚本呢。

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-4-26 00:13 , Processed in 0.092876 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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