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

IP电话/视频会议

开发平台:

Visual C++

  1. // DrawView.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "WB.h"
  5. #include "MainFrame.h"
  6. #include "DrawView.h"
  7. #include "DrawLine.h"
  8. #include "DrawRectangle.h"
  9. #include "DrawCircle.h"
  10. #include "DrawRoundRect.h"
  11. #include "DrawSelectDraw.h"
  12. #include "DrawWBPen.h"
  13. #include "Drawtext.h"
  14. #include "DrawWBWnd.h"
  15. #ifdef _DEBUG
  16. #define new DEBUG_NEW
  17. #undef THIS_FILE
  18. static char THIS_FILE[] = __FILE__;
  19. #endif
  20. /////////////////////////////////////////////////////////////////////////////
  21. // CDrawView
  22. CDrawView::CDrawView( CMainFrame * mainFrame )
  23. {
  24. this->mainFrame = mainFrame;
  25. this->iterator = NULL;
  26. this->curDraw = 0;
  27. this->draw = NULL;
  28. this->OnWB = NULL;
  29. this->pContext = NULL;
  30. this->userName = "";
  31. }
  32. CDrawView::~CDrawView()
  33. {
  34. CDraw * d = NULL;
  35. while( ! this->drawList.empty( ) )
  36. {
  37. d = this->drawList.front( );
  38. this->drawList.pop_front( );
  39. delete d;
  40. }
  41. if( this->draw )
  42. delete this->draw;
  43. if( this->iterator )
  44. delete this->iterator;
  45. }
  46. BEGIN_MESSAGE_MAP(CDrawView, CScrollView)
  47. //{{AFX_MSG_MAP(CDrawView)
  48. ON_WM_LBUTTONDOWN()
  49. ON_WM_LBUTTONUP()
  50. ON_WM_MOUSEMOVE()
  51. ON_WM_CREATE()
  52. ON_WM_VSCROLL()
  53. ON_WM_HSCROLL()
  54. ON_WM_ERASEBKGND()
  55. ON_BN_CLICKED(IDC_OPEN, OnOpen)
  56. ON_BN_CLICKED(IDC_SAVE, OnSave)
  57. ON_WM_CONTEXTMENU()
  58. ON_COMMAND(ID_DRAW_FIRST, OnDrawFirst)
  59. ON_COMMAND(ID_DRAW_LAST, OnDrawLast)
  60. //}}AFX_MSG_MAP
  61. END_MESSAGE_MAP()
  62. /////////////////////////////////////////////////////////////////////////////
  63. // CDrawView drawing
  64. int CDrawView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  65. {
  66. if (CScrollView::OnCreate(lpCreateStruct) == -1)
  67. return -1;
  68. //设定工作区大小
  69. this->SetScrollSizes( MM_TEXT , CSize( 2034 , 2034 ) );
  70.     //指示器
  71. this->iterator = new CIterator( this );
  72. CClientDC dc( this );
  73. //取出工作区大小
  74. CSize s = this->GetTotalSize( );
  75. //设定内存画布
  76. this->memDC.CreateCompatibleDC( &dc );
  77. //设定内存位图
  78. this->memBitmap.CreateCompatibleBitmap( &dc , s.cx , s.cy );
  79. this->memDC.SelectObject( &this->memBitmap );
  80. //画布背景为白色
  81. this->memDC.FillSolidRect( 0 , 0 , s.cx , s.cy , this->memDC.GetBkColor( ) );
  82.    
  83. // ::ScrollBar( this->GetSafeHwnd( ) );
  84. return 0;
  85. }
  86. BOOL CDrawView::OnEraseBkgnd(CDC* pDC) 
  87. {
  88. return true;
  89. }
  90. //画图
  91. void CDrawView::OnDraw( CDC * pDC )
  92. {
  93. if( this->memDC.GetSafeHdc( ) && this->memBitmap.GetSafeHandle( ) )
  94. {
  95. CRect rc;
  96. this->GetClientRect( &rc );
  97. rc.OffsetRect( this->GetScrollPosition( ) );
  98.         //显示内存位图
  99. pDC->BitBlt( rc.left , rc.top , rc.Width( ) , rc.Height( ) , &this->memDC , rc.left , rc.top , SRCCOPY );
  100. //显示远程指示器
  101. if( this->iterator )
  102. this->iterator->Draw( pDC );
  103. }
  104. }
  105. //刷新
  106. void CDrawView::Reflush( void )
  107. {  
  108. if( this->memDC.GetSafeHdc( ) )
  109. { //取出工作区大小
  110. CSize s = this->GetTotalSize( );
  111. //画布背景为白色
  112. this->memDC.FillSolidRect( 0 , 0 , s.cx , s.cy , this->memDC.GetBkColor( ) );
  113. for( DRAW_LIST::iterator itr = this->drawList.begin( ); itr != this->drawList.end( ); itr ++ )
  114. ( * itr )->Draw( &this->memDC );
  115. this->Invalidate( );
  116. }
  117. }
  118. //组合数据
  119. void CDrawView::assembleData( CDraw * draw , ACTION action , int pos )
  120. {
  121. if( draw && this->OnWB )
  122. {   
  123. char * buffer = NULL;
  124. int size = 0;
  125. int rgnSize = draw->GetRgn( ).GetRegionData( NULL , 0 );
  126. char * rgnData = new char[ rgnSize ];
  127. if( ! rgnData ) return;
  128.         //取得区域
  129. draw->GetRgn( ).GetRegionData( ( RGNDATA * )rgnData , rgnSize );
  130. //用户名
  131. if( draw->userName.IsEmpty( ) ) draw->userName = this->userName;
  132.         //用户名大小   
  133. size += draw->userName.GetLength( ) + sizeof( char );
  134. //id
  135. size += sizeof( int );
  136. //图元类型
  137. size += sizeof( int );
  138. //图元操作
  139. size += sizeof( int );
  140. switch( action )
  141. {
  142. case ADD : //增加
  143. {   //图元的类型
  144. size += sizeof( int );
  145. //区域的大小
  146. size += rgnSize;
  147. //区域颜色
  148. size += sizeof( int );
  149. char * bmBuffer = NULL;
  150. int bmSize = 0;
  151.                 //文本
  152. if( draw->GetType( ) == CDraw::TEXT )
  153. {
  154. size += ( ( CText * )draw )->GetText( ).GetLength( ) + sizeof( char );
  155. }//窗口
  156. else if( draw->GetType( ) == CDraw::WBWND || draw->GetType( ) == CDraw::WBWND1 )
  157. {
  158. CBitmap * bmp = ( ( CWBWnd * )draw )->GetBitmap( );
  159. BITMAP bm;
  160. bmp->GetBitmap( &bm );
  161. //设定位图无关信息
  162. BITMAPINFOHEADER h = 
  163. {
  164. sizeof( h ) , bm.bmWidth , bm.bmHeight , 1 , bm.bmBitsPixel * bm.bmPlanes , BI_RGB , ( 31 + h.biWidth * h.biHeight * h.biBitCount ) / 8 , 0 , 0 , 0 , 0 
  165. };
  166. bmSize = sizeof( h ) + h.biSizeImage;
  167. bmBuffer = new char[ 2 * bmSize ];
  168.                     //位图头信息
  169. memcpy( bmBuffer , &h , sizeof( h ) ); 
  170.                     //取出位图  
  171. ::GetDIBits( this->memDC.GetSafeHdc( ) , * bmp , 0 , bm.bmHeight , bmBuffer + sizeof( h ) , ( BITMAPINFO * )&h , DIB_RGB_COLORS );
  172. size += bmSize;
  173. }//申请内存
  174. buffer = new char[ size ];
  175. if( ! buffer ) return;
  176. char * now = buffer;
  177. //用户名
  178. strcpy( now , draw->userName ); now += draw->userName.GetLength( ) + sizeof( char );
  179. //id
  180. *( int * )now = draw->drawId; now += sizeof( int );
  181. //图元类型
  182. *( int * )now = draw->GetType( ); now += sizeof( int );
  183. //图元操作
  184. *( int * )now = action; now += sizeof( int );
  185. //区域大小
  186. *( int * )now = rgnSize; now += sizeof( int );
  187. //区域
  188. memcpy( now , rgnData , rgnSize ); now += rgnSize;
  189. //区域颜色
  190. *( int * )now = draw->GetColor( ); now += sizeof( int );
  191. if( draw->GetType( ) == CDraw::TEXT )
  192. {
  193. strcpy( now , ( ( CText * )draw )->GetText( ) ); now += ( ( CText * )draw )->GetText( ).GetLength( ) + sizeof( char );
  194. }
  195. else if( draw->GetType( ) == CDraw::WBWND || draw->GetType( ) == CDraw::WBWND1 )
  196. memcpy( now , bmBuffer , bmSize ); 
  197.                 //通知外部程序
  198. this->OnWB( this->pContext , this->GetParent( ) , buffer , size );
  199. delete []buffer;  buffer = NULL;
  200. if( bmBuffer )
  201. {
  202. delete []bmBuffer; bmBuffer = NULL;
  203. }
  204. }
  205. break;
  206. case DEL : //删除
  207. {
  208. buffer = new char[ size ];
  209. if( ! buffer ) return;
  210. char * now = buffer;
  211. //用户名
  212. strcpy( now , draw->userName ); now += draw->userName.GetLength( ) + sizeof( char );
  213. //id
  214. *( int * )now = draw->drawId; now += sizeof( int );
  215. //图元类型
  216. *( int * )now = draw->GetType( ); now += sizeof( int );
  217. //图元操作
  218. *( int * )now = action; now += sizeof( int );
  219. //通知外部程序
  220. this->OnWB( this->pContext , this->GetParent( ) , buffer , size );
  221. delete buffer;  buffer = NULL;
  222. }
  223. break;
  224. case MODIFY : //修改
  225. {   //图元的位置和颜色
  226. size += 3 * sizeof( int );
  227. buffer = new char[ size ];
  228. if( ! buffer ) return;
  229. char * now = buffer;
  230. //用户名
  231. strcpy( now , draw->userName ); now += draw->userName.GetLength( ) + sizeof( char );
  232. //id
  233. *( int * )now = draw->drawId; now += sizeof( int );
  234. //图元类型
  235. *( int * )now = draw->GetType( ); now += sizeof( int );
  236. //图元操作
  237. *( int * )now = action; now += sizeof( int );
  238. //图元所在的位置
  239. CRect rc;
  240. draw->GetRgn( ).GetRgnBox( &rc );
  241.                 
  242. *( int * )now = rc.left; now += sizeof( int );
  243. *( int * )now = rc.top; now += sizeof( int );
  244.                 //图元的颜色
  245. *( int * )now = draw->GetColor( );
  246. //通知外部程序
  247. this->OnWB( this->pContext , this->GetParent( ) , buffer , size );
  248. delete buffer;buffer = NULL;
  249. }
  250. break;
  251. case POSITION :
  252. {
  253. size += sizeof( int );
  254. buffer = new char[ size ];
  255. if( ! buffer ) return;
  256. char * now = buffer;
  257. //用户名
  258. strcpy( now , draw->userName ); now += draw->userName.GetLength( ) + sizeof( char );
  259. //id
  260. *( int * )now = draw->drawId; now += sizeof( int );
  261. //图元类型
  262. *( int * )now = draw->GetType( ); now += sizeof( int );
  263. //图元操作
  264. *( int * )now = action; now += sizeof( int );
  265. //前还是后
  266. *( int * )now = pos; // 1 表示前 ; 2 表示后
  267. //通知外部程序
  268. this->OnWB( this->pContext , this->GetParent( ) , buffer , size );
  269. delete buffer;  buffer = NULL;
  270. }break;
  271. }
  272. delete rgnData; rgnData = NULL;
  273. }
  274. }
  275. //解析数据
  276. void CDrawView::parseData( char * buffer , int size )
  277. {   //用户名
  278. CString username = buffer; buffer += username.GetLength( ) + sizeof( char );
  279.     //draw id
  280. int drawid = *( int * )buffer; buffer += sizeof( int );
  281.     //图元类型
  282. int type = *( int * )buffer ; buffer += sizeof( int );
  283.     //图元的行为
  284. ACTION action = * ( ACTION * )buffer ; buffer += sizeof( int );
  285. CDraw * draw = NULL;
  286.     //增加一个图元
  287. if( action == ADD )
  288. {   //区域大小
  289. int rgnSize = *( int * )buffer; buffer += sizeof( int );
  290. char * rgnData = buffer; buffer += rgnSize;
  291. switch( type )
  292. {
  293. case CDraw::LINE : draw = new CLine( this ); break;
  294. case CDraw::RECT : draw = new CRectangle( this ); break;
  295. case CDraw::CIRCLE : draw = new CCircle( this ); break;
  296. case CDraw::ROUNDRECT : draw = new CRoundRect( this );break;
  297. case CDraw::PEN : 
  298. case CDraw::PEN1 : draw = new CWBPen( this ); break;
  299. case CDraw::TEXT : draw = new CText( this ); break;
  300. case CDraw::WBWND : 
  301. case CDraw::WBWND1 :
  302. draw = new CWBWnd( this , false , false ); break;
  303. }
  304. if( draw )
  305. {  
  306. draw->userName = username;
  307. draw->drawId = drawid;
  308. //创建区域
  309. draw->GetRgn( ).CreateFromData( NULL , rgnSize , ( RGNDATA * )rgnData );
  310.             //颜色
  311. draw->SetColor( *( int * )buffer ); buffer += sizeof( int );
  312. //文本
  313. if( draw->GetType( ) == CDraw::TEXT )
  314. ( ( CText * )draw )->SetText( buffer );
  315.             //窗口
  316. else if( draw->GetType( ) == CDraw::WBWND || draw->GetType( ) == CDraw::WBWND )
  317. {
  318. CBitmap * bmp = ( ( CWBWnd * )draw )->GetBitmap( );
  319. if( ! bmp ) 
  320. {
  321. delete draw; return;
  322. }
  323. BITMAPINFOHEADER * h = ( BITMAPINFOHEADER * )buffer; buffer += sizeof( BITMAPINFOHEADER );
  324. ::SetDIBits( this->memDC.GetSafeHdc( ) , * bmp , 0 , h->biHeight , buffer , ( BITMAPINFO * )h , DIB_RGB_COLORS );
  325. }
  326. this->drawList.push_back( draw );
  327. }
  328. }
  329. else if( action == MODIFY )
  330. {   
  331. this->LockList( );
  332. //查找图元
  333. for( DRAW_LIST::iterator itr = this->drawList.begin( ); itr != this->drawList.end( ); itr ++ )
  334. {
  335. draw = * itr;
  336. if( draw->userName == username && draw->drawId == drawid )
  337. {
  338. CRect rc;
  339. draw->GetRgn( ).GetRgnBox( &rc );
  340. draw->GetRgn( ).OffsetRgn( - rc.left , - rc.top );
  341. rc.left = *( int * )buffer; buffer += sizeof( int );
  342. rc.top = *( int * )buffer; buffer += sizeof( int );
  343. draw->GetRgn( ).OffsetRgn( rc.left , rc.top );
  344. draw->SetColor( *( int * )buffer );
  345. break;
  346. }
  347. }
  348. this->UnlockList( );
  349. }
  350. else if( action == DEL )
  351. { //查找图元
  352. this->LockList( );
  353. for( DRAW_LIST::iterator itr = this->drawList.begin( ); itr != this->drawList.end( ); itr ++ )
  354. {
  355. draw = * itr;
  356. if( draw->userName == username && draw->drawId == drawid )
  357. {
  358. this->drawList.erase( itr );
  359. break;
  360. }
  361. }
  362. this->UnlockList( );
  363. }//指示器
  364. else if( action == ITERATOR )
  365. {   //是否显示
  366. bool m_bShow = *( int * )buffer; buffer += sizeof( int );
  367.         //坐标
  368. CPoint point;
  369. point.x = *( int * )buffer; buffer += sizeof( int );
  370. point.y = *( int * )buffer;
  371. this->GetIterator( )->SetIterator( &m_bShow , &point );
  372. if( this->mainFrame )
  373. ( ( CButton * )this->mainFrame->GetToolBar( ).GetDlgItem( IDC_RADIO12 ) )->SetCheck( m_bShow );
  374. }
  375. else if( action == POSITION )
  376. {   //1表示前 2 表示后
  377. int pos = *( int * )buffer;
  378. //查找图元
  379. this->LockList( );
  380. for( DRAW_LIST::iterator itr = this->drawList.begin( ); itr != this->drawList.end( ); itr ++ )
  381. {
  382. draw = * itr;
  383.             //找到了
  384. if( draw->userName == username && draw->drawId == drawid )
  385. {
  386. this->drawList.remove( draw );
  387. if( pos == 1 )
  388. this->drawList.push_back( draw );
  389. else if( pos == 2 )
  390. this->drawList.push_front( draw );
  391. break;
  392. }
  393. }
  394. this->UnlockList( );
  395. }
  396. this->Reflush( );
  397. }
  398. //选择工具
  399. void CDrawView::SelectDraw( int index , COLORREF color , int width , bool m_bEmpty )
  400. {
  401. this->curDraw = index;
  402. if( this->draw )
  403. {
  404. if( this->draw->GetType( ) == CDraw::TEXT )
  405. {   
  406. CText * text = ( CText * )this->draw;
  407. //保存
  408. if( ! text->GetText( ).IsEmpty( ) )
  409. {
  410. if( ! text->GetRgn( ).GetSafeHandle( ) )
  411. text->LButtonUp( 0 , CPoint( 0 , 0 ) );
  412. this->drawList.push_back( this->draw );
  413. }
  414. else
  415. {
  416. delete this->draw; this->draw = NULL;
  417. }
  418. }
  419. else //删除
  420. {
  421. delete this->draw; this->draw = NULL;
  422. }
  423. }
  424. switch( index )
  425. {
  426. case CDraw::SELECT : this->draw = new CSelectDraw( this ); break;
  427. case CDraw::LINE : this->draw = new CLine( this ); break;
  428. case CDraw::RECT : this->draw = new CRectangle( this ); break;
  429. case CDraw::CIRCLE : this->draw = new CCircle( this ); break;
  430. case CDraw::ROUNDRECT : this->draw = new CRoundRect( this ); break;
  431. case CDraw::PEN : this->draw = new CWBPen( this , 0 ); break;
  432. case CDraw::PEN1 : this->draw = new CWBPen( this , 1 ); break;
  433. case CDraw::TEXT : this->draw = new CText( this ); break;
  434. case CDraw::WBWND : this->draw = new CWBWnd( this , true ); break;
  435. case CDraw::WBWND1 : this->draw = new CWBWnd( this , false ); break;
  436. }
  437. if( this->draw )
  438. {  
  439. if( this->draw->GetType( ) == CDraw::PEN1 )
  440. {
  441. this->draw->SetColor( RGB( 255 , 255 , 0 ) );
  442. //设定宽度 
  443. this->draw->SetWidth( 2 );
  444. //设定内部空区是否为空  
  445. this->draw->SetEmpty( m_bEmpty );
  446. }
  447. else
  448. { //设定颜色
  449. this->draw->SetColor( color );
  450. //设定宽度 
  451. this->draw->SetWidth( width );
  452. //设定内部空区是否为空  
  453. this->draw->SetEmpty( m_bEmpty );
  454. }
  455. }
  456. }
  457. //鼠标下压
  458. void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) 
  459. {
  460. CScrollView::OnLButtonDown( nFlags, point );
  461. point.Offset( this->GetScrollPosition( ) );
  462. if( this->iterator->LButtonDown( nFlags , point ) )
  463. return;
  464. if( this->draw )
  465. {
  466. if( this->draw->GetType( ) != CDraw::WBWND )
  467. {
  468. CRect rc;
  469. this->GetClientRect( &rc );
  470. this->ClientToScreen( &rc );
  471. ::ClipCursor( &rc );
  472. }
  473. this->draw->LButtonDown( nFlags , point );
  474. }
  475. }
  476. //鼠标弹起
  477. void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) 
  478. {
  479. CScrollView::OnLButtonUp(nFlags, point);
  480. point.Offset( this->GetScrollPosition( ) );
  481. if( this->iterator->LButtonUp( nFlags , point ) )
  482. return;
  483. ::ClipCursor( NULL );
  484. if( this->draw )
  485. {
  486. this->draw->LButtonUp( nFlags , point );
  487. int type = this->draw->GetType( );
  488. if( type != CDraw::SELECT )
  489. {   //保存
  490. this->drawList.push_back( this->draw );
  491. //通知外部程序增加一个图元
  492. this->assembleData( draw , ADD );
  493. //取出颜色  
  494. COLORREF color = this->draw->GetColor( );
  495. //取出宽度
  496. int width = this->draw->GetWidth( );
  497. //取出是否为空
  498. bool empty = this->draw->IsEmpty( );
  499. //再次实例化  
  500. this->draw = NULL;
  501. // this->Reflush( );
  502. if( type == CDraw::WBWND || type == CDraw::WBWND1 )
  503. type = CDraw::SELECT;
  504. this->SelectDraw( type , color , width , empty );
  505. }
  506. }
  507. }
  508. //鼠标移动
  509. void CDrawView::OnMouseMove(UINT nFlags, CPoint point) 
  510. {
  511. CScrollView::OnMouseMove( nFlags, point);
  512. point.Offset( this->GetScrollPosition( ) );
  513. if( this->iterator->MouseMove( nFlags , point ) )
  514. return;
  515. if( this->draw )
  516. this->draw->MouseMove( nFlags , point );
  517. }
  518. void CDrawView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  519. {
  520. CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
  521. this->Invalidate( );
  522. }
  523. void CDrawView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  524. {
  525. CScrollView::OnHScroll(nSBCode, nPos, pScrollBar);
  526. this->Invalidate( );
  527. }
  528. void CDrawView::OnOpen() 
  529. {
  530. CFileDialog dlg( true , "*.wb|*.bmp|" , NULL ,  OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT , "白板文件( *.wb)|*.wb|位图文件( *.bmp )|*.bmp||");
  531. if( dlg.DoModal( ) == IDOK )
  532. {  
  533. CFile file;
  534. if( file.Open( dlg.GetPathName( ) , CFile::modeRead ) )
  535. {
  536. int size = file.GetLength( );
  537. char * buffer = new char[ size ];
  538. file.Read( buffer , size );
  539. file.Close( );
  540. char * now = buffer;
  541. //白板文件
  542. if( ! dlg.GetFileExt( ).CompareNoCase( "wb" ) )
  543. {//图元类型 + 图元区域 + 图元的参数
  544. CDraw * draw = NULL;
  545. int rgnSize = 0;
  546. char * rgnData = NULL;
  547. while( now < buffer + size )
  548. {  
  549. draw = NULL;
  550. //类型
  551. switch( *( int * )now )
  552. {
  553. case CDraw::LINE : draw = new CLine( this ); break;
  554. case CDraw::RECT : draw = new CRectangle( this ); break;
  555. case CDraw::CIRCLE : draw = new CCircle( this ); break;
  556. case CDraw::ROUNDRECT : draw = new CRoundRect( this );break;
  557. case CDraw::PEN : 
  558. case CDraw::PEN1 : draw = new CWBPen( this ); break;
  559. case CDraw::TEXT : draw = new CText( this ); break;
  560. case CDraw::WBWND : 
  561. case CDraw::WBWND1 :
  562. draw = new CWBWnd( this , false , false ); break;
  563. }
  564. now += sizeof( int );
  565.                     //区域
  566. if( draw )
  567. draw->GetRgn( ).CreateFromData( NULL , *( int * )now , ( RGNDATA * )( now + sizeof( int ) ) );
  568. now += sizeof( int ) + *( int * )now;
  569. //颜色
  570. if( draw )
  571.                   
  572. draw->SetColor( *( int * )now );
  573. now += sizeof( int );
  574.                     //如果是文本
  575. if( draw->GetType( ) == CDraw::TEXT ) 
  576. {
  577. ( ( CText * )draw )->SetText( now ); now += strlen( now ) + sizeof( char );
  578. }//如果是位图
  579. if( draw->GetType( ) == CDraw::WBWND || draw->GetType( ) == CDraw::WBWND1 )
  580. {
  581. CBitmap * bmp = ( ( CWBWnd * )draw )->GetBitmap( );
  582. BITMAPINFOHEADER * h = ( BITMAPINFOHEADER * )now; now += sizeof( BITMAPINFOHEADER );
  583. ::SetDIBits( this->memDC.GetSafeHdc( ) , * bmp , 0 , h->biHeight , now , ( BITMAPINFO * )h , DIB_RGB_COLORS );
  584. now += h->biSizeImage;
  585. }
  586. if( draw )
  587. {
  588. draw->Draw( );
  589. this->assembleData( draw , ADD );
  590. this->drawList.push_back( draw );
  591. }
  592. }
  593. this->Invalidate( );
  594. }//位图文件
  595. else if( ! dlg.GetFileExt( ).CompareNoCase( "bmp" ) )
  596. {
  597. CWBWnd * draw = new CWBWnd( this , false , false );
  598. BITMAPINFOHEADER * h = ( BITMAPINFOHEADER * )now; now += sizeof( BITMAPINFOHEADER );
  599. draw->GetRgn( ).CreateRectRgn( 0 , 0 , h->biWidth , h->biHeight );
  600. ::SetDIBits( this->memDC.GetSafeHdc( ) , * draw->GetBitmap( ) , 0 , h->biHeight , now , ( BITMAPINFO * )h , DIB_RGB_COLORS );
  601. now += h->biSizeImage;
  602. draw->Draw( );
  603. this->assembleData( draw , ADD );
  604. this->drawList.push_back( draw );
  605. }
  606. delete []buffer;
  607. }
  608. }
  609. }
  610. void CDrawView::OnSave() 
  611. {
  612. CFileDialog dlg( false , "*.wb|*.bmp|" , NULL ,  OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT , "白板文件( *.wb)|*.wb|位图文件( *.bmp )|*.bmp||");
  613. if( dlg.DoModal( ) == IDOK )
  614. { //白板文件
  615. if( ! dlg.GetFileExt( ).CompareNoCase( "wb" ) )
  616. {// 图元类型 + 图元区域 + 图元的参数
  617. CFile file;
  618. if( file.Open( dlg.GetPathName( ) , CFile::modeCreate | CFile::modeWrite ) )
  619. {
  620. this->LockList( );
  621. CDraw * draw = NULL;
  622. int rgnSize = 0;
  623. char * rgnData = NULL;
  624. for( DRAW_LIST::iterator itr = this->drawList.begin( ); itr != this->drawList.end( ); itr ++ )
  625. {
  626. draw = * itr;
  627.                     //类型 
  628. rgnSize = draw->GetType( );
  629.                          
  630. file.Write( &rgnSize , sizeof( int ) );
  631. //区域大小
  632. rgnSize = draw->GetRgn( ).GetRegionData( NULL , 0 );
  633. file.Write( &rgnSize , sizeof( int ) );
  634. rgnData = new char[ rgnSize ];
  635. //区域
  636. draw->GetRgn( ).GetRegionData( ( RGNDATA * )rgnData , rgnSize );
  637. file.Write( rgnData , rgnSize );
  638. delete []rgnData;
  639. //颜色
  640. rgnSize = draw->GetColor( );
  641. file.Write( &rgnSize , sizeof( int ) );
  642.                     //文本格式 
  643. if( draw->GetType( ) == CDraw::TEXT )
  644. {
  645. CText * text = ( CText * )draw;
  646. file.Write( text->GetText( ) , text->GetText( ).GetLength( ) + sizeof( char ) );
  647. }
  648. if( draw->GetType( ) == CDraw::WBWND || draw->GetType( ) == CDraw::WBWND1 )
  649. {
  650. CBitmap * bmp = ( ( CWBWnd * )draw )->GetBitmap( );
  651. BITMAP bm;
  652. bmp->GetBitmap( &bm );
  653. //设定位图无关信息
  654. BITMAPINFOHEADER h = 
  655. {
  656. sizeof( h ) , bm.bmWidth , bm.bmHeight , 1 , bm.bmBitsPixel * bm.bmPlanes , BI_RGB , ( 31 + h.biWidth * h.biHeight * h.biBitCount ) / 8 , 0 , 0 , 0 , 0 
  657. };
  658. rgnData = new char[ h.biSizeImage * 2 ];
  659. //位图头信息
  660. file.Write( &h , sizeof( h ) );
  661. //取出位图  
  662. ::GetDIBits( this->memDC.GetSafeHdc( ) , * bmp , 0 , bm.bmHeight , rgnData , ( BITMAPINFO * )&h , DIB_RGB_COLORS );
  663. file.Write( rgnData , h.biSizeImage );
  664. delete [ ]rgnData;
  665. }
  666. }
  667. this->UnlockList( );
  668. file.Close( );
  669. }
  670. }//位图文件
  671. else if( ! dlg.GetFileExt( ).CompareNoCase( "bmp" ) )
  672. {
  673. BITMAP bm;
  674. this->memBitmap.GetBitmap( &bm );
  675. BITMAPINFOHEADER h = 
  676. {
  677. sizeof( h ) , bm.bmWidth , bm.bmHeight , 1 , bm.bmBitsPixel * bm.bmPlanes , BI_RGB , ( 31 + h.biWidth * h.biHeight * h.biBitCount ) / 8 , 0 , 0 , 0 , 0 
  678. };
  679. char * buffer = new char[ h.biSizeImage ];
  680. ::GetDIBits( this->memDC.GetSafeHdc( ) , this->memBitmap , 0 , h.biHeight , buffer , ( BITMAPINFO * )&h , DIB_RGB_COLORS );
  681. CFile file;
  682. if( file.Open( dlg.GetPathName( ) , CFile::modeCreate | CFile::modeWrite ) )
  683. {
  684. file.Write( &h , sizeof( h ) );
  685. file.Write( buffer , h.biSizeImage );
  686. file.Close( );
  687. }
  688. delete []buffer;
  689. }
  690. }
  691. }
  692. void CDrawView::OnContextMenu(CWnd* pWnd, CPoint point) 
  693. {
  694. CSelectDraw * sd = ( CSelectDraw * )this->draw;
  695. if( sd->GetType( ) == CDraw::SELECT )
  696. {
  697. CMenu menu , * m ;
  698. menu.LoadMenu( IDR_DRAW_MENU );
  699. m = menu.GetSubMenu( 0 );
  700. if( sd->GetList( )->size( ) == 1 && this->drawList.size( ) > 1 )
  701. {
  702. m->EnableMenuItem( 0 , MF_ENABLED | MF_BYPOSITION );
  703. m->EnableMenuItem( 1 , MF_ENABLED | MF_BYPOSITION );
  704. }
  705. m->TrackPopupMenu( TPM_LEFTALIGN , point.x , point.y , this );
  706. }
  707. }
  708. void CDrawView::OnDrawFirst() 
  709. {
  710. CSelectDraw * sd = ( CSelectDraw * )this->draw;
  711. try
  712. {
  713. CDraw * draw =  * sd->GetList( )->begin( );
  714. this->drawList.remove( draw );
  715. this->drawList.push_back( draw );
  716. this->Reflush( );
  717. this->assembleData( draw , POSITION , 1 );
  718. }
  719. catch( ... )
  720. {
  721. }
  722. }
  723. void CDrawView::OnDrawLast() 
  724. {
  725. CSelectDraw * sd = ( CSelectDraw * )this->draw;
  726. try
  727. {
  728. CDraw * draw =  * sd->GetList( )->begin( );
  729. this->drawList.remove( draw );
  730. this->drawList.push_front( draw );
  731. this->Reflush( );
  732. this->assembleData( draw , POSITION , 2 );
  733. }
  734. catch( ... )
  735. {
  736. }
  737. }