SelectDraw.cpp
上传用户:popouu88
上传日期:2013-02-11
资源大小:2894k
文件大小:7k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. // SelectDraw.cpp: implementation of the CSelectDraw class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "..WB.h"
  6. #include "SelectDraw.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. CSelectDraw::CSelectDraw( CDrawView * view ) : CDraw( view )
  16. {
  17. this->type = SELECT;
  18. this->m_bErase = false;
  19. if( this->pen.GetSafeHandle( ) )
  20. this->pen.DeleteObject( );
  21. this->pen.CreatePen( PS_DOT , 1 , RGB( 0 , 0 , 0 ) );
  22. if( this->brush.GetSafeHandle( ) )
  23. this->brush.DeleteObject( );
  24. this->brush.CreateStockObject( NULL_BRUSH );
  25. }
  26. CSelectDraw::~CSelectDraw( )
  27. {
  28. if( ! this->draw_list.empty( ) && ::IsWindow( this->view->GetSafeHwnd( ) ) )
  29. {
  30. CDC * pDC = this->view->GetMemDC( );
  31. int rop = pDC->SetROP2( R2_NOTXORPEN );
  32. //恢复选中的图元
  33. CRect rc;
  34. for( DRAW_LIST::iterator itr = this->draw_list.begin( ); itr != this->draw_list.end( ); itr++ )
  35. {
  36. ( * itr )->GetRgn( ).GetRgnBox( &rc );
  37. rc.InflateRect( 1 , 1 , 1 , 1 );
  38. pDC->Rectangle( &rc );
  39. }
  40. pDC->SetROP2( rop );
  41. this->draw_list.clear( );
  42. this->view->Invalidate( );
  43. }
  44. }
  45. //设定画笔颜色
  46. void CSelectDraw::SetColor( COLORREF color )
  47. {
  48. for( DRAW_LIST::iterator itr = this->draw_list.begin( ); itr != this->draw_list.end( ); itr ++ )
  49. {
  50. ( * itr )->SetColor( color );
  51. ( * itr )->Draw( );
  52. this->view->assembleData( * itr , CDrawView::MODIFY );
  53. }
  54. this->view->Invalidate( );
  55. }
  56. //取得画笔颜色
  57. COLORREF CSelectDraw::GetColor( void )
  58. {
  59. return RGB( 0 , 0 , 0 );
  60. }
  61. //设定画笔宽度
  62. void CSelectDraw::SetWidth( int width )
  63. {
  64. for( DRAW_LIST::iterator itr = this->draw_list.begin( ); itr != this->draw_list.end( ); itr ++ )
  65. {
  66. ( * itr )->SetWidth( width );
  67. ( * itr )->Draw( );
  68. }
  69. this->view->Invalidate( );
  70. }
  71. //取得画笔宽度
  72. int CSelectDraw::GetWidth( void )
  73. {
  74. return 1;
  75. }
  76. //设定画刷是否为空,缺省情况为空
  77. void CSelectDraw::SetEmpty( bool m_bEmpty )
  78. {
  79. this->m_bErase = m_bEmpty;
  80. }
  81. //判断画刷是否为空 
  82. bool CSelectDraw::IsEmpty( void )
  83. {
  84. return this->m_bErase;
  85. }
  86. //选择图元
  87. void CSelectDraw::Select( void )
  88. {   //取出内存画布
  89. CDC * pDC = this->view->GetMemDC( );
  90.     //清除选择过的图元
  91. this->draw_list.clear( );
  92.     //选择的矩形区域
  93. CRect rc( this->start , this->end );
  94. rc.NormalizeRect( );
  95.     //清除所有图元后在重画没有被删除掉的图元
  96. pDC->FillSolidRect( 0 , 0 , this->dcSize.cx , this->dcSize.cy , pDC->GetBkColor( ) );
  97.     //创建选择的区域
  98. if( this->selRgn.GetSafeHandle( ) )
  99. this->selRgn.DeleteObject( );
  100. this->selRgn.CreateRectRgn( 0 , 0 , 0 , 0 );
  101. CRgn r , r0;
  102. r.CreateRectRgn( 0 , 0 , 0 , 0 );
  103.     //创建鼠标包含的区域
  104. r0.CreateRectRgn( rc.left , rc.top , rc.right , rc.bottom );
  105.     //取得列表
  106. DRAW_LIST * drawlst = view->LockList( );
  107. bool m_bDelete = false;
  108. CDraw * draw = NULL;
  109.     //设定选择画布
  110. pDC->SelectObject( &this->pen );
  111. pDC->SelectObject( &this->brush );
  112.     //搜索所有图元
  113. for( DRAW_LIST::iterator itr = drawlst->begin( ); itr != drawlst->end( ); )
  114. {
  115. m_bDelete = false;
  116. draw = * itr;
  117.         //选中了一个图元 
  118. if( r.CombineRgn( &r0 , &draw->GetRgn( ) , RGN_AND ) != NULLREGION )
  119. {
  120. if( this->m_bErase )
  121. {   //删除一个图元
  122. itr = drawlst->erase( itr );
  123. this->view->assembleData( draw , CDrawView::DEL );
  124. delete draw;
  125. m_bDelete = true;
  126. }
  127. else //选择一个图元
  128. {
  129. draw->Draw( pDC );
  130. this->draw_list.push_back( draw );
  131. draw->GetRgn( ).GetRgnBox( &rc );
  132. rc.InflateRect( 1 , 1 , 1 , 1 );
  133.                 //画出矩形框 
  134. pDC->Rectangle( &rc );
  135. CRgn rr;
  136.                 //保存图元所在的最大矩形空间
  137. rr.CreateRectRgn( rc.left , rc.top , rc.right , rc.bottom );
  138. this->selRgn.CombineRgn( &this->selRgn , &rr , RGN_OR );
  139. }
  140. }
  141. else //没有删除,画出图元
  142.   
  143. draw->Draw( pDC );
  144. if( ! m_bDelete )
  145. itr ++;
  146. }
  147. this->view->UnlockList( );
  148. this->view->Invalidate( );
  149. }
  150. void CSelectDraw::LButtonDown( UINT nFlags , CPoint point )
  151. {
  152. CDraw::LButtonDown( nFlags , point );
  153.     //如果有图元选中且鼠标的当前位置不在选中区域,那么清除所有的选择 
  154. if( ! this->draw_list.empty( ) && ! this->selRgn.PtInRegion( point ) )
  155. {
  156. CDC * pDC = this->view->GetMemDC( );
  157. int rop = pDC->SetROP2( R2_NOTXORPEN );
  158. CRect rc;
  159. for( DRAW_LIST::iterator itr = this->draw_list.begin( ); itr != this->draw_list.end( ); itr ++ )
  160. {
  161. ( * itr )->GetRgn( ).GetRgnBox( &rc );
  162. rc.InflateRect( 1 , 1 , 1 , 1 );
  163. pDC->Rectangle( &rc );
  164. }
  165. pDC->SetROP2( rop );
  166.         //清除选择列表和选择框
  167. this->draw_list.clear( );
  168. this->selRgn.DeleteObject( );
  169. }
  170. }
  171. void CSelectDraw::MouseMove( UINT nFlags , CPoint point )
  172. {   //设定鼠标形状
  173. if(  this->selRgn.GetSafeHandle( ) )
  174. {
  175. HCURSOR hCursor = ::AfxGetApp( )->LoadStandardCursor( MAKEINTRESOURCE( this->selRgn.PtInRegion( point ) ? IDC_SIZEALL : IDC_ARROW ) );
  176. hCursor = ( HCURSOR )::SetClassLong( this->view->GetSafeHwnd( ) , GCL_HCURSOR , ( long )hCursor );
  177. ::DestroyCursor( hCursor );
  178. }
  179. if( nFlags & MK_LBUTTON )
  180. {   //如果位图为空 
  181. if( this->draw_list.empty( ) )
  182. CDraw::MouseMove( nFlags , point );
  183. else if( this->selRgn.GetSafeHandle( ) )
  184. {   //计算移动的方向和大小
  185. CPoint pt = point - this->end;
  186. this->end = point;
  187.             //移动区域 
  188. this->selRgn.OffsetRgn( pt );
  189. CDC * pDC = this->view->GetMemDC( );
  190. CRect rc;
  191. int rop = pDC->SetROP2( R2_NOTXORPEN );
  192. //移动图元
  193. for( DRAW_LIST::iterator itr = this->draw_list.begin( ); itr != this->draw_list.end( ); itr ++ )
  194. {
  195. ( * itr )->GetRgn( ).GetRgnBox( &rc );
  196. rc.InflateRect( 1 , 1 , 1 , 1 );
  197.                 //清除矩形框 
  198. pDC->Rectangle( &rc );
  199. //移动矩形框 
  200. ( * itr )->GetRgn( ).OffsetRgn( pt );
  201. rc.OffsetRect( pt );
  202.                 
  203. pDC->Rectangle( &rc );
  204. }
  205. rop = pDC->SetROP2( rop );
  206. this->view->Invalidate( );
  207. }
  208. }
  209. }
  210. void CSelectDraw::LButtonUp( UINT nFlags , CPoint point )
  211. {
  212. this->end = point;
  213. if( ! this->draw_list.empty( ) )
  214. {
  215. CDC * pDC = this->view->GetMemDC( );
  216. //删掉所有的图像
  217. pDC->FillSolidRect( 0 , 0 , this->dcSize.cx , this->dcSize.cy , pDC->GetBkColor( ) );
  218. DRAW_LIST * drawlst = this->view->LockList( );
  219. for( DRAW_LIST::iterator itr = drawlst->begin( ); itr != drawlst->end( ); itr ++ )
  220. ( * itr )->Draw( pDC );
  221. //画出选择的矩形框和通知外部程序
  222. CRect rc;
  223. for( itr = this->draw_list.begin( ); itr != this->draw_list.end( ); itr ++ )
  224. {
  225. ( * itr )->GetRgn( ).GetRgnBox( &rc );
  226. this->view->assembleData( *itr , CDrawView::MODIFY );
  227. rc.InflateRect( 1 , 1 , 1 , 1 );
  228. pDC->Rectangle( rc );
  229. }//重画
  230. this->view->UnlockList( );
  231. this->view->Invalidate( );
  232. }
  233. else 
  234. {
  235. if( this->end == this->start )
  236. this->end.Offset( 1 , 1 );
  237. this->Select( );
  238. }
  239. }
  240. CDC * CSelectDraw::Draw( CDC * pDC )
  241. {
  242. pDC = CDraw::Draw( pDC );
  243. if( pDC )
  244. {
  245. CRect rc( this->start , this->end );
  246. rc.NormalizeRect( );
  247. pDC->Rectangle( &rc );
  248. }
  249. return pDC;
  250. }