通过鼠标画一次性矩形 + 绘制半透膜矩形

绘制一次性矩形的原理就是不断的画新矩形,并不断的擦出旧矩形

void CMeiTuDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	down = point;
	old = point;
	DRAW = TRUE;
	CDialogEx::OnLButtonDown(nFlags, point);
}

void CMeiTuDlg::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CClientDC dc(this);
	dc.SetROP2(R2_NOT);   //此为关键!!! 
	dc.SelectStockObject(NULL_BRUSH); //不使用画刷
	if (TRUE == DRAW)   //根据是否有单击判断是否可以画矩形 
	{    
		dc.Rectangle(CRect(down,old)); 
		dc.Rectangle(CRect(down,point)); 
		old = point; 
		//下面用于将信息显示在窗口标题
		/*char buf[128];
		memset(buf, 0, 128);
		sprintf(buf, ("起始:(%d,%d),终点:(%d,%d),大小:%d * %d"),
			down.x,down.y,point.x, point.y, abs(point.x- down.x), abs(point.y- down.y));
		SetWindowText(buf);*/
	}
	CDialogEx::OnMouseMove(nFlags, point);
}

void CMeiTuDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	up = point;
	DRAW = FALSE; //重置绘制矩形框标志  
	//消隐最后的一个矩形(其原理跟拖动时矩形框绘制原理相同)
	CClientDC dc(this);  
	dc.SetROP2(R2_NOT);
	dc.SelectStockObject(NULL_BRUSH); 
	dc.Rectangle(CRect(down,old)); 
	CDialogEx::OnLButtonUp(nFlags, point);
}
绘制半透明矩形,借鉴的哪儿的忘了==

void MyButton::DrawAlphaRect(CRect rect)
{
	CDC *dc = GetDC();
	CDC cdc;
	cdc.CreateCompatibleDC(dc);
	CBitmap bitmap, *pOldBitmap;
	bitmap.CreateCompatibleBitmap(dc, rect.right, rect.bottom);
	CRect src(rect);
	src.OffsetRect(CSize(-rect.left, -rect.top));
	pOldBitmap = cdc.SelectObject(&bitmap);
	cdc.FillSolidRect(src, RGB(0, 85, 255)); //透明色  
	if (::AlphaBlend == 0)
	{
		dc->BitBlt(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, &cdc, src.left, src.top, SRCINVERT);
	}	else {
		BLENDFUNCTION bf;
		memset(&bf, 0, sizeof(bf));
		bf.SourceConstantAlpha = 0x3f; //透明程度//值越大越不透明  
		bf.BlendOp = AC_SRC_OVER;
		::AlphaBlend(dc->GetSafeHdc(), rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top,
			cdc.GetSafeHdc(), src.left, src.top, src.right - src.left, src.bottom - src.top, bf);
	}
	cdc.SelectObject(pOldBitmap);
}



#include <opencv2/opencv.hpp> #include using namespace std; using namespace cv; #define WINDOW_NAME “【程序窗口1】” //全局变量的声明 Mat g_maskImage, g_srcImage; Point prevPt(-1,-1); bool g_bDrawingBox = false; //全局函数的声明 static void ShowHelpText() ; static void on_Mouse( int event, int x, int y, int flags, void* ); int main( int argc, char** argv ){ //【1】载入原图并显示,初始化掩和灰度图 g_srcImage = imread(“2.jpg”, 1); imshow( WINDOW_NAME, g_srcImage ); Mat srcImage, grayImage; g_srcImage.copyTo(srcImage) ; cvtColor(g_srcImage, g_maskImage, COLOR_BGR2GRAY); cvtColor (g_maskImage, grayImage, COLOR_GRAY2BGR); g_maskImage = Scalar::all (0); //【2】设置鼠标回调函数 setMouseCallback( WINDOW_NAME, on_Mouse, 0 ); //【3】轮询按键,进行处理 while(1){ //获取键值 int c = waitKey(0); //若按键键值为 ESC 时,退出 if( (char)c == 27 ) break; //按键键值为2时,恢复源图 if( (char)c ==‘2’){ g_maskImage = Scalar::all (0); srcImage.copyTo(g_srcImage); imshow( “image”, g_srcImage ); } //若检测到按键值为 1或者空格,则进行处理 if( (char)c ‘1’ || (char)c’ '){ //定义一些参数 int i, j, compCount = 0; vector<vector > contours; vector hierarchy; //寻找轮廓 findContours (g_maskImage, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE); //轮廓为空时的处理 if( contours.empty() ) continue; //复制掩 Mat maskImage (g_maskImage.size(), CV_32S); maskImage = Scalar::all(0); //循环绘制出轮廓 for (int index = 0; index >= 0; index++) { drawContours(maskImage,contours,index,Scalar::all(compCount+1),-1,8,hierarchy,INT_MAX); } //compCount为零时的处理 if( compCount ==0)continue; //生成随机颜色 vector<Vec3b> colorTab; for(i=0; i< compCount; i++ ){ int b = theRNG().uniform(0, 255); int g = theRNG().uniform(0, 255); int r = theRNG().uniform(0, 255); colorTab.push_back (Vec3b ((uchar)b, (uchar)g, (uchar)r)); } //计算处理时间并输出到窗口中 double dTime = (double)getTickCount(); watershed( srcImage, maskImage ); dTime = (double)getTickCount() - dTime; printf("\t处理时间= %gms\n",dTime*1000./getTickFrequency()); //双层循环,将分水岭图像遍历存入 watershedImage 中 Mat watershedImage (maskImage.size(), CV_8UC3); for ( i = 0; i < maskImage.rows; i++ ) for( j = 0; j < maskImage.cols; j++ ){ int index = maskImage.at<int>(i, j) ; if( index ==-1 ) watershedImage.at<Vec3b> (i, j) =Vec3b(255, 255, 255); else if( index <=0 || index > compCount ) watershedImage.at<Vec3b>(i, j) = Vec3b(0, 0,0); else watershedImage.at<Vec3b>(i, j) = colorTab[index -1]; } //混合灰度图和分水岭效果图并显示最终的窗口 watershedImage = watershedImage*0.5 + grayImage*0.5; imshow ( "watershed transform", watershedImage ); } } return 0; } //鼠标消息回调函数 static void on_Mouse( int event, int x, int y, int flags, void* ){ //处理鼠标不在窗口中的情况 if(x<0 || x >= g_srcImage.cols || y < 0 || y >= g_srcImage.rows ) return; //处理鼠标左键相关消息 if( event == EVENT_LBUTTONUP || !(flags & EVENT_FLAG_LBUTTON) ) prevPt = Point(-1, -1) ; else if( event == EVENT_LBUTTONDOWN ) prevPt = Point(x, y); //鼠标左键按下并移动,绘制出白色线条 else if( event == EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON)||g_bDrawingBox){ Point pt(x, y); if( prevPt.x < 0 ) prevPt = pt; line( g_maskImage, prevPt, pt, Scalar::all(255), 5, 8, 0 ); line( g_srcImage, prevPt, pt, Scalar::all(255), 5, 8, 0 ); prevPt =pt; imshow(WINDOW_NAME, g_srcImage); } }使用g_bDrawingBox
最新发布
07-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值