WEB开发网
开发学院软件开发VC 浅谈在应用CRectTracker类的程序中响应WM_LBUTTON... 阅读

浅谈在应用CRectTracker类的程序中响应WM_LBUTTONUP消息

 2010-01-09 20:31:46 来源:WEB开发网   
核心提示:本文配套源码CRectTracker类也有人称之为“橡皮筋”类,我们可以通过Windows自带的画图板来了解这个类的作用:用“选定”功能在画图区随意选中一块儿区域,浅谈在应用CRectTracker类的程序中响应WM_LBUTTONUP消息,此时会出现一个由虚线和八个调整

本文配套源码

CRectTracker类也有人称之为“橡皮筋”类。我们可以通过Windows自带的画图板来了解这个类的作用:用“选定”功能在画图区随意选中一块儿区域,此时会出现一个由虚线和八个调整标记点组成的矩形选框,我们可通过鼠标点中矩形选框的中心移动其位置,并且能利用调整标记 点来改变其大小……这个矩形选框其实就是一个“橡皮筋选框”。

CRectTracker类的使用并不是什么新鲜的话题,然而在应用这个类的过程中,我却发现了一个小问题:我创建了一个对话框程序,希望利用CRectTracker类在对话框上画出一个“橡皮筋选框 ”,为了使鼠标按下并拖动鼠标的同时出现虚线的选择框,我在程序中加入了以下代码:

void CCRectTracker_DemoDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
  // TODO: Add your message handler code here and/or call default
  //当鼠标左键按 下时
  CRectTracker temp;
  temp.TrackRubberBand(this,point,TRUE);
   temp.m_rect.NormalizeRect();

  CDialog::OnLButtonDown(nFlags, point);
}

这段代码确实实现了我所期望的效果。但在程序的另一个地方:

void CCRectTracker_DemoDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
  // TODO: Add your message handler code here and/or call default
  //当鼠标左键松开时
   MessageBox("鼠标左键松开","松开",NULL);

   CDialog::OnLButtonUp(nFlags, point);
}

OnLButtonUp()事件丝毫不理睬我鼠标的动 作——MessageBox()并没有执行。仔细一想:TrackRubberBand()是以鼠标左键的松开作为结 束标志的,当WM_LBUTTONUP消息发出后,TrackRubberBand()在OnLButtonUp()事件响应前就截获了该消 息,所以OnLButtonUp()事件就无法正常响应了……想到这里,脑海中也就浮现了一个解决 这个小问题的办法,那就是:在TrackRubberBand()后,向程序自身发送一个自己构造的WM_LBUTTONUP消 息。于是将OnLButtonDown()中的代码改写成为以下形式:

void CCRectTracker_DemoDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
  // TODO: Add your message handler code here and/or call default
  //当鼠标左键按下时
   CRectTracker temp;
  temp.TrackRubberBand(this,point,TRUE);
   temp.m_rect.NormalizeRect();
  //自己构造的WM_LBUTTONUP消息
  this- >SendMessage(WM_LBUTTONUP,NULL,NULL);
  CDialog::OnLButtonDown(nFlags, point);
}

1 2  下一页

Tags:应用 CRectTracker 程序

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接