Win32API SetTimer関数のコールバック関数 クラスのメンバ関数を使う
::SetTimerのコールバック関数にメンバ関数を設定したい話題について考える。
参考URLのQ&Aで記載されていたのでそのまま流用して動作確認してみた。
皆さん、悩むところのようです。
動機
同僚が試してみたけどできなかった・・・と言ってたので。
確認環境
Visual Studio 2012 Pro
ポイント
[1] 直接メンバ関数をSetTimer関数のコールバックに設定することは難しいみたい。
- やり方がいまいちわからず。std::bind() つかって std::function::target<>()などやり方はあるらしい。今回は,Q&Aサイトで紹介されていた方法を試してみる。
[2] SetTimer関数の第2引数(UINT_PTR idEvent)で割り当てた値(id)がコールバック関数の第3引数(UINT_PTR idEvent)に渡される。その値(idEvent)を定義クラスのインスタンスのアドレスを渡す。これをキャストすれば、いけんじゃね?
という考えらしい。
条件
・ SetTimer関数の第一引数(HWND)を0(NULL)に設定すること。
・ メンバ関数の定義にはvirtual指定をひとつも入れないこと。
ー やると例外が発生する。
ー 代替案としては、外部から処理クラスを注入する形で対応化(サブクラスによる実現)
コード
参考URL
>関数リファレンス
https://msdn.microsoft.com/ja-jp/library/Cc411200.aspx
https://msdn.microsoft.com/ja-jp/library/cc411217.aspx
https://msdn.microsoft.com/ja-jp/library/cc410876.aspx
>Q&A
>C++11 std:function , std::bind , 関数ポインタの混在について
http://program.station.ez-net.jp/special/handbook/cpp/syntax/func-pointer.bridge.asp
>C++ 日本語リファレンス std::function::target()
http://cpprefjp.github.io/reference/functional/function/target.html
>std:: function , std::bind の使い方について
http://kaworu.jpn.org/cpp/std::bind