プログレスダイアログ(IProgressDialog)を使用するサンプル

Platform SDKではWin2K以上と記述されているが、実際にはIE5.0以上
(2001.05.09)
#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;
}
一覧に戻る
© 2003 WAC.com All Right Reserved.