1. 程式人生 > >視窗滑鼠事件的響應 在滑鼠視窗中繪製矩形的程式

視窗滑鼠事件的響應 在滑鼠視窗中繪製矩形的程式

這裡主要是訓練怎麼去響應滑鼠響應事件,那怎麼去定義滑鼠響應函式呢?

void CvMouseCallback(

int event;//滑鼠響應事件的型別如滑鼠右鍵彈起,右鍵按下,CV_EVENT_LBUTTONDOWN,CV_EVENT_LBUTTONDOWN)

int x,//滑鼠響應是所在的位置,這裡x,y是指畫素座標,所以與視窗的大小無關,它只是用畫素來定位

int y,

int falgs,//指定了每一個事件在發生時的不同狀態

void *param//這個引數由註冊滑鼠響應時間的時候傳入

)//cvMouseCallback名字是可以改變的,不準確,應該說必須改---

另外一個重要函式就是

CvSetMouseCallback(

const char*window_name,//視窗的名字,也就是你要捕獲哪個視窗的滑鼠響應事件

CvMouseCallback  on_mouse,//你的滑鼠響應事件函式的名字

void * param=NULL//這個引數就是就是要傳進滑鼠響應事件的引數,在本例中,我使用的是將影象的地址傳進去

}

下面附上

#include "cv.h"
#include "highgui.h"
#include "math.h"


bool flag=false;
CvRect box;
void Mouse_Call_Back(int event,int x,int y,int flags,void *param)
{
	IplImage *image = (IplImage*)param;
//	cvNamedWindow("test",1);
	//cvPoint start;
	switch(event)
	{
	case CV_EVENT_LBUTTONDOWN:
          box.x=x;
		  box.y=y;
		break;
	case CV_EVENT_LBUTTONUP:
		box.width=abs(x-box.x);
		box.height=abs(y-box.y);
        cvRectangle(image,cvPoint(box.x,box.y),cvPoint(x,y),cvScalar(0,255,0));
	//	cvShowImage("test",image);
		break;
	}
}



int main()
{

  cvNamedWindow("Mouse",1);
  IplImage * image =cvCreateImage(cvSize(500,500),IPL_DEPTH_8U,3);
  cvZero(image);
  
  cvSetMouseCallback("Mouse",Mouse_Call_Back,(void*)image);
  while(1)
  {
     int ch=cvWaitKey(33);
	 if(ch==27)
		 break;
	 cvShowImage("Mouse",image);
       //注意顯示影象,你每一次都對影象進行修改,但是不顯示還是一樣的,你只有一隻輸出影象,我剛開始就是把這個放到外面了,
  }
   cvWaitKey(0);
  cvDestroyWindow("Mouse");
 
	return 0;
}
結果如下: