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

IP电话/视频会议

开发平台:

Visual C++

  1. // ControlDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "Control.h"
  5. #include "ControlDlg.h"
  6. #include "VideoDlg.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. extern CControlApp theApp;
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CControlDlg dialog
  15. CControlDlg::CControlDlg(CWnd* pParent /*=NULL*/)
  16. : CDialog(CControlDlg::IDD, pParent)
  17. {
  18. //{{AFX_DATA_INIT(CControlDlg)
  19. //}}AFX_DATA_INIT
  20. }
  21. void CControlDlg::DoDataExchange(CDataExchange* pDX)
  22. {
  23. CDialog::DoDataExchange(pDX);
  24. //{{AFX_DATA_MAP(CControlDlg)
  25. DDX_Control(pDX, IDC_AUTO_STATIC, m_astatic);
  26. DDX_Control(pDX, IDC_ONLINE_STATIC, m_ostatic);
  27. DDX_Control(pDX, IDC_LIST, m_olist);
  28. DDX_Control(pDX, IDC_VIEW_BUTTON, m_viewbtn);
  29. //}}AFX_DATA_MAP
  30. }
  31. BEGIN_MESSAGE_MAP(CControlDlg, CDialog)
  32. //{{AFX_MSG_MAP(CControlDlg)
  33. ON_BN_CLICKED(IDC_VIEW_BUTTON, OnViewButton)
  34. ON_WM_SIZE()
  35. ON_WM_CLOSE()
  36. ON_WM_CTLCOLOR()
  37. ON_NOTIFY(NM_DBLCLK, IDC_LIST, OnDblclkList)
  38. ON_WM_TIMER()
  39. ON_WM_NCHITTEST()
  40. //}}AFX_MSG_MAP
  41. ON_MESSAGE( WM_PACKAGE , OnPackage )
  42. END_MESSAGE_MAP()
  43. /////////////////////////////////////////////////////////////////////////////
  44. // CControlDlg message handlers
  45. BOOL CControlDlg::OnInitDialog( )
  46. {
  47. CDialog::OnInitDialog( );
  48. this->m_olist.SetExtendedStyle( LVS_EX_FULLROWSELECT );
  49. CRect rc;
  50. this->m_olist.GetClientRect( &rc );
  51. this->m_olist.InsertColumn( 0 , "用户名" , LVCFMT_LEFT , rc.Width( ) );
  52. CThread::Run( CControlApp::OnConnect , this );
  53. //启动定时器为2分钟
  54. // this->SetTimer( 1 , 120000 , NULL );
  55. return TRUE;
  56. }
  57. UINT CControlDlg::OnNcHitTest(CPoint point) 
  58. {
  59. UINT hitTest = CDialog::OnNcHitTest(point);
  60. return hitTest == HTCLIENT ? HTCAPTION : hitTest;
  61. }
  62. void CControlDlg::OnTimer(UINT nIDEvent) 
  63. {
  64. CDialog::OnTimer( nIDEvent );
  65. /*
  66. if( nIDEvent == 1 && theApp.GetTCP( false ).IsConnected( ) )
  67. {
  68. PConnectTest test;
  69. test.assembleData( 0 );
  70. theApp.GetTCP( ).Send( test.buffer );
  71. }
  72. */
  73. }
  74. HBRUSH CControlDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
  75. {
  76. static HBRUSH b = ::CreateSolidBrush( RGB( 214 , 239 , 255 ) );
  77. pDC->SetBkMode( TRANSPARENT );
  78. return b;
  79. }
  80. void CControlDlg::OnSize(UINT nType, int cx, int cy) 
  81. {
  82. CDialog::OnSize( nType , cx , cy );
  83. if( this->m_astatic )
  84. this->m_astatic.MoveWindow( 0 , 0 , cx , cy );
  85. if( this->m_ostatic )
  86. this->m_ostatic.MoveWindow( 0 , 0 , cx , cy - 40 );
  87. if( this->m_olist )
  88. this->m_olist.MoveWindow( 0 , 20 , cx , cy - 60 );
  89. if( this->m_viewbtn )
  90. this->m_viewbtn.MoveWindow( cx / 2 - 50 , cy - 30 , 100 , 25 );
  91. }
  92. void CControlDlg::OnDblclkList(NMHDR* pNMHDR, LRESULT* pResult) 
  93. {
  94. this->OnViewButton( );
  95. *pResult = 0;
  96. }
  97. void CControlDlg::OnViewButton() 
  98. {
  99. POSITION pos = this->m_olist.GetFirstSelectedItemPosition( );
  100. if( ! pos )
  101. {
  102. MessageBox( "请从列表中选择一个查看点" , "云台镜头控制" , MB_ICONSTOP | MB_OK );
  103. return;
  104. }
  105. int index = this->m_olist.GetNextSelectedItem( pos );
  106. //取出用户id
  107. int user_id = this->m_olist.GetItemData( index );
  108. CVideoDlg * dlg = NULL;
  109. INT_PTR_MAP::iterator itr = theApp.GetMap( )->find( user_id );
  110. if( itr != theApp.GetMap( )->end( ) )
  111. {
  112. dlg = ( CVideoDlg * )itr->second;
  113. dlg->ShowWindow( SW_RESTORE );
  114. dlg->SetForegroundWindow( );
  115. return;
  116. }
  117.  dlg = new CVideoDlg( CWnd::GetDesktopWindow( ) );
  118. dlg->Create( CVideoDlg::IDD , CWnd::GetDesktopWindow( ) );
  119. dlg->user_id = user_id;
  120. //窗口标题
  121. dlg->SetWindowText( this->m_olist.GetItemText( index , 0 ) );
  122.     //保存在列表中
  123. ( * theApp.GetMap( ) )[ dlg->user_id ] = dlg;
  124. //发送视频请求
  125. PRecvVideoREQ req;
  126. req.assembleData( user_id );
  127. theApp.GetTCP( ).Send( req.buffer );
  128. }
  129. void CControlDlg::OnClose() 
  130. {
  131. if( this->m_astatic.IsWindowVisible( ) )
  132. {
  133. if( MessageBox( "正在连接服务器,要退出云台镜头控制客户端吗?" , "云台镜头控制" , MB_ICONQUESTION | MB_YESNO ) == IDNO )
  134. return;
  135. }
  136. else
  137. {
  138. if( MessageBox( "确定要退出云台镜头控制客户端吗?" , "云台镜头控制" , MB_ICONQUESTION | MB_YESNO ) == IDNO )
  139. return;
  140. }
  141. CDialog::OnCancel( );
  142. }
  143. void CControlDlg::OnPackage( WPARAM wParam , LPARAM lParam )
  144. {
  145. CDataPackage * dp = ( CDataPackage * )wParam;
  146. if( ! dp )
  147. {   //遍历所有视频窗口列表
  148. for( INT_PTR_MAP::iterator itr = theApp.GetMap( )->begin( ); itr != theApp.GetMap( )->end( ); itr ++ )
  149. ( ( CVideoDlg * )itr->second )->DestroyWindow( );
  150. theApp.GetMap( )->clear( );
  151. this->m_astatic.ShowWindow( SW_SHOW );
  152. this->m_olist.DeleteAllItems( );
  153. this->m_olist.ShowWindow( SW_HIDE );
  154. this->m_viewbtn.ShowWindow( SW_HIDE );
  155. CThread::Run( CControlApp::OnConnect , this );
  156. return;
  157. }
  158. switch( dp->Tag )
  159. {
  160. case POnlineUserRESTAG :
  161. {
  162. POnlineUserRES * res = ( POnlineUserRES * )dp;
  163. LVFINDINFO info;
  164. info.psz = res->user_name.c_str( );
  165. info.lParam = res->user_id;
  166. info.flags = res->user_name.empty( ) ? LVFI_PARAM : LVFI_STRING;
  167.             //查找 
  168. int index = this->m_olist.FindItem( &info );
  169.             //增加 
  170. if( index < 0 && ! res->user_name.empty( ) )
  171. {
  172. index = this->m_olist.InsertItem( this->m_olist.GetItemCount( ) , res->user_name.c_str( ) );
  173. this->m_olist.SetItemData( index , res->user_id );
  174. }//退出
  175. if( index >= 0 && res->user_name.empty( ) )
  176. {   //从用户列表中删除
  177. this->m_olist.DeleteItem( index );
  178. INT_PTR_MAP * m_map = theApp.GetMap( );
  179. INT_PTR_MAP::iterator itr = m_map->find( res->user_id ); 
  180.                 //从视频列表中删除
  181. if( itr != m_map->end( ) )
  182. {
  183. CVideoDlg * dlg = ( CVideoDlg * )itr->second;
  184. dlg->DestroyWindow( );
  185. ::Sleep( 100 );
  186. if( ( itr = m_map->find( res->user_id ) ) != m_map->end( ) )
  187. m_map->erase( itr );
  188. }
  189. }
  190. }break;
  191. }
  192. }