#include <stdio.h>
#include <comdef.h>
_COM_SMARTPTR_TYPEDEF(IProgressDialog, IID_IProgressDialog);
// ダイアログクラス(ATLベース)の中の関数だとして。。。
HRESULT Test()
{
IProgressDialogPtr spProgressDialog;
HRESULT hr = spProgressDialog.CreateInstance(CLSID_ProgressDialog);
if (FAILED(hr))
{
// IE5以上がインストールされていない場合、作成できない。
return hr;
}
// ダイアログのタイトルを設定
spProgressDialog->SetTitle(L"処理中...");
// アニメーションを設定
spProgressDialog->SetAnimation(_Module.m_hInst, IDA_OPERATION_ANIMATION);
// ダイアログを表示
spProgressDialog->StartProgressDialog(m_hWnd, NULL, PROGDLG_AUTOTIME, NULL);
// キャンセルを押された時に表示するメッセージを設定
spProgressDialog->SetCancelMsg(L"Please wait while the current operation is cleaned up", NULL);
spProgressDialog->Timer(PDTIMER_RESET, NULL);
DWORD dwComplete = 0;
DWORD dwTotal = 100;
for (int nIndex = 0; nIndex < 100; nIndex++)
{
// キャンセルボタンを押されたか?
BOOL bCancelled = spProgressDialog->HasUserCancelled();
if (TRUE == bCancelled)
{
break;
}
// メッセージを設定
WCHAR wszMessage[1024];
swprintf(wszMessage, L"%d番目の処理を実行中です", nIndex);
spProgressDialog->SetLine(2, wszMessage, FALSE, NULL);
// 本当は、ここに何らかの処理が入る。。。
::Sleep(50);
// プログレスを設定
dwComplete += 1;
spProgressDialog->SetProgress(dwComplete, dwTotal);
}
// ダイアログを閉じる
spProgressDialog->StopProgressDialog();
spProgressDialog = NULL;
return S_OK;
}