找回密码
 加入
搜索
楼主: shenrenba

[原创] 音乐播放器(主要功能已有)

[复制链接]
发表于 2012-5-5 17:32:59 | 显示全部楼层
界面不错。。。。。。。。。
发表于 2012-5-6 09:21:44 | 显示全部楼层
进度条 要改改
发表于 2012-5-28 12:13:57 | 显示全部楼层
这个不错。。。。。。。。。
发表于 2012-5-28 12:14:13 | 显示全部楼层
下载了看看  之前也写过累死的
发表于 2012-10-8 23:21:22 | 显示全部楼层
飘过的说。。。。。。。。。没什么实际意义
发表于 2012-10-9 08:12:56 | 显示全部楼层
支持一下,
发表于 2012-10-9 12:35:29 | 显示全部楼层
顶一下,希望楼主开放源码让大家学习一下,共同进步啊!
发表于 2012-10-10 10:13:38 | 显示全部楼层
牛人啊
发表于 2012-10-12 14:27:10 | 显示全部楼层
回复 1# shenrenba
播放时,鼠标移到音量出错。
桌面歌词字迹不清,我的后续修改版好像是清晰的了,桌面歌词为什么没放入移动功能?

评分

参与人数 1金钱 +30 收起 理由
shenrenba + 30

查看全部评分

 楼主| 发表于 2012-10-13 09:10:00 | 显示全部楼层
回复 54# seniors


    我试了下  我这音量没出错
   下面是歌词的代码   我没发现问你  要不你看看吧
#include <Array.au3>
#include <GdiPlus.au3>
#include <GDIPlusEx.au3>
#include <sound.au3>
#include <WindowsConstants.au3>
Global $lrcsm = "桌面歌词 by seniors"
Global $outlrc = $lrcsm, $Nolrc = False, $gecisize = 38
;     播放区域数组,歌词存放数组,计时       ,当前歌词在数组中的序,  拖动进度获取进度时间
Local $kalaXY[4], $kalageci[2][2], $startlrct, $startlrci = 1, $startlrctemp = 0
Global $kalacolor[5][5] = [[0xFF263E57, 0xFF004696, 0xFF02B9EE, 0xFFEA8B95, 0xFFD33243],[0xFF263E57, 0xFF441A5E, 0xFFE972F0, 0xFFFe818C, 0xFFFEE885],[0xFF263E57, 0xFFBA0000, 0xFFFF7800, 0xFFFE3214, 0xFFFFFE82],[0xFF263E57, 0xFF616161, 0xFF2D2D2D, 0xFFC8C8C8, 0xFF7B7B7B],[0xFF263E57, 0xFF5DA71B, 0xFF42AA00, 0xFFCBFE86, 0XFF99FE11]]
Global $hPen ;;歌词描边用画笔
Global $hBrushTitle ;;正常歌词填充画刷,1为竖直方向渐变
Global $hBrushTitlekala ;卡拉OK画刷
Global $nowopen = 1;现在播放了这句歌词的百分数
Local $taskpos = WinGetPos("[class:Shell_TrayWnd]");获取任务栏
;       主界面,       宽度,        高度
Global $desklrc_gui, $desklrc_width, $desklrc_height
;       歌词界面,       宽度,               高度
Global $desklrc_gui_lrc, $desklrc_lrc_width, $desklrc_lrc_height

#region
;界面
OnAutoItExitRegister("_exit")
$desklrc_width = 219
$desklrc_height=28
$desklrc_lrc_width = $taskpos[2] - 400
$desklrc_lrc_height = $gecisize + 6 + $desklrc_height
$desklrc_gui = GUICreate("", $desklrc_width, $desklrc_height, ($taskpos[2] - $desklrc_width) / 2, $taskpos[1] - $desklrc_height - $gecisize, $WS_POPUP, $WS_EX_LAYERED, WinGetHandle(AutoItWinGetTitle()))
$desklrc_gui_lrc = GUICreate("", $desklrc_lrc_width, $gecisize + 6, -400, $desklrc_height, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD, $WS_EX_TOPMOST), $desklrc_gui)
GUISetState(@SW_HIDE, $desklrc_gui)
GUISetState(@SW_SHOW, $desklrc_gui_lrc)
_GDIPlus_Startup()
pencolor(0)
showgeci()

;以下为测试代码
Local $mp3path="D:\music\郑智化 - 水手.mp3"
Local $lrcpath=@ScriptDir&"\Lyric\郑智化 - 水手.lrc"
Local $mp3open=_SoundOpen($mp3path)
_SoundPlay($mp3open)
$startlrct=TimerInit()
LoadLrc($lrcpath)
AdlibRegister("startlrc",200)
Do
        Sleep(100)
Until GUIGetMsg()=-3
Func _exit()
        _GDIPlus_Shutdown()
        Exit
        EndFunc
#endregion

;歌词文件分类存入数组  $kalageci,数组最后序为歌曲的总时间
Func LoadLrc($lrc_path)
        Local $str = FileRead($lrc_path)
        If @error Then
                $Nolrc = True
                $outlrc = $lrcsm
                FileClose($lrc_path)
                Return SetError(0)
        EndIf
        $Nolrc = False
        FileClose($lrc_path)
        ReDim $kalageci[2][2]
        $kalageci[0][0] = 0
        Local $maxtime = 1, $temp_str
        Local $aStr = StringRegExp($str, '\[(\d{2}:\d{2}.\d{2})\]([^\r\n]*)', 3)
        For $i = 0 To UBound($aStr) - 1 Step 2
                $kalageci[$maxtime][0] = Execute(StringLeft($aStr[$i], 2) * 60 + StringTrimLeft($aStr[$i], 3))
                If StringRegExpReplace($aStr[$i + 1], "\s", "") = "" Then
                        $kalageci[$maxtime][1] = "MUSIC"
                Else
                        Local $sstr = StringRegExp($aStr[$i + 1], '\[(\d{2}:\d{2}.\d{2})\]', 3)
                        If @error Then
                                $kalageci[$maxtime][1] = $aStr[$i + 1]
                        Else
                                $temp_str = StringRegExpReplace($aStr[$i + 1], '\[(\d{2}:\d{2}.\d{2})\]', "")
                                If StringRegExpReplace($temp_str, "\s", "") = "" Then $temp_str = "MUSIC"
                                $kalageci[$maxtime][1] = $temp_str
                                For $ii = 0 To UBound($sstr) - 1
                                        $maxtime += 1
                                        ReDim $kalageci[$maxtime+1][2]
                                        $kalageci[$maxtime][0] = Execute(StringLeft($sstr[$ii], 2) * 60 + StringTrimLeft($sstr[$ii], 3))
                                        $kalageci[$maxtime][1] = $temp_str
                                Next
                        EndIf
                EndIf
                $maxtime += 1
                ReDim $kalageci[$maxtime+1][2]
        Next
        $kalageci[$maxtime][0]=9999
        _ArraySort($kalageci)
EndFunc   ;==>LoadLrc

Func startlrc()
        ;歌词显示处理
        For $ii = 1 To UBound($kalageci) - 2
                ;调整歌曲进度时获取当前播放的歌词
                If (Round(TimerDiff($startlrct) / 1000 + $startlrctemp) < Round($kalageci[$ii][0])) And (Round(TimerDiff($startlrct) / 1000 + $startlrctemp) > Round($kalageci[$ii - 1][0])) Then
                        $outlrc = $kalageci[$ii - 1][1]
                        $startlrci = $ii
                EndIf
                ;正常播放时获取
                If (Round(TimerDiff($startlrct) / 1000 + $startlrctemp) == Round($kalageci[$ii][0])) And ($kalageci[$ii][1] <> $outlrc) Then
                        $outlrc = $kalageci[$ii][1]
                        $startlrci = $ii + 1
                        ExitLoop
                EndIf
        Next
        kalaok()
EndFunc   ;==>startlrc

Func kalaok()
        If $Nolrc Then Return
        ;为了让进度完美点  -0.8
        $nowopen = (TimerDiff($startlrct) / 1000 + $startlrctemp - $kalageci[$startlrci - 1][0]) / ($kalageci[$startlrci][0] - $kalageci[$startlrci - 1][0] - 0.8)
        showgeci()
EndFunc   ;==>kalaok

;以下为seniors代码
Func pencolor($ji)
        Local $tRect = _GDIPlus_RectFCreate(0, 0, 40, $gecisize);设置区域色块
        $hPen = _GDIPlus_PenCreate($kalacolor[$ji][0], 2, 0);歌词描边用画笔
        $hBrushTitle = _GDIPlus_LineBrushCreateFromRect($tRect, $kalacolor[$ji][1], $kalacolor[$ji][2], 1, 3);正常歌词填充画刷,1为竖直方向渐变
        $hBrushTitlekala = _GDIPlus_LineBrushCreateFromRect($tRect, $kalacolor[$ji][3], $kalacolor[$ji][4], 1, 3);卡拉OK画刷
EndFunc   ;==>pencolor
Func showgeci()
        geci($outlrc, "黑体", $gecisize, $hBrushTitle, $hPen, $hBrushTitlekala, $nowopen)
EndFunc   ;==>showgeci
Func geci($sString, $sFont, $nSize, $hBrush, $hPenB, $hBrushkala, $pencent)
        Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($desklrc_gui_lrc)
        Local $hFormat = _GDIPlus_StringFormatCreate(0x0004)
        _GDIPlus_StringFormatSetAlign($hFormat, 1);1为设置歌词居中显示
        Local $hFamily = _GDIPlus_FontFamilyCreate($sFont)
        Local $tLayout, $hPath
        $tLayout = _GDIPlus_RectFCreate(0, 6, $desklrc_lrc_width, $gecisize + 6)
        Local $hBitmap = _GDIPlus_BitmapCreateFromGraphics($desklrc_lrc_width, $gecisize + 6, $hGraphics)
        Local $hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap)
        _GDIPlus_GraphicsClear($hContext, 0x00000000)
        DllCall($ghGDIPDll, "uint", "GdipSetTextRenderingHint", "hwnd", $hContext, "int", 4)
        $hPath = _GDIPlus_PathCreate()
        _GDIPlus_PathAddString($hPath, $sString, $tLayout, $hFamily, 0, $nSize, $hFormat);读取歌词外形为路径;0是正常字,38是字号
        DllCall($ghGDIPDll, "uint", "GdipDrawPath", "hwnd", $hContext, "hwnd", $hPenB, "hwnd", $hPath);字体描边
        DllCall($ghGDIPDll, "uint", "GdipFillPath", "hwnd", $hContext, "hwnd", $hBrush, "hwnd", $hPath)
        Local $kalareg = _GDIPlus_RegionCreateFromPath($hPath);歌词路径转换为区域
        Local $kalaXY = _GDIPlus_PathGetWorldBounds($hPath);歌词的区域范围
        Local $tkalaRect = _GDIPlus_RectFCreate($kalaXY[0], $kalaXY[1], $kalaXY[2] * $pencent, $kalaXY[3]);设置已播放区域
        Local $pkalaRect = DllStructGetPtr($tkalaRect)
        DllCall($ghGDIPDll, "uint", "GdipCombineRegionRect", "hwnd", $kalareg, "ptr", $pkalaRect, "int", 1);获得已播放区域和歌词区域的交集,1为交集
        DllCall($ghGDIPDll, "uint", "GdipFillRegion", "hwnd", $hContext, "hwnd", $hBrushkala, "hwnd", $kalareg)
        _GDIPlus_RegionDispose($kalareg)
        _GDIPlus_PathDispose($hPath)
        _GDIPlus_FontFamilyDispose($hFamily)
        _GDIPlus_StringFormatDispose($hFormat)
        _GDIPlus_GraphicsDispose($hContext)
        SetBitmap($desklrc_gui_lrc, $hBitmap, 255)
        _GDIPlus_BitmapDispose($hBitmap)
        _GDIPlus_GraphicsDispose($hGraphics)
EndFunc   ;==>geci
Func SetBitmap($hGUI, $hImage, $iOpacity)
        Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend
        $hScrDC = _WinAPI_GetDC(0)
        $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
        $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
        $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
        $tSize = DllStructCreate($tagSIZE)
        $pSize = DllStructGetPtr($tSize)
        DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
        DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
        $tSource = DllStructCreate($tagPOINT)
        $pSource = DllStructGetPtr($tSource)
        $tBlend = DllStructCreate($tagBLENDFUNCTION)
        $pBlend = DllStructGetPtr($tBlend)
        DllStructSetData($tBlend, "Alpha", $iOpacity)
        DllStructSetData($tBlend, "Format", 1)
        _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
        _WinAPI_ReleaseDC(0, $hScrDC)
        _WinAPI_SelectObject($hMemDC, $hOld)
        _WinAPI_DeleteObject($hBitmap)
        _WinAPI_DeleteDC($hMemDC)
EndFunc   ;==>SetBitmap
发表于 2012-10-13 14:23:39 | 显示全部楼层
看不到频谱
发表于 2012-10-13 20:36:19 | 显示全部楼层
回复 56# shenrenba
可能上班用的笔记本不对,在家里歌词窗口没出现什么问题
下面代码帮你[1]增加了背景透明灰窗口,并且让窗口可以移动,去除了一些多余变量
[2]字迹更加光滑处理
#include <Array.au3>
#include <GdiPlus.au3>
#include <GDIPlusEx.au3>
#include <sound.au3>
#include <WindowsConstants.au3>
Global $lrcsm = "桌面歌词 by seniors"
Global $outlrc = $lrcsm, $Nolrc = False, $gecisize = 38
;     播放区域数组,歌词存放数组,计时       ,当前歌词在数组中的序,  拖动进度获取进度时间
Local $kalaXY[4], $kalageci[2][2], $startlrct, $startlrci = 1, $startlrctemp = 0
Global $kalacolor[5][5] = [[0xFF263E57, 0xFF004696, 0xFF02B9EE, 0xFFEA8B95, 0xFFD33243],[0xFF263E57, 0xFF441A5E, 0xFFE972F0, 0xFFFe818C, 0xFFFEE885],[0xFF263E57, 0xFFBA0000, 0xFFFF7800, 0xFFFE3214, 0xFFFFFE82],[0xFF263E57, 0xFF616161, 0xFF2D2D2D, 0xFFC8C8C8, 0xFF7B7B7B],[0xFF263E57, 0xFF5DA71B, 0xFF42AA00, 0xFFCBFE86, 0XFF99FE11]]
Global $hPen ;;歌词描边用画笔
Global $hBrushTitle ;;正常歌词填充画刷,1为竖直方向渐变
Global $hBrushTitlekala ;卡拉OK画刷
Global $nowopen = 1;现在播放了这句歌词的百分数
Local $taskpos = WinGetPos("[class:Shell_TrayWnd]");获取任务栏
;       歌词界面,       宽度,               高度
Global $desklrc_gui_lrc, $desklrc_lrc_width, $desklrc_lrc_height

#region
;界面
OnAutoItExitRegister("_exit")
$desklrc_lrc_width = $taskpos[2] - 400
$desklrc_lrc_height = $gecisize + 6
$desklrc_gui = GUICreate("", $desklrc_lrc_width, $desklrc_lrc_height, ($taskpos[2] - $desklrc_lrc_width) / 2, $taskpos[1] - $desklrc_lrc_height, $WS_POPUP, $WS_EX_LAYERED, WinGetHandle(AutoItWinGetTitle()))
$desklrc_gui_lrc = GUICreate("", $desklrc_lrc_width, $desklrc_lrc_height, 0, 0, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD, $WS_EX_TOPMOST), $desklrc_gui)
GUISetState(@SW_HIDE, $desklrc_gui)
GUISetState(@SW_SHOW, $desklrc_gui_lrc)
GUIRegisterMsg($WM_NCHITTEST, 'WM_NCHITTEST')
GUIRegisterMsg($WM_NCMOUSEMOVE, 'WM_NCMOUSEMOVE')
Global Const $WM_NCMOUSELEAVE = 0x02A2
GUIRegisterMsg($WM_NCMOUSELEAVE, 'WM_NCMOUSELEAVE')
GUIRegisterMsg($WM_MOVE, 'WM_MOVE')
GUISetCursor(0, 1, $desklrc_gui)
_GDIPlus_Startup()
beijing()
pencolor(0)
showgeci()

;以下为测试代码
Local $mp3path = @ScriptDir & "\陈奕迅-好久不见.mp3"
Local $lrcpath = @ScriptDir & "\陈奕迅-好久不见.lrc"
Local $mp3open = _SoundOpen($mp3path)
_SoundPlay($mp3open)
$startlrct = TimerInit()
LoadLrc($lrcpath)
AdlibRegister("startlrc", 200)
Do
        Sleep(100)
Until GUIGetMsg() = -3
Func _exit()
        _GDIPlus_Shutdown()
        Exit
EndFunc   ;==>_exit
#endregion

Func WM_NCHITTEST($hWnd, $Msg, $wParam, $lParam)
        Switch $hWnd
                Case $desklrc_gui
                        Return $HTCAPTION;返回这值让窗口可以移动
                Case $desklrc_gui_lrc
                        GUISetState(@SW_SHOW, $desklrc_gui);当鼠标在歌词上时显示透明灰背景窗口
                        Return $HTTRANSPARENT
        EndSwitch
EndFunc   ;==>WM_NCHITTEST

Func WM_NCMOUSEMOVE($hWnd, $Msg, $wParam, $lParam)
        Switch $hWnd
                Case $desklrc_gui
                        _WinAPI_TrackMouseEvent($hWnd, 0x00000012);鼠标移出时返回WM_NCMOUSELEAVE消息 
        EndSwitch
EndFunc   ;==>WM_NCMOUSEMOVE

Func WM_NCMOUSELEAVE($hWnd, $Msg, $wParam, $lParam)
        Switch $hWnd
                Case $desklrc_gui
                        GUISetState(@SW_HIDE, $desklrc_gui);鼠标移出,透明灰背景窗口隐藏
        EndSwitch
EndFunc   ;==>WM_NCMOUSELEAVE

Func WM_MOVE($hWnd, $Msg, $wParam, $lParam)
        Switch $hWnd
                Case $desklrc_gui
                        GUISetState(@SW_SHOW, $desklrc_gui);窗口移动时,显示透明灰背景窗口
        EndSwitch
EndFunc   ;==>WM_MOVE

;歌词文件分类存入数组  $kalageci,数组最后序为歌曲的总时间
Func LoadLrc($lrc_path)
        Local $str = FileRead($lrc_path)
        If @error Then
                $Nolrc = True
                $outlrc = $lrcsm
                FileClose($lrc_path)
                Return SetError(0)
        EndIf
        $Nolrc = False
        FileClose($lrc_path)
        ReDim $kalageci[2][2]
        $kalageci[0][0] = 0
        Local $maxtime = 1, $temp_str
        Local $aStr = StringRegExp($str, '\[(\d{2}:\d{2}.\d{2})\]([^\r\n]*)', 3)
        For $i = 0 To UBound($aStr) - 1 Step 2
                $kalageci[$maxtime][0] = Execute(StringLeft($aStr[$i], 2) * 60 + StringTrimLeft($aStr[$i], 3))
                If StringRegExpReplace($aStr[$i + 1], "\s", "") = "" Then
                        $kalageci[$maxtime][1] = "MUSIC"
                Else
                        Local $sstr = StringRegExp($aStr[$i + 1], '\[(\d{2}:\d{2}.\d{2})\]', 3)
                        If @error Then
                                $kalageci[$maxtime][1] = $aStr[$i + 1]
                        Else
                                $temp_str = StringRegExpReplace($aStr[$i + 1], '\[(\d{2}:\d{2}.\d{2})\]', "")
                                If StringRegExpReplace($temp_str, "\s", "") = "" Then $temp_str = "MUSIC"
                                $kalageci[$maxtime][1] = $temp_str
                                For $ii = 0 To UBound($sstr) - 1
                                        $maxtime += 1
                                        ReDim $kalageci[$maxtime + 1][2]
                                        $kalageci[$maxtime][0] = Execute(StringLeft($sstr[$ii], 2) * 60 + StringTrimLeft($sstr[$ii], 3))
                                        $kalageci[$maxtime][1] = $temp_str
                                Next
                        EndIf
                EndIf
                $maxtime += 1
                ReDim $kalageci[$maxtime + 1][2]
        Next
        $kalageci[$maxtime][0] = 9999
        _ArraySort($kalageci)
EndFunc   ;==>LoadLrc

Func startlrc()
        ;歌词显示处理
        For $ii = 1 To UBound($kalageci) - 2
                ;调整歌曲进度时获取当前播放的歌词
                If (Round(TimerDiff($startlrct) / 1000 + $startlrctemp) < Round($kalageci[$ii][0])) And (Round(TimerDiff($startlrct) / 1000 + $startlrctemp) > Round($kalageci[$ii - 1][0])) Then
                        $outlrc = $kalageci[$ii - 1][1]
                        $startlrci = $ii
                EndIf
                ;正常播放时获取
                If (Round(TimerDiff($startlrct) / 1000 + $startlrctemp) == Round($kalageci[$ii][0])) And ($kalageci[$ii][1] <> $outlrc) Then
                        $outlrc = $kalageci[$ii][1]
                        $startlrci = $ii + 1
                        ExitLoop
                EndIf
        Next
        kalaok()
EndFunc   ;==>startlrc

Func kalaok()
        If $Nolrc Then Return
        ;为了让进度完美点  -0.8
        $nowopen = (TimerDiff($startlrct) / 1000 + $startlrctemp - $kalageci[$startlrci - 1][0]) / ($kalageci[$startlrci][0] - $kalageci[$startlrci - 1][0] - 0.8)
        showgeci()
EndFunc   ;==>kalaok

;以下为seniors代码
Func pencolor($ji)
        Local $tRect = _GDIPlus_RectFCreate(0, 0, 40, $gecisize);设置区域色块
        $hPen = _GDIPlus_PenCreate($kalacolor[$ji][0], 2, 0);歌词描边用画笔
        $hBrushTitle = _GDIPlus_LineBrushCreateFromRect($tRect, $kalacolor[$ji][1], $kalacolor[$ji][2], 1, 3);正常歌词填充画刷,1为竖直方向渐变
        $hBrushTitlekala = _GDIPlus_LineBrushCreateFromRect($tRect, $kalacolor[$ji][3], $kalacolor[$ji][4], 1, 3);卡拉OK画刷
EndFunc   ;==>pencolor
Func showgeci()
        geci($outlrc, "黑体", $gecisize, $hBrushTitle, $hPen, $hBrushTitlekala, $nowopen)
EndFunc   ;==>showgeci
Func geci($sString, $sFont, $nSize, $hBrush, $hPenB, $hBrushkala, $pencent)
        Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($desklrc_gui_lrc)
        Local $hFormat = _GDIPlus_StringFormatCreate(0x0004)
        _GDIPlus_StringFormatSetAlign($hFormat, 1);1为设置歌词居中显示
        Local $hFamily = _GDIPlus_FontFamilyCreate($sFont)
        Local $tLayout, $hPath
        $tLayout = _GDIPlus_RectFCreate(0, 6, $desklrc_lrc_width, $gecisize + 6)
        Local $hBitmap = _GDIPlus_BitmapCreateFromGraphics($desklrc_lrc_width, $gecisize + 6, $hGraphics)
        Local $hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap)
        _GDIPlus_GraphicsClear($hContext, 0x00000000)
        ;下面两句是新增加的平滑处理,我一时看不出效果,好像太光滑了
        _GDIPlus_GraphicsSetSmoothingMode($hContext,2);绘制质量 2 - 使用 8 X 8 矩形过滤器
        _GDIPlus_GraphicsSetInterpolationMode($hContext, 7);7=High-quality, bicubic interpolation.
        ;下面这句是原来的一个光滑处理
        DllCall($ghGDIPDll, "uint", "GdipSetTextRenderingHint", "hwnd", $hContext, "int", 4)
        $hPath = _GDIPlus_PathCreate()
        _GDIPlus_PathAddString($hPath, $sString, $tLayout, $hFamily, 0, $nSize, $hFormat);读取歌词外形为路径;0是正常字,38是字号
        DllCall($ghGDIPDll, "uint", "GdipDrawPath", "hwnd", $hContext, "hwnd", $hPenB, "hwnd", $hPath);字体描边
        DllCall($ghGDIPDll, "uint", "GdipFillPath", "hwnd", $hContext, "hwnd", $hBrush, "hwnd", $hPath)
        Local $kalareg = _GDIPlus_RegionCreateFromPath($hPath);歌词路径转换为区域
        Local $kalaXY = _GDIPlus_PathGetWorldBounds($hPath);歌词的区域范围
        Local $tkalaRect = _GDIPlus_RectFCreate($kalaXY[0], $kalaXY[1], $kalaXY[2] * $pencent, $kalaXY[3]);设置已播放区域
        Local $pkalaRect = DllStructGetPtr($tkalaRect)
        DllCall($ghGDIPDll, "uint", "GdipCombineRegionRect", "hwnd", $kalareg, "ptr", $pkalaRect, "int", 1);获得已播放区域和歌词区域的交集,1为交集
        DllCall($ghGDIPDll, "uint", "GdipFillRegion", "hwnd", $hContext, "hwnd", $hBrushkala, "hwnd", $kalareg)
        _GDIPlus_RegionDispose($kalareg)
        _GDIPlus_PathDispose($hPath)
        _GDIPlus_FontFamilyDispose($hFamily)
        _GDIPlus_StringFormatDispose($hFormat)
        _GDIPlus_GraphicsDispose($hContext)
        SetBitmap($desklrc_gui_lrc, $hBitmap, 255)
        _GDIPlus_BitmapDispose($hBitmap)
        _GDIPlus_GraphicsDispose($hGraphics)
EndFunc   ;==>geci

Func beijing();歌词后面的透明灰窗口
        Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($desklrc_gui)
        Local $hBitmap = _GDIPlus_BitmapCreateFromGraphics($desklrc_lrc_width, $desklrc_lrc_height, $hGraphics)
        Local $hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap)
        _GDIPlus_GraphicsClear($hContext, 0x33000000)
        SetBitmap($desklrc_gui, $hBitmap, 255)
        _GDIPlus_GraphicsDispose($hContext)
        _GDIPlus_BitmapDispose($hBitmap)
        _GDIPlus_GraphicsDispose($hGraphics)
EndFunc   ;==>beijing
Func SetBitmap($hGUI, $hImage, $iOpacity)
        Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend
        $hScrDC = _WinAPI_GetDC(0)
        $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
        $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
        $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
        $tSize = DllStructCreate($tagSIZE)
        $pSize = DllStructGetPtr($tSize)
        DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
        DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
        $tSource = DllStructCreate($tagPOINT)
        $pSource = DllStructGetPtr($tSource)
        $tBlend = DllStructCreate($tagBLENDFUNCTION)
        $pBlend = DllStructGetPtr($tBlend)
        DllStructSetData($tBlend, "Alpha", $iOpacity)
        DllStructSetData($tBlend, "Format", 1)
        _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
        _WinAPI_ReleaseDC(0, $hScrDC)
        _WinAPI_SelectObject($hMemDC, $hOld)
        _WinAPI_DeleteObject($hBitmap)
        _WinAPI_DeleteDC($hMemDC)
EndFunc   ;==>SetBitmap
发表于 2014-8-15 00:09:54 | 显示全部楼层
什么冬休啊
发表于 2014-9-18 18:34:58 | 显示全部楼层
路过而已 啊
发表于 2014-9-18 19:09:04 | 显示全部楼层
东东不错,记得上次有个人问我关于调节音量的问题,不知道是不是楼主。。。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-3-29 22:19 , Processed in 0.081893 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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