アフィリエイト広告を利用しています

広告

この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
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
ファン
検索
<< 2016年03月 >>
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
最新記事
最新コメント
タグクラウド
カテゴリアーカイブ
プロフィール
いしちゃんさんの画像
いしちゃん
ブログ
プロフィール
日別アーカイブ
×

この広告は30日以上新しい記事の更新がないブログに表示されております。