• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            tqsheng

            go.....
            隨筆 - 366, 文章 - 18, 評論 - 101, 引用 - 0
            數(shù)據(jù)加載中……

            用Media Player設(shè)計個性化媒體播放器

              摘要:本文主要介紹了對Windows Media Player控件的使用方法,并在此基礎(chǔ)上完成個性化媒體播放程序的設(shè)計實現(xiàn)。

              關(guān)鍵字:ActiveX控件;多媒體;窗體半透明;熱鍵

              引言

              多媒體播放軟件現(xiàn)在幾乎成為每一臺家用計算機(jī)的裝機(jī)必備軟件,比較流行的有RealOne Player、Windows Media Player以及國產(chǎn)軟件金山影霸等等,通過這些軟件能夠播放RM、RMVB、MP3、MPEG、DAT等多種格式的多媒體文件。雖然這些商業(yè)軟件在功能上已經(jīng)做的相當(dāng)完備,但由于其產(chǎn)品開發(fā)是面向大多數(shù)普通消費者的,正所謂眾口難調(diào),這類軟件很難做到符合每一個消費者的口味。而作為一名程序員,完全可以利用自身的技術(shù)優(yōu)勢來對其進(jìn)行改造,以設(shè)計出為自己量身訂做的媒體播放軟件,改造后的軟件在使用時將更符合自己的使用習(xí)慣。本文即以Windows Media Player 9.0為例講述如何將其改造為個性化的媒體播放軟件。

              對Windows Media Player控件的基本控制

              在安裝了Windows Media Player 9.0后,一個Windows Media Player ActiveX控件也同時被安裝到系統(tǒng)并完成注冊。該控件為開發(fā)人員提供了Windows Media Player 9.0具備的絕大部分功能,能夠通過該控件比較輕松的實現(xiàn)對Windows Media Player 9.0的二次開發(fā)。

              為使用該控件,首先要將其添加到工程。點擊“Project”下“Add to Project”彈出的“Components and Controls…”子菜單,并從彈出對話框中進(jìn)入“Registered ActiveX Controls”目錄查找并添加Windows Media Player控件到工程。這時以CWMP開頭的17個類將被添加到工程。在資源視圖中將控件拖動到用來播放多媒體的對話框上并通過ClassWizard將控件與CWMPPlayer4類對象建立關(guān)聯(lián)。CWMPPlayer4類提供了與Windows Media Player控件進(jìn)行交互的基本方法,而且部分成員函數(shù)還能夠進(jìn)一步獲取得到其他相關(guān)類對象的實例。其中,SetUrl()和close()方法將能夠打開和關(guān)閉指定的媒體文件。在打開文件之后,能夠通過控件上的自帶按鈕控制媒體的播放、暫停、停止以及對音量的控制等。如果需要在程序中控制媒體的播放,可使用GetControls()函數(shù)返回CWMPControls類對象,并進(jìn)一步調(diào)用該對象的play()、stop()、pause()、fastForward()、fastReverse()等方法來完成播放、停止、暫停、快進(jìn)、快退等相應(yīng)動作;如果需要在程序中對控件屬性進(jìn)行設(shè)置和更改,可在GetSettings()方法返回一個CWMPSettings類的對象后通過其成員函數(shù)來完成相應(yīng)的設(shè)置,例如,下面這段代碼將把播放音量設(shè)置到最大:

            m_Setting = m_WMPPlayer.GetSettings();
            m_Setting.SetVolume(100);

              目前只是在窗口模式下播放媒體,大部分媒體播放軟件都提供有全屏播放功能,Windows Media Player也不例外,只需以TRUE為參數(shù)調(diào)用CWMPPlayer4類成員函數(shù) SetFullScreen()即可,在全屏模式下可以通過點擊鼠標(biāo)左鍵或是從右鍵彈出菜單退回到窗口播放模式。通過對CWMPPlayer4、CWMPSettings和CWMPControls等幾個類的使用可以實現(xiàn)Windows Media Player的大部分常規(guī)功能,如果需要做進(jìn)一步的控制,可以在用下面這些函數(shù)返回相關(guān)類對象后調(diào)用相關(guān)成員函數(shù)來加以實現(xiàn):

              GetCurrentMedia() 返回CWMPMedia類對象

              GetMediaCollection() 返回CWMPMediaCollection類對象

              GetPlaylistCollection() 返回CWMPPlaylistCollection類對象

              GetNetwork() 返回CWMPNetwork類對象

              GetCurrentPlaylist() 返回CWMPPlaylist類對象

              GetCdromCollection() 返回CWMPCdromCollection類對象

              GetClosedCaption() 返回CWMPClosedCaption類對象

              GetError() 返回CWMPError類對象

              GetDvd() 返回CWMPDVD類對象

              GetPlayerApplication() 返回CWMPPlayerApplication類對象

            熱鍵隱藏與呼出

              前面介紹的各種常規(guī)功能在Windows Media Player中都已經(jīng)具備,為了使設(shè)計的程序在使用方式上更適合自己,可以根據(jù)自己的需求添加一些Windows Media Player原本并不具備的個性化功能。例如,本程序下面將要添加的熱鍵迅速隱藏、呼出功能和可調(diào)半透明播放功能都是Windows Media Player所不具備的,而且就筆者這段時間的試用,感覺這兩種功能都還是相當(dāng)實用的。當(dāng)然,這里要添加的既然是“個性化”功能,那么就應(yīng)當(dāng)視讀者的個人喜好而決定到底要添加什么功能。筆者此處介紹的目的僅在于拋磚引玉。

              無論是金山影霸還是RealOne Player、Windows Media Player等主流媒體播放軟件都沒有提供徹底隱藏的功能,通常只能簡單的最小化至多不過縮小成任務(wù)區(qū)中的一個小圖標(biāo),這樣其實根本達(dá)不到隱藏的效果,如果暫時離開計算機(jī),他人可以很容易打開當(dāng)前正在執(zhí)行的媒體播放程序。這里將要實現(xiàn)的目標(biāo)是:程序主窗體的隱藏、在任務(wù)欄上的隱藏、在Alt+Tab鍵在程序間切換時的隱藏。這樣,程序在實施隱藏后他人將意識不到程序的執(zhí)行,可以達(dá)到非常好的隱身效果。由于隱藏后沒有任何窗口供用戶交互之用,因此需要添加熱鍵以在程序隱藏后能夠?qū)⑵鋸暮笈_呼出。

              首先要在程序中注冊一個熱鍵,無論該程序在前臺還是后臺運行,只要用戶按下這個熱鍵,程序?qū)⒘⒓磮?zhí)行在前、后臺間的切換。下面這段代碼在程序初始運行時執(zhí)行,通過對RegisterHotKey()的調(diào)用登記用于程序隱藏的熱鍵Ctrl + P(或Ctrl + p)和用于程序呼出的熱鍵Ctrl + Shift + A(或Ctrl + Shift + a):

            // 登記熱鍵
            HWND hWnd = GetSafeHwnd();
            RegisterHotKey(hWnd, 1001, MOD_CONTROL | MOD_SHIFT, 'A');
            RegisterHotKey(hWnd, 1002, MOD_CONTROL | MOD_SHIFT, 'a');
            RegisterHotKey(hWnd, 1003, MOD_CONTROL, 'P');
            RegisterHotKey(hWnd, 1004, MOD_CONTROL, 'p');

              其中,1001、1002等參數(shù)是這些熱鍵對應(yīng)的ID。在程序捕獲到熱鍵消息WM_HOTKEY后將通過這些ID來確認(rèn)按下的是哪個鍵。ClassWizard并沒有對消息WM_HOTKEY進(jìn)行封裝,需要手工添加對該消息的映射及處理。消息處理函數(shù)的wParam參數(shù)包含有按鍵的ID,下面是這部分實現(xiàn)代碼:

            switch(wParam) {
             case 1001:
             case 1002:
             {
              // 呼出程序
              HWND hWnd = GetSafeHwnd();
              LONG lStyle = ::GetWindowLong(m_hWnd, GWL_STYLE);
              lStyle &= ~WS_POPUP;
              ::SetWindowLong(m_hWnd, GWL_STYLE, lStyle);
              ::ShowWindow(m_hWnd, SW_SHOW);
              CWnd::SetForegroundWindow();
              m_Control.play(); // 繼續(xù)
              break;
             }
             case 1003:
             case 1004:
             {
              // 隱藏程序
              // 隱藏程序
              HWND hWnd = GetSafeHwnd();
              LONG lStyle = ::GetWindowLong(m_hWnd, GWL_STYLE);
              lStyle |= WS_POPUP;
              ::SetWindowLong(m_hWnd, GWL_STYLE, lStyle);
              ::ShowWindow(m_hWnd, SW_HIDE);
              m_Control.pause(); // 暫停
              break;
             }
            }

              在進(jìn)行窗體隱藏處理時,首先通過GetWindowLong()得到當(dāng)前窗口風(fēng)格,在此基礎(chǔ)上追加WS_POPUP風(fēng)格并由SetWindowLong()設(shè)置,修改后的窗體將具備工具條一樣的風(fēng)格,即不會在任務(wù)欄顯示窗體,在用Alt+Tab切換窗體時也不會出現(xiàn)。最后再以SW_HIDE調(diào)用ShowWindow()函數(shù)隱藏程序主窗口即達(dá)到徹底隱藏的目的。窗體呼出過程正與之相反:在GetWindowLong()函數(shù)得到當(dāng)前窗口風(fēng)格后,從中剔除WS_POPUP風(fēng)格并由SetWindowLong()設(shè)置,恢復(fù)程序原有的風(fēng)格,最后再以SW_SHOW調(diào)用ShowWindow()函數(shù)顯示程序主窗體。最后由CWnd類成員函數(shù)SetForegroundWindow()將呼出的程序顯示到前臺。

              需要注意的是,在程序退出前一定要將先前注冊的熱鍵注銷,由UnregisterHotKey()函數(shù)完成:

            HWND hWnd = GetSafeHwnd();
            UnregisterHotKey(hWnd, 1001);
            UnregisterHotKey(hWnd, 1002);


            窗體半透明效果實現(xiàn)

              窗體半透明這一功能實際是為了滿足“一心二用”的目的而特別添加的。筆者通常在播放媒體文件時閱讀電子圖書,將播放軟件設(shè)置為最前后總是占據(jù)不小的屏幕面積并遮擋了不少文字,使閱讀變的非常不便。因此才有了將播放軟件界面設(shè)置為半透明這一想法。

              傳統(tǒng)的Windows應(yīng)用程序想實現(xiàn)半透明效果,一般來說需要處理自己的窗口的WM_Paint消息窗口,比較麻煩。在Windows 2000以上版本的操作系統(tǒng)中提供有一個新的API函數(shù)SetLayeredWindowAttributes(),它能很方便的將窗體設(shè)置為半透明效果,其函數(shù)聲明如下:

            BOOL SetLayeredWindowAttributes(
             HWND hwnd, // handle to the layered window
             COLORREF crKey, // specifies the color key
             BYTE bAlpha, // value for the blend function
             DWORD dwFlags // action
            );

              其中dwFlags有LWA_ALPHA和LWA_COLORKEY兩種設(shè)置,如果LWA_ALPHA被設(shè)置的話,通過bAlpha決定透明度;如果LWA_COLORKEY被設(shè)置的話,則指定被透明掉的顏色為crKey,其他顏色則正常顯示。為了能夠使用該函數(shù),還必須在之前添加預(yù)定義語句:

            #define WS_EX_LAYERED 0x00080000

              在用GetModuleHandle()裝載USER32.DLL模塊并調(diào)用GetProcAddress()得到函數(shù) SetLayeredWindowAttributes()在User32.dll中的指針后就可以通過SetLayeredWindowAttributes()函數(shù)將窗體設(shè)置為半透明了:

            // 全局變量
            typedef BOOL (WINAPI *lpfn) (HWND hWnd, COLORREF cr, BYTE bAlpha, DWORD dwFlags);
            lpfn g_pSetLayeredWindowAttributes;
            ……
            // 獲取函數(shù) SetLayeredWindowAttributes 在User32.dll中的指針
            HMODULE hUser32 = GetModuleHandle(_T("USER32.DLL"));
            g_pSetLayeredWindowAttributes = (lpfn)GetProcAddress(hUser32, "SetLayeredWindowAttributes");
            if (g_pSetLayeredWindowAttributes == NULL)
             ::PostQuitMessage(0);
             ……
             // 半透明
             HWND hWnd = GetSafeHwnd();
             LONG lWindowLong = GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED;
             ::SetWindowLong(hWnd, GWL_EXSTYLE, lWindowLong);
             g_pSetLayeredWindowAttributes(hWnd, 0, (BYTE)m_sldAlpha.GetPos(), 2);
             ::RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);

              為了方便控制窗體的透明程度,可添加滑動條控件對其進(jìn)行控制。經(jīng)過這樣的處理,就可以在播放媒體時不受打擾地繼續(xù)閱讀被其遮擋的文字了。

              小結(jié)

              本文通過對Windows Media Player控件的使用實現(xiàn)了Windows Media Player 9.0媒體播放軟件所具備的一般功能,并以熱鍵隱藏、呼出窗體和窗體半透明設(shè)置為例介紹了個性化編程的一般方法。讀者可以根據(jù)需要以類似的方式通過對其他軟件提供的控件如Realplayer等的使用編寫支持其他格式媒體的個性化媒體播放程序。本文所述程序在Windows 2000 Professional 下由Microsoft Visaul C++ 6.0編譯調(diào)試通過,程序運行環(huán)境需要預(yù)先安裝Windows Media Player 9.0。

            http://www.chinabyte.net/SoftChannel/72342371928702976/20040922/1856774.shtml

            posted on 2006-01-17 11:16 tqsheng 閱讀(515) 評論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            亚洲精品视频久久久| A级毛片无码久久精品免费| 久久毛片一区二区| 久久SE精品一区二区| 国产综合久久久久| 国产精品99久久久久久猫咪 | 99久久国产热无码精品免费 | 东方aⅴ免费观看久久av| 久久精品中文字幕无码绿巨人| 亚洲国产精品久久久久久| 伊人情人综合成人久久网小说| 久久A级毛片免费观看| 亚洲国产天堂久久久久久| 久久久精品免费国产四虎| 国产精品中文久久久久久久| 久久精品国产免费| 一本一本久久A久久综合精品| 狠狠精品干练久久久无码中文字幕| 久久成人国产精品免费软件| 日本高清无卡码一区二区久久| 亚洲精品高清久久| 国产午夜久久影院| 日韩AV无码久久一区二区| 日韩精品无码久久一区二区三| 久久综合九色综合精品| 色婷婷综合久久久久中文 | 久久久久久久亚洲Av无码| 亚洲国产日韩综合久久精品| 久久99热这里只有精品国产| 亚洲国产成人久久精品影视| 国产91色综合久久免费分享| 久久精品无码午夜福利理论片| 久久无码专区国产精品发布| 久久久久久免费视频| 思思久久精品在热线热| 久久天天婷婷五月俺也去| 人人狠狠综合久久亚洲高清| 久久乐国产精品亚洲综合| 日本精品一区二区久久久| 亚洲国产精品无码久久久久久曰| 欧美激情精品久久久久久久九九九 |