求助。PNG做界面 按钮效果..
求助怎么样实现。鼠标移动到 最大化,最小化,关闭 那里的时候。替换一个别的PNG。
并可以点击。进行操作 。。。。以下代码是根据 298311657 的 《图片按钮+多张PNG图片做GUI背景示例》修改的
附上代码。求大大们指导下!#Region ;**** 参数创建于 ACNWrapper_GUI ****
#AutoIt3Wrapper_UseX64=n
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#include <WinAPI.au3>
#include <Thread.au3>
_RTEmptyWorkingSet();Thread.au3里的函数,减少内存占用的
Global $hGUIxx
Global $Width = 480, $Height = 320
Global $PanBtnRect,$topbutton,$topbuttonhoverimg,$topbuttondownimg,$topbuttontip
_GDIPlus_Startup()
$hGUI = GUICreate("CrossDoor_Player", $Width, $Height, -1, -1, $WS_CAPTION, $WS_EX_LAYERED)
#region 窗体背景
$bg = _GDIPlus_ImageLoadFromFile("ok.png")
$hGraphic = _GDIPlus_ImageGetGraphicsContext($bg)
$Bgbitmap = _GDIPlus_BitmapCreateFromGraphics($Width, $Height, $hGraphic)
$hGraphic2 = _GDIPlus_ImageGetGraphicsContext($Bgbitmap)
_GDIPlus_GraphicsDrawImageRect($hGraphic2, $bg, 0, 0, $Width, $Height)
$logo = _GDIPlus_ImageLoadFromFile("logo.png")
_GDIPlus_GraphicsDrawImageRect($hGraphic2, $logo, 1, 1, 478, 20)
$mini = _GDIPlus_ImageLoadFromFile("btn_mini_highlight.png")
_GDIPlus_GraphicsDrawImageRect($hGraphic2, $mini, 380, 0, 28, 20)
$max = _GDIPlus_ImageLoadFromFile("btn_max_highlight.png")
_GDIPlus_GraphicsDrawImageRect($hGraphic2, $max, 408, 0, 28, 20)
$close = _GDIPlus_ImageLoadFromFile("btn_close_highlight.png")
_GDIPlus_GraphicsDrawImageRect($hGraphic2, $close, 436, 0, 39, 20)
SetBitmap($hGUI, $Bgbitmap)
GUISetState()
#region 创建控件窗口,所有控件在此窗口建立
$ControlGUI = GUICreate("ControlGUI", 480, 340, 32, -20, $WS_POPUP, $WS_EX_LAYERED + $WS_EX_MDICHILD, $hGUI)
GUISetFont(11, 400, -1, "Comic Sans MS")
GUISetBkColor(0x123456, $ControlGUI)
GUISetState()
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND")
GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
While 1
Sleep(1000)
WEnd
Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam) ;命令消息回调函数
Dim $iIDFrom = BitAND($iwParam, 0xFFFF)
Dim $iCode = BitShift($iwParam, 16)
Dim $hControl = GUICtrlGetHandle($iIDFrom)
;~ Switch $iIDFrom
;~ Case $hTestBtn
;~ Switch $iCode
;~ Case 0
;~ MsgBox(0,"测试按钮!", GUICtrlRead($hText))
;~ EndSwitch
;~ Case $hExitBtn
;~ Switch $iCode
;~ Case 0
;~ jindt()
;~ EndSwitch
;~ EndSwitch
EndFunc
Func WM_SYSCOMMAND($hWnd, $Msg, $wParam, $lParam)
Local $nID = BitAND($wParam, 0x0000FFFF)
Switch $nID
Case 0xf060
If $hWnd = $HGui Then
Exit
Else
GUIDelete($hWnd)
EndIf
EndSwitch
EndFunc ;==>WM_SYSCOMMAND
Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
Switch $hWnd
Case $hGUI
Switch $iMsg
Case $WM_NCHITTEST
Return $HTCAPTION
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NCHITTEST
Func SetBitmap($hGUI, $hImage, $iOpacity = 255)
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", 1)
_WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
_WinAPI_SelectObject($hMemDC, $hOld)
_WinAPI_ReleaseDC(0, $hScrDC)
_WinAPI_DeleteDC($hMemDC)
_WinAPI_DeleteObject($hBitmap)
EndFunc ;==>SetBitmap
回复 1# z3519251
参考这个贴子。 回复z3519251
参考这个贴子。
freedom 发表于 2012-8-3 16:25 http://www.autoitx.com/images/common/back.gif
请问 参考那个帖子 ?? 怎么没人来帮帮忙呢 ?? 回复 4# z3519251
http://www.autoitx.com/thread-28704-1-1.html
不好意思,刚才没有发起。现在可以了。 本帖最后由 298311657 于 2012-8-3 21:59 编辑
#NoTrayIcon
#Region ;**** 参数创建于 ACNWrapper_GUI ****
#AutoIt3Wrapper_UseX64=n
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiButton.au3>
#include <GDIPlus.au3>
Global $IconInfo
Func IconInfo_Loading()
$IconInfo = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\btn_mini_highlight.png")
$IconInfo = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\btn_mini_down.png")
$IconInfo = False
$IconInfo = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\btn_max_highlight.png")
$IconInfo = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\btn_max_down.png")
$IconInfo = False
$IconInfo = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\btn_close_highlight.png")
$IconInfo = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\btn_close_down.png")
$IconInfo = False
EndFunc ;==>IconInfo_Loading
Global $hGUI
Global $Width = 480, $Height = 320
_GDIPlus_Startup()
$hGUI = GUICreate("CrossDoor", $Width, $Height, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
$cmdMini = GUICtrlCreateButton("", 380, 0, 28, 20)
GUICtrlSetTip(-1, "最小化窗口")
$cmdMax = GUICtrlCreateButton("", 408, 0, 28, 20)
GUICtrlSetTip(-1, "最大化窗口")
$cmdClose = GUICtrlCreateButton("", 436, 0, 39, 20)
GUICtrlSetTip(-1, "关闭窗口")
Global $Buttoninfo =
IconInfo_Loading()
$bg = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\ok.png")
$hGraphic = _GDIPlus_ImageGetGraphicsContext($bg)
$Bgbitmap = _GDIPlus_BitmapCreateFromGraphics($Width, $Height, $hGraphic)
$hGraphic2 = _GDIPlus_ImageGetGraphicsContext($Bgbitmap)
_GDIPlus_GraphicsDrawImageRect($hGraphic2, $bg, 0, 0, $Width, $Height)
$Ban = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\logo.png")
_GDIPlus_GraphicsDrawImageRect($hGraphic2, $Ban, 1, 1, 478, 20)
For $i = 0 To UBound($Buttoninfo) - 1
$trect = _WinAPI_GetWindowRect($Buttoninfo[$i])
$x = DllStructGetData($trect, "left")
$y = DllStructGetData($trect, "top")
$w = DllStructGetData($trect, "right") - DllStructGetData($trect, "left")
$h = DllStructGetData($trect, "Bottom") - DllStructGetData($trect, "top")
$trect = _WinAPI_GetWindowRect($hGUI)
$x = $x - DllStructGetData($trect, "left")
$y = $y - DllStructGetData($trect, "top")
_GDIPlus_GraphicsDrawImageRect($hGraphic2, $IconInfo[$i], $x, $y, $w, $h)
Next
SetBitmap($hGUI, $Bgbitmap)
GUISetState()
$ControlGUI = GUICreate("ControlGUI", 207, 23, 32, 40, $WS_POPUP, $WS_EX_LAYERED + $WS_EX_MDICHILD, $hGUI)
GUISetFont(11, 400, -1, "Comic Sans MS")
GUISetBkColor(0x123456, $ControlGUI)
$hinput = GUICtrlCreateInput("", 0, 0, 207, 23)
_API_SetLayeredWindowAttributes($ControlGUI, 0x123456, 195)
GUISetState()
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
AdlibRegister("ReduceMem", 60000) ;定时清理内存
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
_WinAPI_DeleteObject($Bgbitmap)
_GDIPlus_GraphicsDispose($hGraphic2)
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_Shutdown()
Func WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
Local Const $BCN_HOTITEMCHANGE = -1249
Local $tNMBHOTITEM = DllStructCreate("hwnd hWndFrom;int IDFrom;int Code;dword dwFlags", $lParam)
Local $nNotifyCode = DllStructGetData($tNMBHOTITEM, "Code")
Local $nID = DllStructGetData($tNMBHOTITEM, "IDFrom")
Local $hCtrl = DllStructGetData($tNMBHOTITEM, "hWndFrom")
Local $dwFlags = DllStructGetData($tNMBHOTITEM, "dwFlags")
Switch $nNotifyCode
Case $BCN_HOTITEMCHANGE; Win XP 支持
If BitAND($dwFlags, 0x10) = 0x10 Then
FlashCtl($hCtrl, True)
ElseIf BitAND($dwFlags, 0x20) = 0x20 Then
FlashCtl($hCtrl, False)
EndIf
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
Dim $iIDFrom = BitAND($iwParam, 0xFFFF)
Dim $iCode = BitShift($iwParam, 16)
Switch $iIDFrom
Case $cmdMini
If $iCode = $BN_CLICKED Then WinSetState($hWnd,"",@SW_MINIMIZE)
Case $cmdMax
If $iCode = $BN_CLICKED Then WinSetState($hWnd,"",@SW_MAXIMIZE)
Case $cmdClose
If $iCode = $BN_CLICKED Then Exit
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
Func FlashCtl($hControl, $iFlag)
_GDIPlus_GraphicsClear($hGraphic2, 0x00FFFFFF)
_GDIPlus_GraphicsDrawImageRect($hGraphic2, $bg, 0, 0, $Width, $Height)
_GDIPlus_GraphicsDrawImageRect($hGraphic2, $Ban, 1, 1, 478, 20)
For $i = 0 To UBound($Buttoninfo) - 1
$trect = _WinAPI_GetWindowRect($Buttoninfo[$i])
$x = DllStructGetData($trect, "left")
$y = DllStructGetData($trect, "top")
$w = DllStructGetData($trect, "right") - DllStructGetData($trect, "left")
$h = DllStructGetData($trect, "Bottom") - DllStructGetData($trect, "top")
$trect = _WinAPI_GetWindowRect($hGUI)
$x = $x - DllStructGetData($trect, "left")
$y = $y - DllStructGetData($trect, "top")
If $iFlag And $hControl = $Buttoninfo[$i] Then
_GDIPlus_GraphicsDrawImageRect($hGraphic2, $IconInfo[$i], $x, $y, $w, $h)
Else
_GDIPlus_GraphicsDrawImageRect($hGraphic2, $IconInfo[$i], $x, $y, $w, $h)
EndIf
Next
SetBitmap($hGUI, $Bgbitmap)
Sleep(30)
EndFunc
Func SetBitmap($hGUI, $hImage, $iOpacity = 255)
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", 1)
_WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
_WinAPI_SelectObject($hMemDC, $hOld)
_WinAPI_ReleaseDC(0, $hScrDC)
_WinAPI_DeleteDC($hMemDC)
_WinAPI_DeleteObject($hBitmap)
EndFunc ;==>SetBitmap
Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
Switch $hWnd
Case $hGUI
Switch $iMsg
Case $WM_NCHITTEST
Return $HTCAPTION
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NCHITTEST
Func _API_SetLayeredWindowAttributes($hwnd, $i_transcolor, $Transparency = 255, $isColorRef = False)
Local Const $AC_SRC_ALPHA = 1
Local Const $ULW_ALPHA = 2
Local Const $LWA_ALPHA = 0x2
Local Const $LWA_COLORKEY = 0x1
If Not $isColorRef Then
$i_transcolor = Hex(String($i_transcolor), 6)
$i_transcolor = Execute('0x00' & StringMid($i_transcolor, 5, 2) & StringMid($i_transcolor, 3, 2) & StringMid($i_transcolor, 1, 2))
EndIf
Local $Ret = DllCall("user32.dll", "int", "SetLayeredWindowAttributes", "hwnd", $hwnd, "long", $i_transcolor, "byte", $Transparency, "long", $LWA_COLORKEY + $LWA_ALPHA)
If @error Then
Return SetError(@error, 0, 0)
ElseIf $Ret = 0 Then
Return SetError(4, 0, 0)
Else
Return 1
EndIf
EndFunc ;==>_API_SetLayeredWindowAttributes
Func _ReduceMemory($i_PID = -1);内存释放函数
If $i_PID <> -1 Then
Local $ai_Handle = DllCall("kernel32.dll", "int", "OpenProcess", "int", 0x1f0fff, "int", False, "int", $i_PID)
Local $ai_Return = DllCall("psapi.dll", "int", "EmptyWorkingSet", "long", $ai_Handle)
DllCall("kernel32.dll", "int", "CloseHandle", "int", $ai_Handle)
Else
Local $ai_Return = DllCall("psapi.dll", "int", "EmptyWorkingSet", "long", -1)
EndIf
Return $ai_Return
EndFunc ;==>_ReduceMemory
Func ReduceMem()
_ReduceMemory(@AutoItPID)
EndFunc ;==>ReduceMem
像你这个效果完全没必要用PNG图片。普通的JPG或bmp图片就OK了,更简单
页:
[1]