帮忙用VC++6.0编写一个简易计时器。当鼠标左键单击时开始计时,鼠标右键单击时停止计时。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了帮忙用VC++6.0编写一个简易计时器。当鼠标左键单击时开始计时,鼠标右键单击时停止计时。相关的知识,希望对你有一定的参考价值。
// 下面代码实现暂停计时器并延迟20秒再启动killtime(1); // 停止1号计时器
SetTimer(2,20000,NULL); // 启动2号计时器,20秒后将触发OnTimer函数
// 下面是OnTimer函数实现
void OnTimer(UINT nIDEvent)
switch (nIDEvent)
case 1:
// 完成定时器1的功能
break;
case 2:
KillTime(2); // 杀掉定时器2
SetTimer(1,Step,NULL); // 启动定时器1
break;
在编程时,会经常使用到定时器。使用定时器的方法比较简单,通常告诉Windows一个时间间隔,然后WINDOWS以此时间间隔周期性触发程序。通常有两种方法来实现:发送WM_TIMER消息和调用应用程序定义的回调函数。
1.1 用WM_TIMER来设置定时器
先请看SetTimer这个API函数的原型
UINT_PTR SetTimer(
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)来取消定时器。 参考技术A 基本满足楼主的要求,就是没有做调整时间的功能。。内附报告。。呵呵楼主给个邮箱我发你一个。。 跳楼追问
793202655@qq.com
参考技术B 哈哈,好简单啊追问说下呗
opencv c ++中的鼠标事件
我想用这个功能编写一个程序:
当用户在窗口上单击鼠标左键时,构造一个半径为15的圆
起初我制作500 * 500的黑色图像
然后我使用setMouseCallback
for my_mouse_callback
和函数my_mouse_callback
我写了我的圆圈代码,当运行程序没有任何错误但只有一个黑色图像500 * 500当我点击鼠标左键没有任何反应,我知道我的程序有麻烦,但在哪里?请帮帮我我的程序是这样的:
void my_mouse_callback(int event, int x, int y, int flags, void* param);
int main() {
int i,j,k;
Mat image;
image.create(500,500,CV_8UC3);
namedWindow("amin");
for(i=0;i<500;i++){
for(j=0;j<500;j++){
for(k=0;k<3;k++){
Vec3b &intensity = image.at<vec3b>(j, i);
intensity.val[k]=0;
}
}
}
setMouseCallback( "amin", my_mouse_callback, &image );
imshow("amin",image);
waitKey(0);
return(0);
}
void my_mouse_callback( int event, int x, int y, int flags, void* param ) {
if(event==CV_EVENT_LBUTTONDOWN){
circle( image, Point(x,y), 20, Scalar(0xff,0xff,0xff) );
}
}
答案
这似乎是我没有使用的OpenCV,但是:
肯定无法从my_mouse_callback函数访问图像变量 - 它是main()的本地变量吗?你的意思是:
void my_mouse_callback( int event, int x, int y, int flags, void* param ) {
if(event==CV_EVENT_LBUTTONDOWN){
Mat* pImage = (Mat*)param;
Mat image = *pImage;
circle( image, Point(x,y), 20, Scalar(0xff,0xff,0xff) );
}
}
如果这个答案很愚蠢我会道歉,但我没有使用过CV,这是30秒文档阅读的结果。
另一答案
当我使用版本2.4.9的opencv时,我在modules / highgui / include / opencv2 / highgui.hpp中看到以下关键事件
enum
{
EVENT_MOUSEMOVE =0,
EVENT_LBUTTONDOWN =1,
EVENT_RBUTTONDOWN =2,
EVENT_MBUTTONDOWN =3,
EVENT_LBUTTONUP =4,
EVENT_RBUTTONUP =5,
EVENT_MBUTTONUP =6,
EVENT_LBUTTONDBLCLK =7,
EVENT_RBUTTONDBLCLK =8,
EVENT_MBUTTONDBLCLK =9
};
因此,请检查源文件,事件名称是否正确。
另一答案
替换这个:
imshow("amin",image);
waitKey(0);
用:
while(true){
imshow("amin",image);
waitKey(1);} // 1ms
以上是关于帮忙用VC++6.0编写一个简易计时器。当鼠标左键单击时开始计时,鼠标右键单击时停止计时。的主要内容,如果未能解决你的问题,请参考以下文章
用VC++ 6.0编写的程序怎么把它放到一个文件夹里,然后想用的时候用呢?
如何使用XPSP3下的VC++6.0制作以简单spider技术为核心的离线浏览器?