Существует риск того, что пользовательские данные будут использоваться из более чем одного места, но я думаю, что хорошей практикой является сохранение окна пользовательского интерфейса, соответствующего его модели классов, этому указателю.
================================================================================================================================================================================================================================================

ываю SetTimer в функции класса.

Где TimerCallBack это:

Теперь мне нужно вызвать один из методов класса, который инициировал таймер, так как TimerCallBack является статическим, он больше не имеет доступа к объекту класса.

Я не могу найти способ передать указатель на объект вместе с SetTimer, чтобы я мог получить его обратно на функцию обратного вызова.

Есть ли другой способ добиться этого, если он не поддерживается с помощью SetTimer, то каким другим способом я могу это реализовать.

 что если вы направляете сообщения таймера в окно, вы можете просто сохранить данные пользователя вместе с окном.

Единственный способ сделать это с помощью TimerProc - создать класс, который управляет статической областью сопоставления идентификаторов таймера с объектами пользовательских данных.

Примерно так (так как это вопрос c ++, я просто реализую быстрый и грязный тип функтора, чтобы TimerMgr мог организовать обратные вызовы непосредственно членам классов, поэтому обычно вы пытаетесь хранить пользовательские данные:

Удаление таймеров с карты оставлено читателю в качестве упражнения :)

ClassCallback необходим для наследования Callback.статические переменные должны быть определеныКод теперь собирается и работает правильно на MSVC 9.0

ип UINT\_PTR, чтобы он соответствовал указателю, даже в 64 битах:

Обратите внимание, что вам нужно использовать фактический HWND. Если HWND имеет значение null, Windows сгенерирует idEvent внутри.



`HWND` параметр в`SetTimer` должно быть`non-NULL`.

Можно сохранить дополнительные данные в самом окне, используя функцию API`SetWindowLongPtr` с параметром`GWLP_USERDATA`.

Таким образом, вы можете добавить в свой класс следующую функцию:

и функция таймера маршрутизатора, которая определяет, что делать с данным таймером.

Это также позволяет использовать nEventID в качестве идентификатора функции для вызова.

Существует риск того, что пользовательские данные будут использоваться из более чем одного места, но я думаю, что хорошей практикой является сохранение окна пользовательского интерфейса, соответствующего его модели классов, этому указателю.



`CWnd::OnTimer` означает, что у вас есть доступ к классу), и у вас нет`HWND` (вы могли бы установить свойство на HWND при создании таймера и вернуть его обратно в свой процесс), есть другая опция.

`SetTimer` возвращает`UINT_PTR` который является идентификатором таймера. Это то, что вы получите в своем`TimerProc` и также перейдет к`KillTimer` когда вы закончите с этим. Используя это, мы можем создать карту, которая отображает идентификатор таймера на некоторый определенный пользователем объект вашего создания:

Затем мы создаем ваш таймер:

И в вашей процедуре: