找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 940|回复: 4

[求助]:如何向setWindowPos传递点坐标

[复制链接]
发表于 2002-5-9 01:19:14 | 显示全部楼层 |阅读模式

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

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

×
请问高手:
    我想实现在CAD中当鼠标放开时,对话框弹出,且左上角为鼠标处。鼠标放开返回AcGePoint3d,如何向setWindowPos传递点坐标。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-5-9 01:49:04 | 显示全部楼层
// 1: 获得DCS下鼠标 Mouse coords
  CPoint cPnt (pMsg->lParam) ;        
  acedCoordFromPixelToWorld (cPnt, cpt) ;


去OBJECTARX安装目录:...\ObjectARX\SAMPLES\MFCSAMPS\PRETRANSLATE可以看到下面代码:


  1. [FONT=courier new]
  2. BOOL filterMouse(MSG *pMsg)
  3. {   
  4. if( pMsg->message == WM_MOUSEMOVE )   
  5. {        
  6.   acedDwgPoint cpt;        
  7.   ads_point ptDCS, ptWCS, norm;        
  8.   AcGePoint3d  origin;        
  9.   AcGeVector3d e0, e1, e2;        
  10.   AcGeMatrix3d  matUcs2Wcs, matWcs2Ucs;        
  11.   // 1: Get the Mouse coords in DCS        
  12.   CPoint cPnt (pMsg->lParam) ;        
  13.   acedCoordFromPixelToWorld (cPnt, cpt) ;        
  14.   acdbPointSet ( cpt, ptDCS );            
  15.   //acutPrintf ( "\nMouse in Ucs %f, %f, %f",  ptDCS[X], ptDCS[Y],ptDCS[Z] );      
  16.    //return FALSE;        
  17.   // 2: Transform the Mouse coords from DCS to WCS        
  18.   // For this we use the    acdbEcs2Ucs  function with the         
  19.   // value of the VIEWDIR system variable as the input normalvector of ECS        
  20.   // (Sure we have to transform the VIEWDIR value from UCS to WCS        
  21.   struct resbuf rbview;        
  22.   acedGetVar( "viewdir", &rbview );        
  23.   ads_point_set( rbview.resval.rpoint, norm );        
  24.   // If the view direction is 0, 0, 1, then acedCoordFromPixelToWorld()        
  25.   // needs special handling -> we only have to translate the thepoint      
  26.    // by the distance the origin of the current UCS was moved        
  27.   double tol = 1e-10;        
  28.   if ((fabs(norm[X]) < tol) && (fabs(norm[Y]) < tol) &&((fabs(norm[Z]) - 1.0) < tol))
  29.   {            
  30.    AcGePoint3d acadPt;            
  31.    acadPt.x = cpt[0];            
  32.    acadPt.y = cpt[1];            
  33.    acadPt.z = cpt[2];            
  34.    acdbUcsMatrix ( matUcs2Wcs );                     
  35.    matUcs2Wcs.invert();            
  36.    matUcs2Wcs.getCoordSystem( origin, e0, e1, e2);            
  37.    acadPt += origin.asVector();            
  38.    acutPrintf ( "\nMouse in Ucs %f, %f, %f",  acadPt[X],acadPt[Y], acadPt[Z] );            
  39.    return FALSE;        
  40.   }        
  41.   //transfoming VIEWDIR  to WCS        
  42.   acdbUcs2Wcs ( norm, norm, Adesk::kTrue );        
  43.   // Transforming the mouse coords from DCS to WCS        
  44.   acdbEcs2Wcs( ptDCS, ptWCS, norm, Adesk::kTrue );        
  45.   // 3: Get the Mouse coordinates in UCS        //        
  46.   // For this we have to project the WCS coordinates to the UCSplane using         
  47.   // the VIEWDIR vector as projection direction.        //        
  48.   // Getting the UCS->WCS transformation matrix        
  49.   acdbUcsMatrix ( matUcs2Wcs );                 
  50.   matUcs2Wcs.getCoordSystem( origin, e0, e1, e2);        
  51.   // Creating a plane which lies on the current UCS        
  52.   //        
  53.   AcGePlane thePlane ( origin, e0, e1);        
  54.   AcGePoint3d  pntMouseInWCS( ptWCS[X], ptWCS[Y], ptWCS[Z] );        
  55.   AcGeVector3d vecViewdir( norm [X], norm [Y], norm [Z] );        
  56.   // Making the projection        
  57.   AcGePoint3d resPnt = pntMouseInWCS.project (thePlane, vecViewdir);        
  58.   // Transforming the point coordinates to UCS.        
  59.   matWcs2Ucs = matUcs2Wcs.inverse();        
  60.   resPnt.transformBy ( matWcs2Ucs );        
  61.   //this line prints the same coordinates as the coordinates         
  62.   //shown in  AutoCAD's status bar        
  63.   acutPrintf ( "\nMouse in Ucs %f, %f, %f",  resPnt[X], resPnt[Y],resPnt[Z] );    }   
  64.   return FALSE; // continue
  65. }


  66. NOTE: This doesn't work in perspective view because acedCoordFromPixelToWorld()
  67. doesn't work in perspective view.
  68. [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-5-9 06:16:45 | 显示全部楼层
AcGePoint3d p1,p2;
        acedGetPoint(NULL,"\n Select pOINT:",asDblArray(p1));
        ZhouAcEdJig *pJig=new ZhouAcEdJig(p1);
        p2=pJig->doIt();//由鼠标拖动返回点
        delete pJig;
        pDialog=new ZhouDialog(acedGetAcadFrame());
        pDialog->Create(IDD_DIALOG1);
        pDialog->ShowWindow(SW_SHOW);
        pDialog->SetWindowPos(acedGetAcadDockCmdLine(),p2[X],p2[Y] ,0,0,SWP_NOSIZE);

该成以下后还不行
        AcGePoint3d p1,p2;
        CPoint p3;
        CString str;
        acedDwgPoint cpt;
        acedGetPoint(NULL,"\n Select pOINT:",asDblArray(p1));
        ZhouAcEdJig *pJig=new ZhouAcEdJig(p1);
        p2=pJig->doIt();//由鼠标拖动返回点
        delete pJig;
        pDialog=new ZhouDialog(acedGetAcadFrame());
        pDialog->Create(IDD_DIALOG1);
        pDialog->ShowWindow(SW_SHOW);
        //
        cpt[0]=p2[X],cpt[1]=p2[Y];
        acedCoordFromWorldToPixel(0,cpt,p3);
        //
        str.Format("%g",p2[X]);
        pDialog->m_edit1.SetWindowText(str);
        pDialog->m_edit1.UpdateData();
    str.Format("%g",p3.x);
        pDialog->m_edit2.SetWindowText(str);
        pDialog->m_edit2.UpdateData();

        pDialog->SetWindowPos(acedGetAcadDockCmdLine(),p3.x ,p3.y ,0,0,SWP_NOSIZE);


请帮我想想办法
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-5-9 06:26:06 | 显示全部楼层
你要把那个函数定义成HOOK,就能动态监视鼠标的动作了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-5-9 06:39:59 | 显示全部楼层
我的意思是说:
  p2返回的是wcs坐标,而pDialog->SetWindowPos(acedGetAcadDockCmdLine(),p2[X],p2[Y] ,0,0,SWP_NOSIZE); 显然这样是错误的,需要将p2转换为窗体的坐标,怎么办?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-25 02:19 , Processed in 0.470128 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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