広告

posted by fanblog

2016年03月16日

タスクバー(タスクトレイ)上のアプリアイコンで進捗状況表示

久々にクライアントアプリの開発をすることになった。
ネットワーク越しにファイル変換を行って、変換後のデータをもらい、ファイルに保存するという割と単純なものだが、ファイルサイズによっては時間がかかる場合もある。
そこでUI的に進捗状況を表示したいと思ったが、ダイアログ上にプログレスバーを表示するのは実装してみたが、何かしっくりこないので、別のインターフェースを模索していたら、Windows7以降で追加された、タスクバー上でのアイコンがプログレスバーのように変化するアプリがあるのを思い出し、まねをしてみようと思い立った。

WEBで検索してみると、 ITaskBar3インターフェースを使えばできそうということがわかった。

ITaskbarList3::SetProgressState

ところが、MSDNのどこにも、 ITaskbarList3のインスタンスの取得方法が書いていなかった。
昔、こうした状況だと、グローバル関数でインスタンスを作成していたという記憶があるのだが、どうも対応する生成関数などが見当たらない。

Excel のインスタンスを取得する際は、 CoGetClassObjectを使えばいいはず、ということから、関連で調べていくと、 単純に CoCreateInstanceすればいいのではないかということになったのだった。


ようやく、コードが作成でき、以下のような関数を作成して呼び出すようにしてみた

void setup_taskbar_marquee(HWND hWnd, bool bStart)
{
CComPtr pUnk;
HRESULT hr = CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_ALL, IID_ITaskbarList, (LPVOID*)&pUnk);
if (SUCCEEDED(hr)) {
CComQIPtr tbl(pUnk);
if (tbl) {
CComQIPtr tbl3(tbl);
if (tbl3) {
if (bStart) {
tbl3->SetProgressState(hWnd, TBPF_INDETERMINATE);
} else {
tbl3->SetProgressState(hWnd, TBPF_NOPROGRESS);
}
}
}
}
}


上記コードはマーキースタイルのプログレス表示で、開始と停止があるだけなので、使い方も簡単である

開始 setup_taskbar_marquee(hWnd, true)
停止 setup_taskbar_marquee(hWnd, false)

できてみればさほど難しいコードではないのだが、最初がわかるまでは結構調べるのに時間がかかってしまうものだ
これで見た目も、最近のアプリっぽくなり (もう古いか?) めでたし、めでたし

完全仮想化方式のVPS

タグ: C C++ Win32
この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/4853731
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック
Build a Mobile Site
スマートフォン版を閲覧 | PC版を閲覧
Share by: