刚开始学VC,问一个问题大家不要见笑哦!
我在书上看到一个例子,在单文档窗口显示一句话,颜色会渐变。书中写道“先安装一个定时器”,我想请问,定时器要怎么装?需要加控件还是怎么样?
我照着书上介绍的方法,添加代码,可是编译的时候有俩错误:
MenuView.obj : error LNK2001: unresolved external symbol "public: virtual class CScrollBar * __thiscall CMenuView::GetScrollBarCtrl(int)const " (?GetScrollBarCtrl@CMenuView@@UBEPAVCScrollBar@@H@Z)
Debug/Menu.exe : fatal error LNK1120: 1 unresolved externals
不知道是啥意思,应该怎么解决。
我在书上看到一个例子,在单文档窗口显示一句话,颜色会渐变。书中写道“先安装一个定时器”,我想请问,定时器要怎么装?需要加控件还是怎么样?
我照着书上介绍的方法,添加代码,可是编译的时候有俩错误:
MenuView.obj : error LNK2001: unresolved external symbol "public: virtual class CScrollBar * __thiscall CMenuView::GetScrollBarCtrl(int)const " (?GetScrollBarCtrl@CMenuView@@UBEPAVCScrollBar@@H@Z)
Debug/Menu.exe : fatal error LNK1120: 1 unresolved externals
不知道是啥意思,应该怎么解决。
安装一个定时器 SetTimer(1,100,NULL); 就定义一个定时器了
afx_msg void OnTimer (UINT nTimerID)
// In Cxxx.cpp BEGIN_MESSAGE_MAP (Cxxx, Cyyy)
ON_WM_TIMER ()
END_MESSAGE_MAP ()void Cxxx::OnTimer (UINT nTimerID)
{
// Your code
}建议你找本好书看看
别看 垃圾书 :)
忘了 还要有
SetTimer (... )在 OnCreate 里面就行。
HWND hWnd, // 窗口句柄
UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
UINT uElapse, // 时间间隔,单位为毫秒
TIMERPROC lpTimerFunc // 回调函数
);例如
SetTimer(m_hWnd,1,1000,NULL); //一个1秒触发一次的定时器
在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了,例如:UINT SetTimer(1,100,NULL);
函数反回值就是第一个参数值1,表示此定时器的ID号。第二个参数表示要等待100毫秒时间再重新处理一次。第三个参数在这种方法中一般用NULL。
注意:设置第二个参数时要注意,如果设置的等待时间比处理时间短,程序就会出问题了。1.2 调用回调函数此方法首先写一个如下格式的回调函数void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime);
然后再用SetTimer(1,100,TimerProc)函数来建一个定时器,第三个参数就是回调函数地址。二、多个定时器的实现与应用我们在安装定时器时都为其指定了ID,使用多个定时器时,该ID就发挥作用了。
不使用MFC时,当接收到WM_TIMER消息,WPARAM wParam中的值便是该定时器的ID
使用MFC时就更简单了,我们为其增加WM_TIME的消息处理函数OnTimer即可,请看如下例子
void CTimerTestDlg::OnTimer(UINT nIDEvent)
{
switch (nIDEvent)
{
case 24: ///处理ID为24的定时器
Draw1();
break;
case 25: ///处理ID为25的定时器
Draw2();
break;
}
CDialog::OnTimer(nIDEvent);
}
当你用回调函数时,我们可以根据nTimerid的值来判断是哪个定时器,例如:
void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)
{
switch(nTimerid)
{
case 1: ///处理ID为1的定时器
Do1();
break;
case 2: ///处理ID为2的定时器
Do2();
break;
}
}
三、取消定时器不再使用定时器后,我们应该调用KillTimer来取消定时,KillTimer的原型如下BOOL KillTimer(
HWND hWnd, // 窗口句柄
UINT_PTR uIDEvent // ID
);
在MFC程序中我们可以直接调用KillTimer(int nIDEvent)来取消定时器。
然后在程序中需要的地方,用SetTimer设立计数器。
我的第一个VC程序终于运行出来了,这要感谢大家的帮助。
我以前一直都用VB,包括ASP,VB.NET,VBA。感觉VC和VB就是不一样,主要是VC自动帮你生成的东西太多了,刚开始根本搞不清楚应该往哪里加东西,应该怎么加,连不要用的东西,你都不能简单的删除了事,VC真是挺复杂的。