顯示同步處理進度
[與此頁面相關聯的功能Windows 媒體播放機 SDK是舊版功能。 MediaPlayer已取代它。 MediaPlayer已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用MediaPlayer,而不是Windows 媒體播放機 SDK。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。
您可以向使用者顯示同步處理進度。 下列範例程式碼示範如何使用 IWMPSyncDevice::get_progress建立計時器,定期擷取目前的進度值。 請注意,所擷取的進度值代表每個裝置的整個同步處理作業的進度。 不支援擷取個別媒體專案的同步處理進度。
若要判斷何時啟動或停止計時器,請處理 DeviceSyncStateChange 事件。 下列範例函式示範這類事件處理常式。 此程式碼也會使用名為 IDC_SYNCSTATE 的靜態文字控制項,將目前的同步處理狀態顯示為文字字串。
void CMainDlg::DeviceSyncStateChange( IWMPSyncDevice * pDevice, WMPSyncState NewState )
{
if(NULL == pDevice)
{
return;
}
HRESULT hr = E_POINTER;
VARIANT_BOOL vbIdentical = VARIANT_FALSE;
// Window handle for static text control that shows the sync state.
HWND hwndSyncStateText = GetDlgItem(IDC_SYNCSTATE);
// Strings to show sync state.
const TCHAR *szSyncState[3] = {
_T("Unknown"),
_T("Synchronizing"),
_T("Stopped")};
// Get a pointer to the device the user selected in the list box.
CComPtr<IWMPSyncDevice> spDevice(m_ppWMPDevices[GetSelectedDeviceIndex()]);
// Cache the pointer to the device that raised the event.
CComPtr<IWMPSyncDevice> spDeviceParam(pDevice);
if(spDevice.p)
{
// Test whether the device that raised the event is the same as
// the one the user selected.
hr = spDevice->isIdentical(spDeviceParam, &vbIdentical);
}
if(SUCCEEDED(hr) &&
vbIdentical == VARIANT_TRUE)
{
// Display the sync state.
SendMessage(hwndSyncStateText, WM_SETTEXT, 0, (LPARAM)szSyncState[NewState]);
switch(NewState)
{
case wmpssSynchronizing:
// Start the progress timer.
SetTimer(1, 1000, NULL);
SetUIState(Synchronizing, TRUE);
break;
case wmpssStopped:
// Stop the progress timer.
KillTimer(1);
// Make sure the final progress is displayed.
ShowProgress(GetSelectedDeviceIndex());
SetUIState(Partnership, TRUE);
break;
default:
break;
}
}
}
當計時器執行時,它會以一秒間隔傳送WM_TIMER訊息。 應用程式會在其訊息迴圈中處理WM_TIMER。
下列範例函式示範如何使用靜態文字控制項 (IDC_PROGSTATIC) ,以及使用進度控制項 (IDC_SYNCPROG) 來顯示進度。 呼叫此函式以回應WM_TIMER訊息,並在同步處理常式完成時,如上述範例所示。
STDMETHODIMP CMainDlg::ShowProgress(long lIndex)
{
ATLASSERT(m_ppWMPDevices);
long lProgress = 0;
WCHAR buffer[10]; // Buffer larger than needed to hold progress string.
ZeroMemory(buffer, sizeof WCHAR * 10);
// Retrieve a handle to the progress control
HWND hwndSyncProgressCtl = GetDlgItem(IDC_SYNCPROG);
// Retrieve a handle to the static control that displays
// progress as text.
HWND hwndSyncProgressText = GetDlgItem(IDC_PROGSTATIC);
CComPtr<IWMPSyncDevice> spDevice(m_ppWMPDevices[lIndex]);
HRESULT hr = spDevice->get_progress(&lProgress);
// Convert progress to a string and add the percent character.
_ltow(lProgress, buffer, 10);
CComBSTR bstrProgress(buffer);
bstrProgress += " %";
// Display the text.
::SendMessage(hwndSyncProgressText, WM_SETTEXT, 0, (LPARAM)(LPCTSTR)COLE2T(bstrProgress));
// Set the progress control position.
::SendMessage(hwndSyncProgressCtl, PBM_SETPOS, (WPARAM)(int)lProgress, 0);
return hr;
}
相關主題
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應