关于鼠绘矩形:
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);
}