VC++如何用鼠标拖出一个矩形?

2025-05-23 14:17:12
推荐回答(2个)
回答1:

OnMouseMove是在鼠标移动时的响应函数,如果只是画矩形的话不要用这个函数实现。我的方法:
在OnLButtonDown中保存起始点,在OnLButtonUp中记录另一个点,两个点称为矩形的对角线,唯一确定一个矩形。可以用CClientDC中的Rect函数画矩形,也可以自己用MoveTo、LineTo画出矩形四条边,构成矩形。

void CGraphicView::OnLButtonDown(UINT nFlags, CPoint point)
{
m_ptOrgin = point;
CScrollView::OnLButtonDown(nFlags, point);
}

void CGraphicView::OnLButtonUp(UINT nFlags, CPoint point)
{
CClientDC dc(this);
CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
dc.Rectangle(CRect(m_ptOrgin,point));
dc.FillSolidRect(CRect(m_ptOrgin,point),RGB(120,20,20));
Invalidate();// 引起窗口重画

CScrollView::OnLButtonUp(nFlags, point);
}

回答2:

用双缓绘图 ,每次画矩形在新的背景上画
或者 如果你不嫌麻烦 ,记录上次绘制轨迹 ,取反也是可以的
CClientDC dc(this);
CDC *memDC=new CDC;
memDC->CreateCompatibleDC(&dc);
CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
mem->Rectangle(CRect(m_ptOrgin,point));
mem->.FillSolidRect(CRect(m_ptOrgin,point),RGB(120,20,20));
dc.BitBlt()
.......................................................中间的省略了
Invalidate();// 引起窗口重画