MFC鼠绘矩形

本文详细介绍了使用鼠标绘制矩形的技术,包括获取客户区坐标、转换坐标、限制鼠标活动范围、捕获鼠标以及使用CDC类进行绘图。通过设置ROP2模式实现图形抹除效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


关于鼠绘矩形:

1. 必须会绘制矩形(查看孙鑫VC++的第十章)

2. 在绘制的时候,必须使鼠标锁定在客户区内,利用CRect rect;
GetClientRect(&rect);//该函数获取窗口客户区的坐标。客户区坐标指定客户区的左上角和右下角。
//由于客户区坐标是相对窗口客户区的左上角而言的,因此左上角坐标为(0,0)
ClientToScreen(&rect);//这个函数的功能:该函数将指定点,或者矩形的用户坐标转换成屏幕坐标。
ClipCursor(&rect); //该函数把鼠标限制在屏幕上的一个矩形区域内,如果调用SetCursor或用鼠标设置的
//一个随后的鼠标位置在该矩形区域的外面,则系统自动调整该位置以保持鼠标在矩形区域之内。


3. 同时,利用SetCapture()函数使得鼠标只能在当前窗口捕获(功能:该函数在属于当前 线程的指定窗口里设置鼠标捕获。一旦窗口捕获了鼠标,所有鼠标输入都针对该窗口, 无论光标是否在窗口的边界内。同一时刻只能有一个窗口捕获鼠标。如果鼠标光标在另 一个线程创建的窗口上,只有当鼠标键按下时系统才将鼠标输入指向指定的窗口。用完 后用ReleaseCapture()释放)

4. 最重要的一步是当鼠标移动时,能够随时显示所画的矩形,并且把之前话的矩形抹掉这就需要用到CDC::int SetROP2(   int nDrawMode );  其中有一个参数为R2_NOT,意思是R2_NOT 像素是屏幕颜色的反向操作。这样我们两次绘画以前的相同的图形就可以把图像抹去(很厉害的思想!!)

附:

void CGraphicView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	m_bMouseDown=TRUE;
	m_ptOrigin=point;
	m_ptOld=point;
	SetCapture();	//
	CRect rect;
	GetClientRect(&rect);//该函数获取窗口客户区的坐标。客户区坐标指定客户区的左上角和右下角。
						//由于客户区坐标是相对窗口客户区的左上角而言的,因此左上角坐标为(0,0)
	ClientToScreen(&rect);//这个函数的功能:该函数将指定点,或者矩形的用户坐标转换成屏幕坐标。
	ClipCursor(&rect);	//该函数把鼠标限制在屏幕上的一个矩形区域内,如果调用SetCursor或用鼠标设置的
						//一个随后的鼠标位置在该矩形区域的外面,则系统自动调整该位置以保持鼠标在矩形区域之内。


	CView::OnLButtonDown(nFlags, point);
}

void CGraphicView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	


	if(m_bMouseDown)
	{
		m_bMouseDown=false;
		ReleaseCapture();
		ClipCursor(NULL);
		CClientDC dc(this);
		CBrush *bursh=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
		dc.SelectObject(bursh);
		//dc.SetROP2(R2_NOT);
		dc.Rectangle(CRect(m_ptOrigin,m_ptOld));
		//dc.SetROP2(R2_COPYPEN);
		dc.Rectangle(CRect(m_ptOrigin,m_ptOld));
	}


	CView::OnLButtonUp(nFlags, point);
}

void CGraphicView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	
	if(m_bMouseDown)
	{
		CClientDC dc(this);
		CBrush *bursh=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
		dc.SelectObject(bursh);
		dc.SetROP2(R2_NOT);		//R2_NOT就是取反的意思,即前景色为背景色的反色,经常用R2_NOT来画橡皮线,因为两次取反可以还原背景色。
		dc.Rectangle(CRect(m_ptOrigin,m_ptOld));
		dc.MoveTo(m_ptOrigin);
		dc.Rectangle(CRect(m_ptOrigin,point));
		m_ptOld=point;
	}
	CView::OnMouseMove(nFlags, point);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值