使用SetTimer的回调函数时,如何处理定义全局变量,

使用SetTimer的回调函数时,如何避免定义全局变量,在线等!!!
SetTimer函数的原型
UINT_PTR SetTimer(
HWND hWnd, // 窗口句柄
UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
UINT nElapse, // 时间间隔,单位为毫秒
TIMERPROC lpTimerFunc // 回调函数
);
回调函数就我了解要么全局 要么类内的静态成员函数可以用。
如果使用类内的静态成员函数 就不得不避免在函数中调用当前类的函数 这个对于稍微大一点的项目来说几乎不可避免。
那么我就像知道 是不是还有别的方法可以让我在避免定义全局变量的情况下,正常的使用SetTimer的回调函数?

------解决方案--------------------
有一种取巧的办法, 但是当需要多个定时器时, 不能起作用.
因为EventID是32位的, 正好可以保存对象指针. 所以可以把当前对象指针作为eventid传入. 这样就能调用成员函数了.
当然, 这样的话,  就只能有一个定时器工作了.

否则全局或者静态变量是不可避免的了.  

当然, 也有hack的方法.   因为成员函数会多一个参数. 只要你自己使用其它方式获取成员函数的地址, 然后处理堆栈平衡, 那也是可以使用成员函数来做的.
------解决方案--------------------
我是这样做的,,,

举个MFC里使用的情况,控制台类似,用一个成员变量
CXXXDlg * pDlg;

在OnInitDialog函数中把当前对话框指针赋值给pDlg, pDlg=this;
把静态函数的处理逻辑全部放到普通函数,比如 void MyFunc(),,,在静态函数中使用pDlg->MyFunc()。
------解决方案--------------------
引用:
Quote: 引用:

定义成类静态成员是可以访问类的成员变量和方法的(共有私有都可以访问);
或者可以用友元来定义都是可以的。

能举例么 我测试过应该是不能的吧 你是否使用某种特殊的方式访问



// CXXDlg.h
class CXXDlg : public CDialog
{
......
private:
static VOID CALLBACK TestTimerProc(HWND hwnd, UINT uMsg,UINT_PTR idEvent,DWORD dwTime);
}

//CXXDlg.cpp
VOID CXXDlg:TestTimerProc(HWND hwnd, UINT uMsg,UINT_PTR idEvent,DWORD dwTime)
{
     //在这里是可以访问CXXDlg类的所有成员变量和方法的
    CXXDlg *pDlg = (CXXDlg*)(AfxGetApp()->m_lpMainWnd);
    pDlg->xxxxxx;
}

------解决方案--------------------
可以利用 hWnd 对应的窗体,储存数据