• <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
            數據加載中……

            用Media Player設計個性化媒體播放器

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

              關鍵字:ActiveX控件;多媒體;窗體半透明;熱鍵

              引言

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

              對Windows Media Player控件的基本控制

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

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

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

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

              GetCurrentMedia() 返回CWMPMedia類對象

              GetMediaCollection() 返回CWMPMediaCollection類對象

              GetPlaylistCollection() 返回CWMPPlaylistCollection類對象

              GetNetwork() 返回CWMPNetwork類對象

              GetCurrentPlaylist() 返回CWMPPlaylist類對象

              GetCdromCollection() 返回CWMPCdromCollection類對象

              GetClosedCaption() 返回CWMPClosedCaption類對象

              GetError() 返回CWMPError類對象

              GetDvd() 返回CWMPDVD類對象

              GetPlayerApplication() 返回CWMPPlayerApplication類對象

            熱鍵隱藏與呼出

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

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

              首先要在程序中注冊一個熱鍵,無論該程序在前臺還是后臺運行,只要用戶按下這個熱鍵,程序將立即執行在前、后臺間的切換。下面這段代碼在程序初始運行時執行,通過對RegisterHotKey()的調用登記用于程序隱藏的熱鍵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等參數是這些熱鍵對應的ID。在程序捕獲到熱鍵消息WM_HOTKEY后將通過這些ID來確認按下的是哪個鍵。ClassWizard并沒有對消息WM_HOTKEY進行封裝,需要手工添加對該消息的映射及處理。消息處理函數的wParam參數包含有按鍵的ID,下面是這部分實現代碼:

            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(); // 繼續
              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;
             }
            }

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

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

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


            窗體半透明效果實現

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

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

            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兩種設置,如果LWA_ALPHA被設置的話,通過bAlpha決定透明度;如果LWA_COLORKEY被設置的話,則指定被透明掉的顏色為crKey,其他顏色則正常顯示。為了能夠使用該函數,還必須在之前添加預定義語句:

            #define WS_EX_LAYERED 0x00080000

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

            // 全局變量
            typedef BOOL (WINAPI *lpfn) (HWND hWnd, COLORREF cr, BYTE bAlpha, DWORD dwFlags);
            lpfn g_pSetLayeredWindowAttributes;
            ……
            // 獲取函數 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);

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

              小結

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

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

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

            久久国产精品无码HDAV| 精品久久久久久久国产潘金莲| 精品久久久久久无码专区不卡| 久久综合综合久久97色| 99久久夜色精品国产网站| 人妻无码精品久久亚瑟影视| 日产精品久久久一区二区| 国产综合免费精品久久久| 东方aⅴ免费观看久久av| 国产午夜精品理论片久久 | 亚洲精品高清国产一线久久| 国产精品久久久久影院色| 日韩美女18网站久久精品| 国产精品久久久久久吹潮| 日韩欧美亚洲综合久久| 国产69精品久久久久99尤物| 天天躁日日躁狠狠久久| 久久午夜综合久久| 国产精品欧美久久久久无广告| 一本色道久久88精品综合| 人妻无码精品久久亚瑟影视| 久久国产免费观看精品| 国产精品99久久免费观看| 久久天天婷婷五月俺也去| 久久av免费天堂小草播放| 久久夜色精品国产亚洲| 日产精品久久久久久久性色| 精品久久久无码人妻中文字幕| 久久一区二区三区免费| 91精品国产91久久久久久青草| 久久久精品2019免费观看| 无码AV中文字幕久久专区| 久久这里只有精品首页| 久久国产亚洲精品| 一级做a爰片久久毛片毛片| 久久综合色区| 久久毛片一区二区| 久久久噜噜噜久久中文字幕色伊伊 | 人人狠狠综合88综合久久| 久久精品国产一区二区电影| 国产精品va久久久久久久|