Line.cpp
上传用户:lj3531212
上传日期:2007-06-18
资源大小:346k
文件大小:18k
源码类别:

绘图程序

开发平台:

Visual C++

  1. // Line.cpp: implementation of the CLine class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "GraphSoft.h"
  6. #include "Line.h"
  7. #include "math.h"
  8. #ifdef _DEBUG
  9. #undef THIS_FILE
  10. static char THIS_FILE[]=__FILE__;
  11. #define new DEBUG_NEW
  12. #endif
  13. ///////////////////////////////////
  14. IMPLEMENT_SERIAL( CLine, CShape, 0 )
  15. //////////////////////////////////////////////////////////////////////
  16. // Construction/Destruction
  17. //////////////////////////////////////////////////////////////////////
  18. CLine::CLine():CShape()
  19. {
  20. m_flStartx=0;
  21. m_flStarty=0;
  22. m_flEndx=0;
  23. m_flEndy=0;
  24. //temp(start)
  25. m_flStartxTemp=0;
  26. m_flStartyTemp=0;
  27. m_flEndxTemp=0;
  28. m_flEndyTemp=0;
  29. //temp(end)
  30. }
  31. /////////////////////
  32. CLine::CLine(COLORREF color,int penWidth,float angle):CShape(color,penWidth,angle)
  33. {
  34. m_flStartx=0;
  35. m_flStarty=0;
  36. m_flEndx=0;
  37. m_flEndy=0;
  38. //temp(start)
  39. m_flStartxTemp=0;
  40. m_flStartyTemp=0;
  41. m_flEndxTemp=0;
  42. m_flEndyTemp=0;
  43. //temp(end)
  44. }
  45. ////////////////////
  46. CLine::CLine(CLine * const line):CShape(line)
  47. {
  48.     m_flStartx=line->m_flStartx;
  49. m_flStarty=line->m_flStarty;
  50. m_flEndx=line->m_flEndx;
  51. m_flEndy=line->m_flEndy;
  52. //temp(start)
  53. m_flStartxTemp=line->m_flStartxTemp;
  54. m_flStartyTemp=line->m_flStartyTemp;
  55. m_flEndxTemp=line->m_flEndxTemp;
  56. m_flEndyTemp=line->m_flEndyTemp;
  57. //temp(end)
  58. }
  59. /////////////////////
  60. CLine::~CLine()
  61. {
  62. }
  63. ////////////////////////////////////////////////////////////
  64. //Operations
  65. /////////////////////////////////////////////////////////////
  66. void CLine::Serialize( CArchive& ar )
  67. {
  68. // serialization of Base class 
  69. CShape::Serialize( ar ) ;
  70. if ( ar.IsLoading() ){
  71.         ar>>m_flStartx;
  72. ar>>m_flStarty;
  73. ar>>m_flEndx;
  74. ar>>m_flEndy;
  75. //temp
  76. m_flStartxTemp=m_flStartx;
  77. m_flStartyTemp=m_flStarty;
  78. m_flEndxTemp=m_flEndx;
  79. m_flEndyTemp=m_flEndy;
  80. } else {
  81. ar<<m_flStartx;
  82. ar<<m_flStarty;
  83. ar<<m_flEndx;
  84. ar<<m_flEndy;
  85. }
  86. return ;
  87. }
  88. /////////////////////////////////////////////
  89. CShape* CLine::GetCopy()
  90. {
  91. CLine* pLine =new CLine(this);
  92. return pLine;
  93. }
  94. /////////////////////////////////////////////
  95. void CLine::Draw_DDALine(CPoint ptStart,CPoint ptEnd,CDC *pDC,int penWidth,COLORREF color)
  96. {
  97.   //add code here ...
  98. }
  99. ////////////////////////////////////////////
  100. void CLine::Draw(CDC *pDC,COLORREF color,COLORREF fillColor,int penWidth)
  101. {
  102. CPen pen,*poldPen;
  103. pen.CreatePen(PS_SOLID,penWidth, color);  
  104. poldPen=pDC->SelectObject(&pen);      
  105. pDC->MoveTo(m_flStartxTemp,m_flStartyTemp);
  106. pDC->LineTo(m_flEndxTemp,m_flEndyTemp);
  107. if(GetDrawPointsFlag()==1){
  108. DrawPoints(pDC,color);
  109. }
  110. pDC->SelectObject(poldPen);
  111. //BresenhamLine(pDC,m_flStartx,m_flStarty,m_flEndx,m_flEndy,color);
  112. //Draw_DDALine(m_ptStart,m_ptEnd,pDC,penWidth,color);
  113. }
  114. ///////////////////////////////////////////
  115. void CLine::DrawPointsCutTo(CDC *pDC,COLORREF color,CFlRect m_rectFrom,CRect m_rectTo)
  116. {
  117. // if(!IsInRect(m_rectFrom)){
  118. // return;
  119. // }
  120. //得到移动扩缩后的关键数据
  121. float  flStartx,flStarty,flEndx,flEndy;
  122. //移动
  123. float stepx=m_rectTo.left-m_rectFrom.left;
  124. float stepy=m_rectTo.top-m_rectFrom.top;
  125. flStartx=m_flStartxTemp+stepx;
  126. flStarty=m_flStartyTemp+stepy;
  127. flEndx=m_flEndxTemp+stepx;
  128. flEndy=m_flEndyTemp+stepy;
  129. //扩缩
  130. float cx,cy,flScale;
  131. cx=m_rectTo.left;
  132. cy=m_rectTo.top;
  133. if(m_rectFrom.Width()<0.01){
  134. m_rectFrom.right=m_rectFrom.left +1;
  135. }
  136. if(m_rectFrom.Height()<0.01){
  137. m_rectFrom.bottom=m_rectFrom.top +1;
  138. }
  139. // flScale=min((float)m_rectTo.Width()/m_rectFrom.Width(),(float)m_rectTo.Height()/m_rectFrom.Height());
  140. //   flScale=((float)m_rectTo.Width()/m_rectFrom.Width()+(float)m_rectTo.Height()/m_rectFrom.Height())/2;
  141.     flScale=(float)m_rectTo.Width()/m_rectFrom.Width();
  142. flStartx=(flStartx-cx)*flScale+cx;
  143. flStarty=(flStarty-cy)*flScale+cy;
  144. flEndx=(flEndx-cx)*flScale+cx;
  145. flEndy=(flEndy-cy)*flScale+cy;
  146. CPen pen,*poldPen;
  147.     pen.CreatePen(PS_SOLID,1, color);
  148. poldPen=pDC->SelectObject(&pen);
  149. {
  150. pDC->MoveTo(flStartx,flStarty-1-GetPenWidth());
  151. pDC->LineTo(flStartx,flStarty+2+GetPenWidth());
  152. pDC->MoveTo(flStartx-1-GetPenWidth(),flStarty);
  153. pDC->LineTo(flStartx+2+GetPenWidth(),flStarty);
  154. pDC->MoveTo(flEndx,flEndy-1-GetPenWidth());
  155. pDC->LineTo(flEndx,flEndy+2+GetPenWidth());
  156. pDC->MoveTo(flEndx-1-GetPenWidth(),flEndy);
  157. pDC->LineTo(flEndx+2+GetPenWidth(),flEndy);
  158. }  
  159. pDC->SelectObject(poldPen);      
  160. return;
  161. }
  162. void CLine::DrawPoints(CDC *pDC,COLORREF color)
  163. {
  164. CPen pen,*poldPen;
  165.     pen.CreatePen(PS_SOLID,1, color);
  166. poldPen=pDC->SelectObject(&pen);
  167. {
  168. pDC->MoveTo(m_flStartxTemp,m_flStartyTemp-1-GetPenWidth());
  169. pDC->LineTo(m_flStartxTemp,m_flStartyTemp+2+GetPenWidth());
  170. pDC->MoveTo(m_flStartxTemp-1-GetPenWidth(),m_flStartyTemp);
  171. pDC->LineTo(m_flStartxTemp+2+GetPenWidth(),m_flStartyTemp);
  172. pDC->MoveTo(m_flEndxTemp,m_flEndyTemp-1-GetPenWidth());
  173. pDC->LineTo(m_flEndxTemp,m_flEndyTemp+2+GetPenWidth());
  174. pDC->MoveTo(m_flEndxTemp-1-GetPenWidth(),m_flEndyTemp);
  175. pDC->LineTo(m_flEndxTemp+2+GetPenWidth(),m_flEndyTemp);
  176. }  
  177. pDC->SelectObject(poldPen);      
  178. return;
  179. }
  180. ////////////////////////////////////////////////
  181. /////////////////////////////////////////////
  182. //function------IsPointinRegion
  183. //return value
  184. //0----------out
  185. //1----------in
  186. /////////////////////////////////////////////
  187. int CLine::IsPointinRegion(POINT point)
  188. {
  189. //out
  190. if(point.x>m_flStartxTemp+1&&point.x>m_flEndxTemp+1)
  191. return 0;
  192. if(point.y>m_flStartyTemp+1&&point.y>m_flEndyTemp+1)
  193. return 0;
  194. if(point.x<m_flStartxTemp-1&&point.x<m_flEndxTemp-1)
  195. return 0;
  196. if(point.y<m_flStartyTemp-1&&point.y<m_flEndyTemp-1)
  197. return 0;     
  198. return 1;
  199. }
  200. /////////////////////////////////////////////
  201. //function------IsInRect
  202. //return value
  203. //0----------out
  204. //1----------cut
  205. //2----------in
  206. /////////////////////////////////////////////
  207. int CLine::IsInRect(CRect rect)
  208. {
  209. int nRtVal=0;
  210. int nPtStartState,nPtEndState;       
  211.     
  212. nPtStartState = PtStateToRect(m_flStartxTemp,m_flStartyTemp, rect);
  213. nPtEndState = PtStateToRect(m_flEndxTemp,m_flEndyTemp,rect);
  214.     if(nPtStartState == 0 && nPtEndState == 0){//in
  215. nRtVal=2;
  216.     }
  217. else if(nPtStartState == 0 || nPtEndState == 0){//cut
  218. nRtVal=1;
  219.     }
  220. else if((nPtStartState & nPtEndState) != 0){ //out 
  221. nRtVal=0;
  222. }else{
  223. //中点对分法
  224. int nTemp;
  225. CPoint ptStart,ptEnd,ptTemp;
  226. ptStart.x=m_flStartxTemp;
  227. ptStart.y=m_flStartyTemp;
  228. ptEnd.x=m_flEndxTemp;
  229. ptEnd.y=m_flEndyTemp;
  230. ptTemp.x=(m_flStartxTemp+m_flEndxTemp)/2;
  231. ptTemp.y=(m_flStartyTemp+m_flEndyTemp)/2;
  232. nTemp=PtStateToRect(ptTemp,rect);
  233.         
  234. while(1){
  235. if(nTemp == 0){
  236. nRtVal=1;
  237. break;
  238. }
  239. //TRACE("(%d,%d),(%d,%d),%d---%d---%dn",ptStart.x,ptStart.y,ptEnd.x,ptEnd.y,nPtStartState,nTemp,nPtEndState);
  240.      if(nTemp&nPtStartState){
  241. ptStart.x=ptTemp.x;
  242. ptStart.y=ptTemp.y;
  243. nPtStartState=nTemp;
  244. ptTemp.x=(ptStart.x+ptEnd.x)/2;
  245. ptTemp.y=(ptStart.y+ptEnd.y)/2;
  246. nTemp=PtStateToRect(ptTemp,rect);
  247. }
  248. if(nTemp&nPtEndState){
  249.                 ptEnd.x=ptTemp.x;
  250. ptEnd.y=ptTemp.y;
  251. nPtEndState=nTemp;
  252.   ptTemp.x=(ptStart.x+ptEnd.x)/2;
  253. ptTemp.y=(ptStart.y+ptEnd.y)/2;
  254. nTemp=PtStateToRect(ptTemp,rect);
  255. }
  256. if(fabs(ptStart.x-ptEnd.x)<=1 && fabs(ptStart.y-ptEnd.y)<=1){
  257. nRtVal=0;
  258. break;
  259. }
  260. }//while(1)
  261. }//else
  262.     return nRtVal;
  263. }
  264. /////////////////////////////////////////////
  265. void CLine::CreatGraph(CArray<float,float>& flArrayX,CArray<float,float>& flArrayY,int nPenWidth,COLORREF color,COLORREF fillColor,SHAPE_FILLSTYLE nStyle)
  266. {
  267. if(flArrayX.GetSize()!=2)
  268. return;
  269. CShape::CreatGraph(flArrayX,flArrayY,nPenWidth,color,fillColor,nStyle);
  270. m_flStartxTemp=m_flStartx=flArrayX.GetAt(0);
  271. m_flStartyTemp=m_flStarty=flArrayY.GetAt(0);
  272. m_flEndxTemp=m_flEndx=flArrayX.GetAt(1);
  273. m_flEndyTemp=m_flEndy=flArrayY.GetAt(1);
  274. }
  275. /////////////////////////////////////////////
  276. void CLine::CreatGraph(CArray<CPoint,CPoint>& ptArray,int nPenWidth,COLORREF color,COLORREF fillColor,SHAPE_FILLSTYLE nStyle)
  277. {
  278. if(ptArray.GetSize()!=2)
  279. return;
  280. CShape::CreatGraph(ptArray,nPenWidth,color,fillColor,nStyle);
  281. m_flStartxTemp=m_flStartx=((CPoint)ptArray.GetAt(0)).x;
  282. m_flStartyTemp=m_flStarty=((CPoint)ptArray.GetAt(0)).y;
  283. m_flEndxTemp=m_flEndx=((CPoint)ptArray.GetAt(1)).x;
  284. m_flEndyTemp=m_flEndy=((CPoint)ptArray.GetAt(1)).y;
  285. }
  286. void CLine::SetPtData(CArray<float,float>& flArrayX,CArray<float,float>& flArrayY)
  287. {
  288. m_flStartxTemp=m_flStartx=flArrayX.GetAt(0);
  289. m_flStartyTemp=m_flStarty=flArrayY.GetAt(0);
  290. m_flEndxTemp=m_flEndx=flArrayX.GetAt(1);
  291. m_flEndyTemp=m_flEndy=flArrayY.GetAt(1);
  292. }
  293. void CLine::GetPtData(CArray<float,float>& flArrayX,CArray<float,float>& flArrayY)
  294. {
  295. flArrayX.RemoveAll();
  296. flArrayY.RemoveAll();
  297. flArrayX.Add(m_flStartxTemp);
  298. flArrayX.Add(m_flEndxTemp);
  299. flArrayY.Add(m_flStartyTemp);
  300. flArrayY.Add(m_flEndyTemp);
  301. }
  302. /////////////////////////////////////////////
  303. void CLine::DrawCutToRect(CDC *pDC,COLORREF color,COLORREF fillColor,int penWidth,CFlRect m_rectFrom,CRect m_rectTo)
  304. {
  305. // if(!IsInRect(m_rectFrom)){
  306. // return;
  307. // }
  308. //得到移动扩缩后的关键数据
  309. float  flStartx,flStarty,flEndx,flEndy;
  310. //移动
  311. float stepx=m_rectTo.left-m_rectFrom.left;
  312. float stepy=m_rectTo.top-m_rectFrom.top;
  313. flStartx=m_flStartxTemp+stepx;
  314. flStarty=m_flStartyTemp+stepy;
  315. flEndx=m_flEndxTemp+stepx;
  316. flEndy=m_flEndyTemp+stepy;
  317. //扩缩
  318. float cx,cy,flScale;
  319. cx=m_rectTo.left;
  320. cy=m_rectTo.top;
  321. if(m_rectFrom.Width()<0.01){
  322. m_rectFrom.right=m_rectFrom.left +1;
  323. }
  324. if(m_rectFrom.Height()<0.01){
  325. m_rectFrom.bottom=m_rectFrom.top +1;
  326. }
  327. // flScale=min((float)m_rectTo.Width()/m_rectFrom.Width(),(float)m_rectTo.Height()/m_rectFrom.Height());
  328.  //   flScale=((float)m_rectTo.Width()/m_rectFrom.Width()+(float)m_rectTo.Height()/m_rectFrom.Height())/2;
  329.     flScale=(float)m_rectTo.Width()/m_rectFrom.Width();
  330. flStartx=(flStartx-cx)*flScale+cx;
  331. flStarty=(flStarty-cy)*flScale+cy;
  332. flEndx=(flEndx-cx)*flScale+cx;
  333. flEndy=(flEndy-cy)*flScale+cy;
  334. CPen pen,*poldPen;  
  335. pen.CreatePen(PS_SOLID,penWidth, color);
  336. poldPen=pDC->SelectObject(&pen); 
  337. pDC->MoveTo(flStartx,flStarty);
  338. pDC->LineTo(flEndx,flEndy);
  339. if(GetDrawPointsFlag()==1){
  340. DrawPointsCutTo(pDC,color,m_rectFrom,m_rectTo);
  341. }
  342. pDC->SelectObject(poldPen);
  343. }
  344. /////////////////////////////////////////////
  345. void CLine::Move(CDC *pDC,float stepx,float stepy)
  346. {
  347. RefreshData(m_bModified);
  348. // CShape::Draw(pDC,RGB(255,255,255),RGB(255,255,255));
  349. m_flStartx+=stepx;
  350. m_flStarty+=stepy;
  351. m_flEndx+=stepx;
  352. m_flEndy+=stepy;
  353. m_flStartxTemp+=stepx;
  354. m_flStartyTemp+=stepy;
  355. m_flEndxTemp+=stepx;
  356. m_flEndyTemp+=stepy;
  357. //Draw(pDC);
  358. }
  359. void CLine::PartMove(CDC *pDC,float PrevX,float PrevY,float CurX,float CurY)
  360. {
  361. RefreshData(m_bModified);
  362.     if(m_nSelectPtNum>-1){
  363. // CShape::Draw(pDC,RGB(255,255,255),RGB(255,255,255));
  364. if(m_nSelectPtNum==0){
  365. m_flStartx=CurX;
  366. m_flStarty=CurY;
  367. m_flStartxTemp=CurX;
  368. m_flStartyTemp=CurY;
  369. }else if(m_nSelectPtNum==1){
  370. m_flEndx=CurX;
  371. m_flEndy=CurY;
  372. m_flEndxTemp=CurX;
  373. m_flEndyTemp=CurY;
  374. }
  375. //CShape::Draw(pDC);
  376.     }else if(m_nSelectLineNum>-1){
  377. // CShape::Draw(pDC,RGB(255,255,255),RGB(255,255,255));
  378. float stepx,stepy;
  379. stepx=CurX-PrevX;
  380. stepy=CurY-PrevY;
  381. m_flStartx+=stepx;
  382. m_flStarty+=stepy;
  383. m_flEndx+=stepx;
  384. m_flEndy+=stepy;
  385. m_flStartxTemp+=stepx;
  386. m_flStartyTemp+=stepy;
  387. m_flEndxTemp+=stepx;
  388. m_flEndyTemp+=stepy;
  389. //CShape::Draw(pDC);
  390.     }
  391. }
  392. /////////////////////////////////////////////
  393. //function Rotate(...)
  394. //Rotate flAngle degrees around the ptCenter given as a param
  395. ////////////////////////////////////////////
  396. void CLine::Rotate(CDC *pDC,float CX,float CY,float flAngle)
  397. {
  398. //if(abs(flAngle-m_flAngleTemp)>0.05)
  399. {
  400. if(m_flScaleTemp!=1){
  401. RefreshData(TRUE);
  402. }
  403. // CShape::Draw(pDC,RGB(255,255,255),RGB(255,255,255));
  404. m_ptRotateCenterTemp=CPoint(CX,CY);
  405. m_flAngleTemp=flAngle;
  406. m_bModified=TRUE;
  407. m_flStartxTemp=((m_flStartx-CX)*cos(flAngle)-(m_flStarty-CY)*sin(flAngle))+CX;
  408. m_flStartyTemp=((m_flStarty-CY)*cos(flAngle)+(m_flStartx-CX)*sin(flAngle))+CY;
  409. m_flEndxTemp=((m_flEndx-CX)*cos(flAngle)-(m_flEndy-CY)*sin(flAngle))+CX;
  410. m_flEndyTemp=((m_flEndy-CY)*cos(flAngle)+(m_flEndx-CX)*sin(flAngle))+CY;
  411. // CShape::Draw(pDC);
  412. }
  413. }
  414. /////////////////////////////////////////////
  415. //function Magnify(...)
  416. //Magnify flScale times relative to the ptCenter given as a param
  417. ////////////////////////////////////////////
  418. void CLine::Magnify(CDC *pDC,float CX,float CY,float flScale)
  419. {
  420. if(m_flAngleTemp!=0){
  421. RefreshData(TRUE);
  422. }
  423. // CShape::Draw(pDC,RGB(255,255,255),RGB(255,255,255));
  424.     m_ptMagnifyCenterTemp=CPoint(CX,CY);
  425. m_flScaleTemp=flScale;
  426. m_bModified=TRUE;
  427. m_flStartxTemp=(m_flStartx-CX)*flScale+CX;
  428.     m_flStartyTemp=(m_flStarty-CY)*flScale+CY;
  429. m_flEndxTemp=(m_flEndx-CX)*flScale+CX;
  430.     m_flEndyTemp=(m_flEndy-CY)*flScale+CY;
  431. // CShape::Draw(pDC);
  432. }
  433. void CLine::TopToBottom(CDC* pDC,CRect rect)
  434. {
  435. RefreshData(m_bModified);
  436. // CShape::Draw(pDC,RGB(255,255,255),RGB(255,255,255));
  437. m_flStarty=rect.top/1000.0+rect.bottom/1000.0-m_flStarty;
  438. m_flEndy=rect.top/1000.0+rect.bottom/1000.0-m_flEndy;
  439. m_flStartyTemp=rect.top/1000.0+rect.bottom/1000.0-m_flStartyTemp;
  440. m_flEndyTemp=rect.top/1000.0+rect.bottom/1000.0-m_flEndyTemp;
  441. // CShape::Draw(pDC);
  442. }
  443. void CLine::LeftToRight(CDC* pDC,CRect rect)
  444. {
  445. RefreshData(m_bModified);
  446. // CShape::Draw(pDC,RGB(255,255,255),RGB(255,255,255));
  447. m_flStartx=rect.left/1000.0+rect.right/1000.0-m_flStartx;
  448. m_flEndx=rect.left/1000.0+rect.right/1000.0-m_flEndx;
  449. m_flStartxTemp=rect.left/1000.0+rect.right/1000.0-m_flStartxTemp;
  450. m_flEndxTemp=rect.left/1000.0+rect.right/1000.0-m_flEndxTemp;
  451. // CShape::Draw(pDC);
  452. ///
  453. /////////////////////////////////////////////
  454. //function------IsInRect
  455. //return value
  456. //0----------out
  457. //1----------cut
  458. //2----------in
  459. /////////////////////////////////////////////
  460. CRect CLine::GetBoundaryRect()
  461. {
  462.     CRect rect;
  463. rect.left=1000*(m_flStartxTemp<=m_flEndxTemp?m_flStartxTemp:m_flEndxTemp);
  464. rect.right=1000*(m_flStartxTemp<=m_flEndxTemp?m_flEndxTemp:m_flStartxTemp);
  465. rect.top=1000*(m_flStartyTemp<=m_flEndyTemp?m_flStartyTemp:m_flEndyTemp);
  466. rect.bottom=1000*(m_flStartyTemp<=m_flEndyTemp?m_flEndyTemp:m_flStartyTemp);
  467. return rect;
  468. }
  469. ////////////////////////////////////////////////
  470. ////function  RefreshData(...)
  471. ////刷新m_flStartx,m_flStarty,m_flEndx,m_flEndy
  472. ////////////////////////////////////////////////
  473. void CLine::RefreshData(bool bRefresh)
  474. {
  475. if(bRefresh){
  476. m_flStartx=m_flStartxTemp;
  477. m_flStarty=m_flStartyTemp;
  478. m_flEndx=m_flEndxTemp;
  479.         m_flEndy=m_flEndyTemp;
  480.     m_bModified=FALSE;
  481.         m_ptMagnifyCenterTemp=CPoint(0,0);
  482. m_flScaleTemp=1;
  483. m_ptRotateCenterTemp=CPoint(0,0);
  484. m_flAngleTemp=0;
  485. }
  486. }
  487. //////////////////////////////////////////////
  488. CPoint CLine::GetCenterPoint()
  489. {
  490. CPoint ptRelVal;
  491. ptRelVal.x = (m_flStartx+m_flEndx)/2;
  492. ptRelVal.y = (m_flStarty+m_flEndy)/2;
  493. return ptRelVal;
  494. }
  495. //////
  496. int CLine::GetPtState(float flx,float fly,float flRate)
  497. {
  498. //on the out point
  499. if(IsPtInRect(m_flStartxTemp-3*flRate,m_flStartyTemp-3*flRate,m_flStartxTemp+3*flRate,m_flStartyTemp+3*flRate,flx,fly)){
  500. m_nSelectPtNum=0;
  501. m_nSelectLineNum=-1;
  502. return 1;
  503. }
  504.     if(IsPtInRect(m_flEndxTemp-3*flRate,m_flEndyTemp-3*flRate,m_flEndxTemp+3*flRate,m_flEndyTemp+3*flRate,flx,fly)){
  505. m_nSelectPtNum=1;
  506. m_nSelectLineNum=-1;
  507. return 1;
  508. }
  509.     //on the outline
  510. if(GetPtStateToBigLine(m_flStartxTemp,m_flStartyTemp,m_flEndxTemp,m_flEndyTemp,5*flRate,flx,fly)){
  511. m_nSelectPtNum=-1;
  512. m_nSelectLineNum=0;
  513. return 2;
  514. }
  515.     m_nSelectPtNum=-1;
  516. m_nSelectLineNum=-1;
  517. return 0;
  518. }
  519. float CLine::GetSelectLineRate()
  520. {
  521. if(m_nSelectLineNum==-1)
  522. return 0;
  523. return -GetLineRate(m_flStartxTemp,m_flStartyTemp,m_flEndxTemp,m_flEndyTemp);
  524. }
  525. //////////////////////////////////////////////////////////////////////
  526. // MODULE   :ExPort
  527. // ABSTRACT :Export to a txt file
  528. // FUNCTION :File->Export...
  529. // NOTE     :
  530. // RETURN   :
  531. // ARGUMENTS:
  532. //              I/O           TYPE      NAME       EXPLANATION
  533. //               O            FILE*    outStream    Out put File
  534. // CREATE   :  FNST)handwolf  2004-4-14
  535. // UPDATE   :  
  536. //          : 
  537. //////////////////////////////////////////////////////////////////////
  538. void CLine::ExPort(FILE* outStream)//增加导出txt功能时用
  539. {
  540. fprintf(outStream, " CLine n");
  541. CShape::ExPort(outStream);
  542. fprintf(outStream, " %f %f %f %f n",m_flStartxTemp,m_flStartyTemp, m_flEndxTemp, m_flEndyTemp);
  543. }
  544. //////////////////////////////////////////////////////////////////////
  545. // MODULE   :ImPort
  546. // ABSTRACT :ImPort from a txt file
  547. // FUNCTION :File->ImPort...
  548. // NOTE     :
  549. // RETURN   :
  550. // ARGUMENTS:
  551. //              I/O           TYPE      NAME       EXPLANATION
  552. //               I            FILE*    inStream    in put File
  553. // CREATE   :  FNST)handwolf  2004-4-14
  554. // UPDATE   :  
  555. //          : 
  556. //////////////////////////////////////////////////////////////////////
  557. void CLine::ImPort(FILE* inStream)
  558. {
  559. CShape::ImPort(inStream);
  560. fscanf(inStream, "%f %f %f %f",&m_flStartx, &m_flStarty, &m_flEndx, &m_flEndy);
  561. m_flStartxTemp=m_flStartx;
  562. m_flStartyTemp=m_flStarty;
  563. m_flEndxTemp=m_flEndx;
  564. m_flEndyTemp=m_flEndy;
  565. }
  566. CString CLine::GetNameString()
  567. {
  568. CString str;
  569. str.LoadString(IDS_LINE);
  570. return str;
  571. }
  572. //////////////////////////////////////////////////////////////////////
  573. //End of File////////////////
  574. ////////////////////////////////////////////////////
  575. //end of file