CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

菜鸟问题:如何跟随鼠标拉出一虚线矩形框?回复就有分!

楼主jakieliu(边城浪子)2001-12-20 10:05:02 在 VC/MFC / 基础类 提问

如何跟随鼠标拉出一虚线矩形框?就象PhotoShop或其它画图程序里虚线选择框一样. 问题点数:40、回复次数:12Top

1 楼zf925(天下哪来那么多高手)回复于 2001-12-20 10:34:22 得分 2

你仔细看一下,我这是画实线框的,  
  中心思想是:记住上次画的位置,本次清除它(用原色重画)  
  CClientDC   *pDc   =   new   CClientDC(this);  
   
  CPen   pen;  
  CPen   *oldpen;  
  pen.CreatePen(PS_SOLID,1,RGB(128,128,128));  
  oldpen   =   pDc->SelectObject(&pen);  
   
  if(SelectStart.x%24   !=   0)  
  {  
  pDc->MoveTo(StartX+3+4*SelectStart.x,StartY+3+4*SelectStart.y);  
  pDc->LineTo(StartX+3+4*SelectStart.x,StartY+4+4*24);  
  }  
  if(SelectStart.y   !=   0)  
  {  
  pDc->MoveTo(StartX+3+4*SelectStart.x,StartY+3+4*SelectStart.y);  
  pDc->LineTo(StartX+4+24*8*4,StartY+3+4*SelectStart.y);  
  }  
  int   xx   =   ((PreviousPoint.x-StartX-4)/4),yy   =   ((PreviousPoint.y-StartY-4)/4);  
  if((xx+1)%24   !=   0)  
  {  
  pDc->MoveTo(StartX+7+4*xx,StartY+3+4*SelectStart.y);  
  pDc->LineTo(StartX+7+4*xx,StartY+7+4*yy);  
  }  
  if(yy   !=   23)  
  {  
  pDc->MoveTo(StartX+3+4*SelectStart.x,StartY+7+4*yy);  
  pDc->LineTo(StartX+7+4*xx,StartY+7+4*yy);  
  }  
  pDc->SelectObject(oldpen);  
  pen.DeleteObject();  
   
  pen.CreatePen(PS_SOLID,1,RGB(255,0,0));  
  oldpen   =   pDc->SelectObject(&pen);  
   
  if(SelectStart.x%24   ==   0)  
  {  
  pDc->MoveTo(StartX+3+4*SelectStart.x,StartY+3+4*SelectStart.y);  
  pDc->LineTo(StartX+3+4*SelectStart.x,StartY+4+4*24);  
  }  
  if(SelectStart.y   ==   0)  
  {  
  pDc->MoveTo(StartX+3+4*SelectStart.x,StartY+3+4*SelectStart.y);  
  pDc->LineTo(StartX+4+24*8*4,StartY+3+4*SelectStart.y);  
  }  
  if((xx+1)%24   ==   0)  
  {  
  pDc->MoveTo(StartX+7+4*xx,StartY+3+4*SelectStart.y);  
  pDc->LineTo(StartX+7+4*xx,StartY+7+4*yy);  
  }  
  if(yy   ==   23)  
  {  
  pDc->MoveTo(StartX+3+4*SelectStart.x,StartY+7+4*yy);  
  pDc->LineTo(StartX+7+4*xx,StartY+7+4*yy);  
  }  
   
  pDc->SelectObject(oldpen);  
  pen.DeleteObject();  
   
  if(((point1.x-StartX-4)/4>SelectStart.x)&&((point1.y-StartY-4)/4>SelectStart.y))  
  {  
  pen.CreatePen(PS_SOLID,1,RGB(0,255,0));  
  oldpen   =   pDc->SelectObject(&pen);  
  int   xxx   =   ((point1.x-StartX-4)/4),yyy   =   ((point1.y-StartY-4)/4);  
   
  pDc->MoveTo(StartX+3+4*SelectStart.x,StartY+3+4*SelectStart.y);  
  pDc->LineTo(StartX+3+4*SelectStart.x,StartY+7+4*yyy);  
  pDc->MoveTo(StartX+3+4*SelectStart.x,StartY+3+4*SelectStart.y);  
  pDc->LineTo(StartX+7+4*xxx,StartY+3+4*SelectStart.y);  
  pDc->MoveTo(StartX+7+4*xxx,StartY+3+4*SelectStart.y);  
  pDc->LineTo(StartX+7+4*xxx,StartY+7+4*yyy);  
  pDc->MoveTo(StartX+3+4*SelectStart.x,StartY+7+4*yyy);  
  pDc->LineTo(StartX+7+4*xxx,StartY+7+4*yyy);  
   
  pDc->SelectObject(oldpen);  
  pen.DeleteObject();  
  }  
  }  
  }  
  }  
  Top

2 楼ygd(人生短暂,及时行乐。准备成熟中)回复于 2001-12-20 10:39:22 得分 1

DrawFocusRect();结束时一定要偶次调用Top

3 楼yhthy(雁回头)回复于 2001-12-20 10:56:51 得分 3

利用MFC可以很简单的实现上面的功能——源代码如下:  
  void   CDrawView::OnLButtonDown(UINT   nFlags,   CPoint   point)    
  {  
  //   TODO:   Add   your   message   handler   code   here   and/or   call   default  
         
  if(PushNumb==0) //如果是第一次按下左鼠标键  
  {  
  PushNumb++; //做标记表示按下鼠标左键一次  
  mPointOrign=point; //直线的第一点等于点中点  
  mPointOld=point; //记录本次点中点  
  SetCapture(); //捕捉鼠标输入  
  }  
  }  
  void   CDrawView::OnMouseMove(UINT   nFlags,   CPoint   point)    
  {  
          if(PushNumb==1)  
          {  
  if(point!=mPointOld) //如果鼠标移动了  
  {  
          ddd.SelectStockObject(NULL_BRUSH);   //设置不填充状态  
                          //擦除原来的矩形                                                                                                                              
   
                                          ddd.Rectangle(mPointOrign.x,mPointOrign.y,  
                                                                              mPointOld.x,mPointOld.y);  
          //画新的矩形  
                          ddd.Rectangle(mPointOrign.x,mPointOrign.y,point.x,point.y);  
  }  
            }Top

4 楼yhthy(雁回头)回复于 2001-12-20 10:59:07 得分 0

贴上去的时候没有注意排版,有不明白的请继续跟贴Top

5 楼zifzhu()回复于 2001-12-20 12:48:29 得分 30

用CRectTracker类,详细的查msdn。  
  创建并初始化了CRectTracker的实例后就可以在OnLButtonDown里加下面语句  
  void   CMyDlg::OnLButtonDown(UINT   nFlags,Cpoint   point)  
  {  
      m_RectTracker.TrackRubberBand(this,point,TRUE);//CRectTracker的实例  
      CDialog::OnLButtonDown(nFlags,point);  
  }Top

6 楼rovoboy(魂之猎人)回复于 2001-12-20 12:53:36 得分 1

SetRop2()  
  用异或模式划线Top

7 楼jakieliu(边城浪子)回复于 2001-12-20 13:41:19 得分 0

To   yhthy(雁回头):照你那样做,屏幕没有一点反应啊Top

8 楼starcbh(信仰)回复于 2001-12-20 13:59:22 得分 2

^%$*%(Y)*UI%^&*()_  
   
  mouse   donw时记下point_one,mouse   move   记下point_two  
   
  再move时   用从point_one   到   当前   point_two   以画笔反色画(就是SetRop2)矩形,再在  
   
  point_one   到   当前的point   画一个矩形.  
   
  Top

9 楼freewind_z(自由风)回复于 2001-12-20 14:15:09 得分 1

仔细查一下Top

10 楼jakieliu(边城浪子)回复于 2001-12-20 14:49:55 得分 0

To   zifzhu():多谢你提供的CRectTracker类,它是最方便也是效果最好的.  
          不过要补充的是:执行m_RectTracker.TrackRubberBand(this,point,TRUE);后,系统将捕获不了WM_LBUTTONUP消息,也就是说在::OnLButtonUp{}里的程序将不再被执行.我本来想在OnLButtonUp里获得鼠标弹起的坐标也就不能实现.不过有m_RectTracker.m_rect保存的就是拉出的虚线矩形框,这就什么都有了.特在此说明,希望能给大家有所帮助.给你30分了,查收啊.Top

11 楼jakieliu(边城浪子)回复于 2001-12-20 14:52:49 得分 0

To   zifzhu():能留下你的EMAIL吗?要不给我发,我的是:jakieliu76@163.com.  
  以后多多交流好吗?Top

12 楼zifzhu()回复于 2001-12-20 20:47:17 得分 0

zifzhu@sz.slr.com  
  很高兴认识你,以后多联系。Top

相关问题

  • 菜鸟问题:如何跟随鼠标拉出一虚线矩形框?
  • 如何在对话框区域里跟随鼠标移动画一矩形虚线框
  • 请问如何在FormView中拖动鼠标时可以拖动出一个虚线边框的矩形框?
  • 如何在视图中画一个跟随鼠标移动的,以鼠标为坐标原点的十字虚线,在线等候
  • 要使用JavaScript+DHTML跟随鼠标画矩形框,就如同windows里用鼠标框选文件一样,请问有什么好的办法?
  • 用鼠标按住dialog的caption然后拖动鼠标,系统会显示该dialog将会在新的位置的虚线框架,mouseup后dialog就移动到该虚线框架的位置,有没有办法不显示该虚线框架?因为我用了个多边形的dialog,虚线框架却还是原来的矩形。
  • 如何在屏幕上画虚线矩形框?在线等候
  • 怎么画用鼠标拉出来的虚线框
  • 如何定义鼠标绘制矩形框
  • 如何在web上随着鼠标的移动绘制矩形

关键词

  • 矩形
  • 鼠标
  • selectstart
  • 虚线
  • starty
  • startx
  • pdc
  • recttracker
  • zifzhu
  • oldpen

得分解答快速导航

  • 帖主:jakieliu
  • zf925
  • ygd
  • yhthy
  • zifzhu
  • rovoboy
  • starcbh
  • freewind_z

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo