显示同步进度
[与此页面关联的功能(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 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈