帮忙用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编写的程序怎么把它放到一个文件夹里,然后想用的时候用呢?

C#如何实现鼠标左键自动点击并自己设定点击间隔

如何使用XPSP3下的VC++6.0制作以简单spider技术为核心的离线浏览器?

案例:简易的Div拖拽

编程问题:用Visual studio编写的程序cpp文件和sin文件用VC++6.0打开怎么全是乱码

vc6.0编程如何在程序内模拟鼠标键盘操作?(急急急,在线高分等待)