読者です 読者をやめる 読者になる 読者になる

Gobble up pudding

プログラミングの記事がメインのブログです。

MENU

Direct2D + WIC + Windows APIでアナログ時計

C++ DirectX Windows API Programming
スポンサードリンク

Direct2D + WIC + Windows APIでアナログ時計を作りました。
MSDNのサンプルとチュートリアルを見ながら、サンプルを改変してコードを書きました。
2014/11/20 更新
unordered_map使用時のバグ修正(実はmapのままでもまずい部分があったけど……)。
あとは無駄な処理が残っていたので削除しました。また、説明等少し充実させました。
秒針が最外周のフレームを突っ切っていたのでそれもなおしました。
変更詳細が知りたい場合はGistのRevisionを参照ください。

ちなみに私の最初の記事はGDIのみを使ったアナログ時計のでした。
……貼ってあるコードを動かしてみると、動きませんでした。バグってました。
あと、プログラミング自体が初心者だったというのと
言語の面でも半端なく理解が浅いところがあったらしく、
なんじゃこりゃというコードを書いてました。
とりあえず、最低限のバグを取って動くようにしました。

以前作成したアナログ時計

f:id:fa11enprince:20141115034725p:plain

今回作成したアナログ時計(ポップアップウィンドウ使用)

f:id:fa11enprince:20141120233026p:plain

ずいぶんゴージャスになりましたね。
いや、元の画像素材がいいからだけども。
ウィンドウを透過させたり、Direct2D + WICでPNG画像を読込んでやったり
ぐるぐる回してやったり…いや、ぐるぐる回してるコードは
サンプルに既に書いてあったんだけど。
ちなみにPOPUPのスタイルのウィンドウなので×ボタンがありません。
ということで、右クリックで「終了」とだけ出るコンテキストメニューで
終了するように回避しました。
画像以外のソースコードを貼っておきます。
リソースは手書きするような代物じゃないけど、一応載せておきます。
解説・補足は気が向いたときにでも追記しておきます。
だいたい、ソースのコメント読んでいただければ理解できるかとは思いますが。
ただ、正直僕自身のCOM、Direct2Dの理解が浅いです……。

GitHub

GitHubにあげましたgithub.com

その他気になったこと

unordered_mapを頑張って使おうと思いましたがwstringをキーにするとどうもうまくいきません。
これは僕がバグってるのでしょうか?
Visual studio 2013がバグってるのでしょうか…。
stringだとうまくいく上に、普通のmap(赤黒木版)ならうまくいくんですけどね……。何故(。´・ω・)?

僕がバグっていました。std::stringのときはたまたまうまくいっていただけです。
map/unordered_mapは挿入順番とイテレータで回した時の順番があうことは通常ないです。
mapのときは赤黒木なのでキーで定義した並び順に並びますが、
unoredered_mapは中身がhashなのでキーの順序はぐちゃぐちゃになります。
名前の通りunorederedです。
にもかかわらず、
ClockScene.hの140,~200行目あたりで
僕のコードは挿入順が保たれる前提で書いていました。
気が付かなかった……。

なお、名古屋313 (id:nagoya313)さんのご指摘通り
unordered_mapの場合でキーをconst std::wstringにすると
コンパイル時に

error C2338: The C++ Standard doesn't provide a hash for this type.

とでました。