读书人

讯息函数ontimer 函数是不是只能放在对

发布时间: 2012-09-09 09:27:54 作者: rapoo

消息函数ontimer 函数是不是只能放在对话框的类里面
我建了一个对话框,然后添加了一个类 CraneTower,然后我在这个 CraneTower类里添加了一个ontimer 消息响应函数。我想问一下,我这个消息响应函数的settime 应该在哪?

class CraneTower : public CDialog
{
DECLARE_DYNAMIC(CraneTower)

public:
CraneTower(CWnd* pParent = NULL); // 标准构造函数
virtual ~CraneTower();

// 对话框数据
enum { IDD = IDD_CT_DIALOG };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

DECLARE_MESSAGE_MAP()
public:
// 回转角度
float angle[8];
//afx_msg void OnTimer(UINT_PTR nIDEvent);
afx_msg void OnTimer(UINT_PTR nIDEvent);
};



void CraneTower::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
angle[0]++;
CDialog::OnTimer(nIDEvent);
}

我在对话框的初始化程序内,放置了
BOOL CCTDlg::OnInitDialog()
{
……
SetTimer(TIMER1,100,NULL);
……
}


这样之后发现,没有进入CraneTower::OnTimer 函数,想到,在对话框初始化函数中放置SetTimer(TIMER1,100,NULL); 应该是默认的CCTDlg::类内的,所以定时器响应的应该是CCTDlg::类内的ontimer函数,于是添加该函数,果然进来了。

void CCTDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

CDialog::OnTimer(nIDEvent);
}


我现在的问题是,如果我想用CraneTower::OnTimer 函数来处理,那么我的SetTimer(TIMER1,100,NULL); 应该放在哪里?怎么写?






[解决办法]
1. CCTDlg::OnTimer函数中调用CraneTower::OnTimer.
2. 可以使用SetTimer的第三个参数,可以设置一个回调函数,详细说明看MSDN.
[解决办法]
因为SetTimer的位置其实默认就是使用了当前的窗口句柄
不然也可以:
UINT_PTR SetTimer(
HWND hWnd, // handle to window
UINT_PTR nIDEvent, // timer identifier
UINT uElapse, // time-out value
TIMERPROC lpTimerFunc // timer procedure
);
MFC SetTimer随便你放在哪里都行,只要在你的窗口句柄相同的类里
SDK下,随意

读书人网 >C++

热点推荐