我有一个MFC应用程序,我试图让用户通过鼠标拖动图片控件绘制一个矩形。我创建了自己的由CStatic子类化的PictureCtrl类。但是,当我点击鼠标时,OnLButtonUp()不会触发。
void PictureCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
SetCapture();
anchor = point;
CRect rect(point,point);
CDC* pDC = GetDC();
pDC->DrawDragRect(&rect, CSize(1,1), NULL, CSize(1,1), NULL, NULL);
m_lastRect = rect;
ReleaseDC(pDC);
CStatic::OnLButtonDown(nFlags, point);
}
void PictureCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
if(GetCapture() == this)
{
CRect rect(anchor, point);
rect.NormalizeRect();
CDC *pDC = GetDC();
pDC->DrawDragRect(&rect, CSize(1,1), &m_lastRect, CSize(1,1), NULL, NULL);
m_lastRect = rect;
ReleaseDC(pDC);
ReleaseCapture();
}
CStatic::OnMouseMove(nFlags, point);
}
void PictureCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
if(GetCapture() == this)
{
CDC *pDC = GetDC();
CRect rect(0,0,0,0);
pDC->DrawDragRect(rect, CSize(1,1), &m_lastRect, CSize(1,1), NULL, NULL);
ReleaseDC(pDC);
ReleaseCapture();
}
CStatic::OnLButtonUp(nFlags, point);
}
如果有人能给我任何见解,为什么OnLButtonUp没有被解雇,那将是值得赞赏的。是因为当我拖动鼠标时OnMouseMove正在吃掉所有的电话?
另外,有人可以给我一个关于如何修改我的代码的建议,这样如果已经绘制了一个矩形,如果用户绘制一个新的矩形,那么旧的矩形将被删除吗?
答案 0 :(得分:2)
如果鼠标位于窗口之外,则ReleaseCapture()
中不应OnMouseMove
,否则您将错过OnLButtonUp
。关于矩形,使用常规绘图基元,而不是在矩形完成后拖动它们。
答案 1 :(得分:0)
要删除旧矩形然后绘制一个新矩形,请使用不具有自己颜色但反转现有图像像素的特殊笔。然后绘制旧矩形将擦除它。请参阅WM_MOUSEMOVE中的示例:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd145184(v=vs.85).aspx