ミニタイマー(5) - Windows APIの抽象化

公開:2011-04-30 21:15
更新:2020-02-15 04:36
カテゴリ:windows,その他api,ミニタイマー,c++

今日はサムネイルボタンを実装しようとしていたけど、コードの書きなおしで終わってしまった。

サムネイルボタンの実装前にタスクバーのコードを分離するために、taskbarクラスというの作った。タスクバー自体WindowsべったりなのだけれどなんとなくヘッダーファイルからWindows APIコードを分離したくなってpimplを使って隠した。メソッドはタスクバーAPIはすべて網羅していない。必要なものだけを実装している。


namespace sf
{
struct taskbar : boost::noncopyable
{
struct exception
: public sf::win32_error_exception
{
exception(boost::uint32_t hr) : win32_error_exception(hr) {};
exception() : win32_error_exception() {} ;
};
taskbar();
~taskbar();
void create();
void discard();
void overlay_icon(sf::base_window& w,HICON icon,std::wstring& description);
void progress_state(sf::base_window& w,int state);
void progress_value(sf::base_window& w,boost::uint64_t completed, boost::uint64_t total);
static const int none;
static const int indeterminate;
static const int normal;
static const int error;
static const int paused;
private:
struct impl;
std::shared_ptr<impl> impl_;
};
}

しかしHICONが変数として残っているので、完全には隠せていない。でこれをどうするか考えていると、Windowをラップしているクラス周りもコードもWindows API部分を隔離したくなった。base_windowが基底クラス+Window基本実装としていたが、基底クラス(base_window)とWindow基本実装(base_win32_window)を分けた。x64なのにbase_win32_windowというのもおかしな感じだ。名前は後で直すことにしよう。HICONをどう抽象化するかはまだ考えがまとまらない。とりあえずvoid *にするかな。

OS依存実装を分離しておくと抽象度が高くなる。しかし私の場合クラス設計はあくまでWindowsをベースとしているので実際の抽象度はあまり高くない。抽象度を高くしたければクラス設計自体OSから離れて「あるべき」形にしたほうが良くできるだけそうしたいと考えているが、まだそこまでの境地にはまだ達していない。pimplというイディオムが好きなのでそうしているだけという面もある。実装変えてもヘッダはほとんどいじらなくなるのでコンパイル時間も短くて済むしね。

ソースコード

まだアプリとして完成していないけれど、私的には今のレベルで十分使えるものになっていて、実際に使っている。15分に1回、30秒間首を休めるとかなりたしかに首の凝りが軽減される。