找回密码
 加入
搜索
查看: 3218|回复: 4

图片背景上的Png按钮

  [复制链接]
发表于 2009-12-26 08:59:41 | 显示全部楼层 |阅读模式
本帖最后由 81206954 于 2009-12-26 14:02 编辑

图片背景上的Png按钮

效果图:


需解决的问题:   就是那个PNG的圆角,把白色那个角去掉,设计中PNG本身是没白色角的,具体请看我打包的文件


文件: resources.au3
#include-once
#include <GDIPlus.au3>
#include <Memory.au3>

Global Const $RT_CURSOR = 1
Global Const $RT_BITMAP = 2
Global Const $RT_ICON = 3
Global Const $RT_MENU = 4
Global Const $RT_DIALOG = 5
Global Const $RT_STRING = 6
Global Const $RT_FONTDIR = 7
Global Const $RT_FONT = 8
Global Const $RT_ACCELERATORS = 9
Global Const $RT_RCDATA = 10
Global Const $RT_MESSAGETABLE = 11
Global Const $RT_GROUP_CURSOR = 12
Global Const $RT_GROUP_ICON = 14
Global Const $RT_VERSION = 16

Global Const $RT_ANICURSOR = 21
Global Const $RT_ANIICON = 22
Global Const $RT_HTML = 23
Global Const $RT_MANIFEST = 24

Global Const $SND_RESOURCE = 0x00040004
Global Const $SND_SYNC = 0x0
Global Const $SND_ASYNC = 0x1
Global Const $SND_LOOP = 0x8
Global Const $SND_NOSTOP = 0x10
Global Const $SND_NOWAIT = 0x2000
Global Const $SND_PURGE = 0x40

Func _ResourceGet($ResName, $ResType = 10, $ResLang = 0) ; $RT_RCDATA = 10
        Local Const $IMAGE_BITMAP = 0
        Local $hInstance, $hBitmap, $InfoBlock, $GlobalMemoryBlock, $MemoryPointer, $ResSize
        
        $hInstance = DllCall("kernel32.dll", "int", "GetModuleHandleA", "int", 0)
        $hInstance = $hInstance[0]

        If $ResType = $RT_BITMAP Then
                $hBitmap = DllCall("user32.dll", "hwnd", "LoadImage", "hwnd", $hInstance, "str", $ResName, _
                                "int", $IMAGE_BITMAP, "int", 0, "int", 0, "int", 0)
                If @error Then Return SetError(1, 0, 0)
                $hBitmap = $hBitmap[0]
                Return $hBitmap ; returns handle to Bitmap
        EndIf

        If $ResLang <> 0 Then
                $InfoBlock = DllCall("kernel32.dll", "int", "FindResourceExA", "int", $hInstance, "str", $ResName, "long", $ResType, "short", $ResLang)
        Else
                $InfoBlock = DllCall("kernel32.dll", "int", "FindResourceA", "int", $hInstance, "str", $ResName, "long", $ResType)
        EndIf
        
        If @error Then Return SetError(2, 0, 0)
        $InfoBlock = $InfoBlock[0]
        If $InfoBlock = 0 Then Return SetError(3, 0, 0)
        
        $ResSize = DllCall("kernel32.dll", "dword", "SizeofResource", "int", $hInstance, "int", $InfoBlock)
        If @error Then Return SetError(4, 0, 0)
        $ResSize = $ResSize[0]
        If $ResSize = 0 Then Return SetError(5, 0, 0)
        
        $GlobalMemoryBlock = DllCall("kernel32.dll", "int", "LoadResource", "int", $hInstance, "int", $InfoBlock)
        If @error Then Return SetError(6, 0, 0)
        $GlobalMemoryBlock = $GlobalMemoryBlock[0]
        If $GlobalMemoryBlock = 0 Then Return SetError(7, 0, 0)
        
        $MemoryPointer = DllCall("kernel32.dll", "int", "LockResource", "int", $GlobalMemoryBlock)
        If @error Then Return SetError(8, 0, 0)
        $MemoryPointer = $MemoryPointer[0]
        If $MemoryPointer = 0 Then Return SetError(9, 0, 0)
        
        SetExtended($ResSize)
        Return $MemoryPointer
EndFunc

Func _ResourceGetAsString($ResName, $ResType = 10, $ResLang = 0) ; $RT_RCDATA = 10
        Local $ResPointer, $ResSize, $struct

        $ResPointer = _ResourceGet($ResName, $ResType, $ResLang)
        If @error Then
                SetError(1, 0, 0)
                Return ''
        EndIf
        $ResSize = @extended
        $struct = DllStructCreate("char[" & $ResSize & "]", $ResPointer)
        Return DllStructGetData($struct, 1) ; returns string
EndFunc

Func _ResourceGetAsBytes($ResName, $ResType = 10, $ResLang = 0) ; $RT_RCDATA = 10
        Local $ResPointer, $ResSize

        $ResPointer = _ResourceGet($ResName, $ResType, $ResLang)
        If @error Then Return SetError(1, 0, 0)
        $ResSize = @extended
        Return DllStructCreate("byte[" & $ResSize & "]", $ResPointer) ; returns struct with bytes
EndFunc

Func _ResourceSaveToFile($FileName, $ResName, $ResType = 10, $ResLang = 0, $CreatePath = 0) ; $RT_RCDATA = 10
        Local $ResStruct, $ResSize, $FileHandle

        $ResStruct = _ResourceGetAsBytes($ResName, $ResType, $ResLang)
        If @error Then Return SetError(1, 0, 0)
        $ResSize = DllStructGetSize($ResStruct)
        
        If $CreatePath Then $CreatePath = 8 ; mode 8 = Create directory structure if it doesn't exist
        $FileHandle = FileOpen($FileName, 2+16+$CreatePath)
        If @error Then Return SetError(2, 0, 0)
        FileWrite($FileHandle, DllStructGetData($ResStruct, 1))
        If @error Then Return SetError(3, 0, 0)
        FileClose($FileHandle)
        If @error Then Return SetError(4, 0, 0)

        Return $ResSize
EndFunc

Func _ResourceSetImageToCtrl($CtrlId, $ResName, $ResType = 10) ; $RT_RCDATA = 10
        Local $ResData, $nSize, $hData, $pData, $pStream, $pBitmap, $hBitmap
        
        $ResData = _ResourceGet($ResName, $ResType)
        If @error Then Return SetError(1, 0, 0)
        $nSize = @extended
        
        If $ResType = $RT_BITMAP Then
                _SetBitmapToCtrl($CtrlId, $ResData)
                If @error Then Return SetError(2, 0, 0)
        Else
                ; for other types than BITMAP use GDI+ for converting to bitmap first
                $hData = _MemGlobalAlloc($nSize,2)
                $pData = _MemGlobalLock($hData)
                _MemMoveMemory($ResData,$pData,$nSize)
                _MemGlobalUnlock($hData)
                $pStream = DllCall( "ole32.dll","int","CreateStreamOnHGlobal", "int",$hData, "long",1, "Int*",0)
                $pStream = $pStream[3]
                _GDIPlus_Startup()
                $pBitmap = DllCall($ghGDIPDll,"int","GdipCreateBitmapFromStream", "ptr",$pStream, "int*",0)
                $pBitmap = $pBitmap[2]
                $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($pBitmap)
                _SetBitmapToCtrl($CtrlId,$hBitmap)
                If @error Then SetError(3, 0, 0)
                _GDIPlus_BitmapDispose($pBitmap)
                _GDIPlus_Shutdown()
                _WinAPI_DeleteObject($pStream)
                _MemGlobalFree($hData)
        EndIf

        Return 1
EndFunc

; internal helper function
Func _SetBitmapToCtrl($CtrlId, $hBitmap)
    Local Const $STM_SETIMAGE = 0x0172
    Local Const $IMAGE_BITMAP = 0

    Local $hWnd = GUICtrlGetHandle($CtrlId)
        If $hWnd = 0 Then Return SetError(1, 0, 0)
    DllCall("user32.dll", "hwnd", "SendMessage", "hwnd", $hWnd, "int", $STM_SETIMAGE, "int", $IMAGE_BITMAP, "int", $hBitmap)
        If @error Then Return SetError(2, 0, 0)
        Return 1
EndFunc

; thanks Larry
; MSDN: http://msdn2.microsoft.com/en-us/library/ms712879.aspx
; default flag is $SND_SYNC = 0
Func _ResourcePlaySound($ResName, $Flag = 0)
        Local $ret = DllCall("winmm.dll", "int", "PlaySound", "str", $ResName, "hwnd", 0, "int", BitOr($SND_RESOURCE,$Flag))
        If @error Then Return SetError(1, 0, 0)
        Return $ret[0]
EndFunc
文件: 透明按钮.au3
#Region ;**** 参数创建于 AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Res_File_Add=pic1.png, rcdata, Button_a
#AutoIt3Wrapper_Res_File_Add=pic2.png, rcdata, Button_b
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

#include <GUIConstants.au3>
#include "resources.au3"

Opt("GUIOnEventMode", 1)
Opt("MouseCoordMode", 2)

Global $n = 0
Global $MousePos = True
Global $Last


$mainwindow = GUICreate("", 220, 220);, -1, -1, $WS_POPUP)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
GUISetOnEvent($GUI_EVENT_PRIMARYUP, '_PRIMARYup')
GUISetOnEvent($GUI_EVENT_MOUSEMOVE, "MouseOver")

$Previewimage = GUICtrlCreatePic("", 20, 20, 92, 46)
_ResourceSetImageToCtrl($Previewimage, "Button_a")
$Pic1 = GUICtrlCreatePic("bg.jpg", 0, 0,353, 364, $WS_CLIPSIBLINGS)

GUISetState(@SW_SHOW)

While 1
        Sleep(1000)
WEnd


Func _Exit()
     Exit
EndFunc


Func _PRIMARYup()
        If $MousePos Then
                If $n = 2 Then 
                        $n = 0
                Else
                        $start = TimerInit()
                EndIf
        EndIf
    $GGCI = GUIGetCursorInfo($mainwindow)
    If $GGCI[4] = $Previewimage Then msgbox(0,"","漂亮!")
EndFunc


Func MouseOver()
    $GGCI = GUIGetCursorInfo($mainwindow)
    If $GGCI[4] = $Previewimage And $Last <> $Previewimage  Then
        GUICtrlsetimage($Previewimage, "") 
        _ResourceSetImageToCtrl($Previewimage, "Button_b")
        GuiCtrlSetCursor($Previewimage, 0)
        $Last = $Previewimage
    ElseIf $GGCI[4] <> $Previewimage And $Last = $Previewimage Then
        GUICtrlsetimage($Previewimage, "")
        _ResourceSetImageToCtrl($Previewimage, "Button_a")
        $Last = 0
    EndIf
EndFunc
pic1.png

pic2.png

bg.jpg

本帖子中包含更多资源

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

×
发表于 2009-12-26 10:00:35 | 显示全部楼层
帮你解决问题会花掉20金钱,划不来。
发表于 2009-12-26 10:03:20 | 显示全部楼层
背景色改成白色不好么
发表于 2009-12-26 11:21:54 | 显示全部楼层
回复 2# 顽固不化


哈哈.>!>!顶一下.
发表于 2009-12-26 15:32:15 | 显示全部楼层
还不错。。。。。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-15 11:06 , Processed in 0.081455 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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