- 締切済み
MFCを使わないで、プログレスバーを表示したい。
複数のファイルで構成されているフォルダがあって、そのフォルダのコピーを作成する処理を行うとします。 その処理の進行状況を、ダイアログボックス上に貼り付けたプログレスバーコントロールで表示したい と思っているのですが、MFCを使用しない例はネットなどで検索しても見つけることができません。 例えば、フォルダの容量の「現在○○%コピーしました。」とか、それが無理なら全体の何ファイル目を処理 しているかなどを、プログレスバーで表示することは可能ですか。 数値的な表示が無理なら、現在処理中かどうかを表示するだけでも構いません。 ご教授の程、よろしくお願いいたします。 環境:VC++6.0, WIN32 API
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス >フォルダの容量の「現在○○%コピーしました。」とか、それが無理なら全体の何ファイル目を処理 >しているかなどを、プログレスバーで表示することは可能ですか。 ↑ 両方とも工夫さえすれば可能です。 ただし両方とも1ファイルがコピーし終えたときに計算することになります。 巨大なファイルをコピー中は表示が更新されません。ここも更新できるようにするのは コピー処理を自分で実装してその内部でプログレスバーを表示させるようになります。 ・でも今回はコピー中にプログレスバーを表示したいだけならエクスプローラからコピー した時に出てくるダイアログを使ってみてはどうでしょうか。 つまりシェル関数の SHFileOperation です。 ・この関数は1つで複数のファイルをコピー、移動、削除、ごみ箱へ移動などが行えます。 それもダイアログを表示あり、表示なしなどをオプションで切り替えることが可能です。 この API 関数を利用すればコピー中に自動的にダイアログを表示してくれます。 サンプル: #include <ShellAPI.h> ←インクルード SHFILEOPSTRUCT FileOp; TCHAR szCopy[ MAX_PATH ] = TEXT("コピー先のフルパス名"); TCHAR szPath[ 32 * 1024 ]; ←ちょっと大きめ(32 KB) LPTSTR lpTail = szPath; // パスのコピー処理(コピー時の容量をチェックして下さい) lpTail += wsprintf( lpTail, TEXT("%s"), szPath1 ); *lpTail++ = '\0'; lpTail += wsprintf( lpTail, TEXT("%s"), szPath2 ); *lpTail++ = '\0'; lpTail += wsprintf( lpTail, TEXT("%s"), szPath3 ); *lpTail++ = '\0'; : lpTail += wsprintf( lpTail, TEXT("%s"), szPath100 ); *lpTail++ = '\0'; *lpTail++ = '\0'; // コピー設定 FileOp.hwnd = hWnd; ←ウインドウ・ハンドル(ダイアログなど) FileOp.wFunc = FO_COPY; ←コピー指定 FileOp.pFrom = szPath; ←コピー元ファイル&フォルダ名 FileOp.pTo = szCopy; ←コピー先フォルダ名 FileOp.fFlags = FOF_MULTIDESTFILES; FileOp.fAnyOperationsAborted = FALSE; FileOp.hNameMappings = NULL; FileOp.lpszProgressTitle = NULL; ←タイトル名を設定できそう // コピー処理 SHFileOperation( &FileOp ); 最後に: ・SHFileOperation() 関数はあまり詳しくないので上記の方法で上手くいくかちょっと不安です。 次のサイトを参考にしました。 http://www.geocities.co.jp/SiliconValley-Sunnyvale/8635/api19.txt オプションなどの定数は『ShellAPI.h』を開き『SHFILEOPSTRUCT』構造体を検索すれば直ぐに 見つかります。 ・以上。上記のサンプルは動作テストしていません。利用時は注意して下さい。
- php504
- ベストアンサー率42% (926/2160)
下記のサイトが参考にならないでしょうか http://www.kumei.ne.jp/c_lang/sdk/sdk_72.htm
お礼
早速のご回答ありがとうございます。 すでにそのサイトはチェックしておりました。 私の勉強不足・力不足もあるかとは思うのですが、プログレスバーを作る上で大変参考にはなりましたが、 私が目的としている処理の実装は実現できませんでした。
お礼
いつもお世話になっております。 お返事が大変遅くなってしまい申し訳ありません。 体調を崩して寝込んでおりました。 シェル関数は使用したことがないのですが、この機会に身に付けたいと思います。 上手く動きましたら、補足にてご報告させていただきます。 ありがとうございました。