visual C++ 调用颜色对话框,鼠标的回调函数

来源:互联网 发布:长春理工大学软件学院 编辑:程序博客网 时间:2024/06/10 04:23

调用颜色对话框

COLORREF color = RGB(255, 0, 0);

void CTCDlg::OnBnClickedButton1(){// TODO: 在此添加控件通知处理程序代码//COLORREF color = RGB(255, 0, 0);      // 颜色对话框的初始颜色为红色      CColorDialog colorDlg(color);         // 构造颜色对话框,传入初始颜色值         if (IDOK == colorDlg.DoModal())       // 显示颜色对话框,并判断是否点击了“确定”       {           color = colorDlg.GetColor();      // 获取颜色对话框中选择的颜色值        //   SetDlgItemInt(IDC_COLOR_EDIT, color);         // 在Color编辑框中显示所选颜色值         //  SetDlgItemInt(IDC_R_EDIT, GetRValue(color));  // 在R编辑框中显示所选颜色的R分量值          // SetDlgItemInt(IDC_G_EDIT, GetGValue(color));  // 在G编辑框中显示所选颜色的G分量值           //SetDlgItemInt(IDC_B_EDIT, GetBValue(color));  // 在B编辑框中显示所选颜色的B分量值       }   }  


调用鼠标的回调函数

void CTCDlg::OnBnClickedOk2(){// TODO: 在此添加控件通知处理程序代码    color_img0 = cvLoadImage("new.jpg",1);//原图cvShowImage( "image", color_img0 );    color_img = cvCloneImage( color_img0 );//复制    mask = cvCreateImage( cvSize(color_img->width + 2, color_img->height + 2), 8, 1 );    cvNamedWindow( "image", 1 );    cvSetMouseCallback( "image", on_mouse, 0 );/*void cvSetMouseCallback( const char* window_name, CvMouseCallback on_mouse, void* param=NULL );window_name 窗口的名字。on_mouse 指定窗口里每次鼠标事件发生的时候,被调用的函数指针。这个函数的原型应该为 void Foo(int event, int x, int y, int flags, void* param);其中event是 CV_EVENT_*变量之一, x和y是鼠标指针在图像坐标系的坐标(不是窗口坐标系),flags是CV_EVENT_FLAG的组合,param是用户定义的传递到cvSetMouseCallback函数调用的参数。param 用户定义的传递到回调函数的参数。*/} void  CTCDlg::on_mouse( int event, int x, int y, int flags, void* param )/*flags操作选项. 低位比特包含连通值, 4 (缺省) 或 8, 在函数执行连通过程中确定使用哪种邻域方式。高位比特可以是 0 或下面的开关选项的组合:CV_FLOODFILL_FIXED_RANGE - 如果设置,则考虑当前象素与种子象素之间的差,否则考虑当前象素与其相邻象素的差。(范围是浮点数).CV_FLOODFILL_MASK_ONLY - 如果设置,函数不填充原始图像 (忽略 new_val), 但填充掩模图像 (这种情况下 MASK 必须是非空的).*/{    switch( event )    {    case CV_EVENT_LBUTTONDOWN://CV_EVENT_LBUTTONDOWN表示鼠标左键按下的事件        {            CvPoint seed = cvPoint(x,y);   // CvPoint     表示一个坐标为整数的二维点,是一个包含integer类型成员x和y的简单结构体。//            int lo = lo_diff;//            int up = up_diff;            int flags = 4 + (255 << 8) + CV_FLOODFILL_FIXED_RANGE;            int b=GetBValue(color),g=GetGValue(color),r=GetRValue(color);            CvConnectedComp comp;/*typedef struct CvConnectedComp   {  double area;   //区域的面积  CvScalar value;  //区域颜色的平均值  CvRect rect;  //是一个区域的外接矩形  CvSeq * contour;   //指向另一个序列的指针  };  */             CvScalar color = CV_RGB( r, g, b );             cvFloodFill( color_img, seed, color, CV_RGB( 20, 20, 20 ),CV_RGB( 20, 20, 20 ), &comp, flags, /*is_mask ? mask :*/ NULL );//从点击的位置把连接到的范围用上面颜色填充 /* void cvFloodFill(IplImage* src,CvPoint seedPoint,    //漫水法从点seedPoint开始实行算法CvScalar newVal,    //像素点被染色的值CvScalar loDiff = cvScalarAll(0),    //下标记--被染色的相邻点减去loDiffCvScalar upDiff = cvScalarAll(0),    //上标记--被染色的相邻点加上upDiffCvConnectedComp* comp = NULL,    //如果comp不是NULL,那么该CvConnectedComp被设置为被填充区域的统计属性int flags = 4,    /*低八位可以被设置为4或者8,这个参数控制着填充算法的连通性,4表示在4个方向考虑连通性(上下左右),*8表示在8个方向考虑连通性(加上4个对角线方向),高八位可以设置CV_FLOODFILL_FIXED_RANGE,或者*CV_FLOODFILL_MASK_ONLY(如果设置只考虑填充MASK),flags的中间比特(8-15位)的值可以设置填充掩码的值*flags = 8 | CV_FLOODFILL_MASK_ONLY | CV_FLOODFILL_FIXED_RANGE | (43<<8)); CvArr* mask = NULL    mask参数与其他有mask参数的使用方法一致,不同的是可以是作为该函数的输出值(指定应经被填充的区域)*如果mask非空,那么它必须是一个单通道,8位,像素宽度和高度均比源图像大两个像素的图像*(这是为使内部运算简单快速),cvFloodFill()不会覆盖mask中非0的区域   */             cvShowImage( "image", color_img ); cvSaveImage("final.jpg",color_img);        }        break;    }}



0 0