找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1136|回复: 4

[讨论]:请问如何确定鼠标在当前的视口里?

[复制链接]
发表于 2006-7-11 17:34:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
请问如何确定鼠标在当前的视口里?
难道非得用钩子得到鼠标的屏幕位置,在进行判断么?有没有现成的函数,请教高手!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-7-12 12:05:59 | 显示全部楼层
没发现有这样的函数,就按你的方法去做。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-7-12 12:29:32 | 显示全部楼层
谢谢RedCAD,这样太麻烦了,是不是利用ptx=LOWORD(pMsg->lParam);  pty=HIWORD(pMsg->lParam);  取得屏幕坐标,然后通过函数
Adesk::Boolean

acgsGetViewportInfo(

int viewportNumber,

int & left,

int & bottom,

int & right,

int & top);

来取得视口像素信息,来进行判断阿?
请问还有别的比较简单的方法么?取得viewport的指针有没有用呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-7-12 17:19:50 | 显示全部楼层
你是要判断鼠标是否在绘图区域而非菜单工具等上呢?
给你个程序参考:
//是否在有效的编辑区域
BOOL CGenericFun::IsInEditWindows(int WantToNo,int& ResultNo)
{
  BOOL mRet;
  struct resbuf rb;
  CPoint CurPt;
  double douWidth,douHeight;
  AcGePoint3d mousPt;
  AcGePoint3d cenPt;
  AcGePoint3d winPt1,winPt2;  

  acedGetVar("VIEWCTR",&rb);
  rb.restype=RTPOINT;
  cenPt.x=rb.resval.rpoint[0];
  cenPt.y=rb.resval.rpoint[1];
  acedGetVar("VIEWSIZE",&rb);
  rb.restype=RTREAL;
  douHeight=rb.resval.rreal/2;
  acedGetVar("SCREENSIZE",&rb);
  rb.restype=RTPOINT;
  douWidth=douHeight*rb.resval.rpoint[0]/rb.resval.rpoint[1];
  winPt1.x=cenPt.x-douWidth;
  winPt1.y=cenPt.y-douHeight;
  winPt2.x=cenPt.x+douWidth;
  winPt2.y=cenPt.y+douHeight;
  GetCursorPos(&CurPt);
  ScreenToClient(acedGetAcadDwgView()->m_hWnd,&CurPt);
  mousPt.x=cenPt.x-douWidth;
  mousPt.y=cenPt.y+douHeight;
  mousPt.x=mousPt.x+MyGeFun->SdToCd(CurPt.x);//客户量向屏幕量转化的函数,你搜索一下,我在论坛上发表过的
  mousPt.y=mousPt.y-MyGeFun->SdToCd(CurPt.y);
  if(mousPt.x>winPt1.x && mousPt.x<winPt2.x &&
     mousPt.y>winPt1.y && mousPt.y<winPt2.y)
    mRet=true;
  else
    mRet=false;
  ResultNo=0;
  switch(WantToNo)
  {
    case 0://分析是否在绘图区域
      break;
    case 1://分析用户是否有关闭的企图
      if(!mRet && mousPt.y>winPt2.y && mousPt.x>winPt2.x-douWidth/2) ResultNo=1;
      break;
    case 2://分析是否在工具条上
      
      break;
    default:
      break;
  }
  return mRet;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-7-13 07:53:52 | 显示全部楼层
真是很强的代码,RedCAD真是好人!!! 解危助困,大侠也!!!   我什么时候才能成为你这样的高手阿。。。。

再请你教个问题:
  我将你上面的代码加到我等程序里了,经过上面程序的判断,响应鼠标点击视口里的点的消息,但是当我打开属性框的时候,上面的程序仍然判断其鼠标在视口里,所以点击属性框的时候也会响应点击消息,请问RedCad大侠,这种情况怎么解决好呢?
mouseDone=IsInEditWindows(1,result);
if(mouseDone==TRUE)
{
   if(pMsg->message==WM_LBUTTONDOWN)
  {
      return false;
   }
return false;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-23 14:38 , Processed in 0.349061 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表