GGG

プログラミング言語やソフトウェア開発について思ったことを書いてます

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

https://social.msdn.microsoft.com/Forums/ja-JP/1a0354fc-8e7c-4d75-b65e-6e38041b6e5d/c-how-send-the-class-pointer-with-settimer-function?forum=vclanguage 

>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://torini.hateblo.jp/entry/2015/03/22/%E9%96%A2%E6%95%B0%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%82%88%E3%82%8A%E3%82%82std%3A%3Afunction%E3%82%92%E4%BD%BF%E3%81%8A%E3%81%86

http://kaworu.jpn.org/cpp/std::bind

http://kaworu.jpn.org/cpp/std::function

http://ramemiso.hateblo.jp/entry/2013/12/23/134645