MainFrm.cpp
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:9k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. // MainFrm.cpp : implementation of the CMainFrame class
  2. //
  3. #include "stdafx.h"
  4. #include "play.h"
  5. #include "MainFrm.h"
  6. #include "playView.h"
  7. #include <afxmt.h>
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. #define strDESTPORT " 201"
  14. CMenu PopMenu;
  15. extern CEvent g_eventClearup;   
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CMainFrame
  18. IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
  19. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
  20. //{{AFX_MSG_MAP(CMainFrame)
  21. ON_WM_CREATE()
  22. ON_COMMAND(ID_VIEW_STATUS_BAR, OnViewStatusBar)
  23. ON_UPDATE_COMMAND_UI(ID_VIEW_STATUS_BAR, OnUpdateViewStatusBar)
  24. ON_WM_CLOSE()
  25. //}}AFX_MSG_MAP
  26.     ON_MESSAGE(WSA_READ,OnRead)
  27.     ON_MESSAGE(WSA_ACCEPT,OnAccept)
  28.     ON_MESSAGE(WM_OUTBAR_NOTIFY, OnOutbarNotify)
  29. END_MESSAGE_MAP()
  30. static UINT indicators[] =
  31. {
  32. ID_SEPARATOR,           // status line indicator
  33. ID_SEPARATOR,
  34. ID_SEPARATOR,
  35. ID_SEPARATOR,
  36. };
  37. IMPLEMENT_DYNAMIC(COutlookBar,CGfxOutBarCtrl)
  38. BEGIN_MESSAGE_MAP(COutlookBar,CGfxOutBarCtrl)
  39. //{{AFX_MSG_MAP(COutlookBar)
  40. ON_WM_ERASEBKGND()
  41. //}}AFX_MSG_MAP
  42. END_MESSAGE_MAP()
  43. BOOL COutlookBar::OnEraseBkgnd(CDC* pDC) 
  44. {
  45. crBackGroundColor = RGB(0,168,150);
  46. return true;
  47. }
  48. /////////////////////////////////////////////////////////////////////////////
  49. // CMainFrame construction/destruction
  50. LRESULT CMainFrame::OnOutbarNotify(WPARAM wParam, LPARAM lParam)
  51. {
  52. if((wParam)==NM_OB_ITEMCLICK)
  53. {
  54.      CPlayView* pView=(CPlayView*)m_wndSplitter.GetPane(0,1);
  55.  ::SendMessage(pView->m_hWnd,WM_VIEW_OUTBAR_NOTIFY,wParam,lParam);
  56. }
  57.     return 0;
  58. }
  59. //响应消息WSA_ACCEPT
  60. LRESULT CMainFrame::OnAccept(WPARAM wParam,LPARAM lParam)
  61. {
  62. int acsock;
  63. int status;
  64. if (WSAGETSELECTERROR( lParam ))
  65. return -1;
  66. if (WSAGETSELECTERROR( lParam ) == 0) 
  67. {   /* Success */
  68. int req_sin_len = sizeof(req_sin );
  69. //接受客户的连接请求
  70. acsock = accept(Lsock,(struct sockaddr FAR *) &req_sin,(int FAR *)&req_sin_len);
  71. if (acsock < 0) 
  72. {
  73. MessageBox("Cant Accepted a connection!");
  74. return -1;
  75. }
  76. //设定服务器响应的网络事件为FD_READ或FD_CLOSE,即读取数据或关闭socket 
  77. //产生相应传递给窗口的消息为WSA_READ
  78. if ((status = WSAAsyncSelect(acsock, m_hWnd,WSA_READ,FD_READ|FD_CLOSE))<0) 
  79. {
  80.             MessageBox("Error on WSAAsyncSelect()");
  81.             closesocket(acsock );
  82. return -1;
  83. }
  84. }
  85. return 0;
  86. }
  87. //响应消息WSA_READ
  88. LRESULT CMainFrame::OnRead(WPARAM wParam,LPARAM lParam) 
  89. {
  90. int status;
  91. char szRev[80];
  92. char szBuff[80];
  93. char szSend[80];
  94. strcpy(szSend,MULTIDESTADDR);
  95. strcat(szSend, strDESTPORT);
  96. if (WSAGETSELECTERROR( lParam ))
  97.   return -1;
  98. if (WSAGETSELECTEVENT(lParam) == FD_READ)
  99. {//网络事件为FD_READ
  100. //接收数据
  101. status =recv(wParam, szRev, 80,0);
  102. if (status) 
  103. {
  104. //如果客户端请求发送数据,将组播地址和端口发送给客户端
  105. if (strcmp(szRev,"请发送数据")==0)
  106. {
  107.   sprintf(szBuff,"来自%s请求数据",inet_ntoa(req_sin.sin_addr));     
  108.   MessageBox(szBuff, "Client Request Data", MB_OK);
  109. //发送组播地址和端口给客户端
  110. send(wParam, szSend, sizeof(szSend),0);          
  111. }
  112.              
  113. }
  114. else 
  115. if(status==0)
  116. MessageBox("Connection was closed by client", "Server", MB_OK);
  117. }
  118. else 
  119. { //网络事件为FD_CLOSE
  120. //表示对方已接收到地址信息
  121.     MessageBox("可以发送数据", "success", MB_OK); 
  122. //关闭socket
  123. closesocket((SOCKET)wParam);            
  124. return 0;
  125. }
  126. CMainFrame::CMainFrame()
  127. {
  128.   
  129.    
  130. }
  131. CMainFrame::~CMainFrame()
  132. {
  133.   
  134. }
  135. BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
  136. {
  137. // Create the splitter window with two columns
  138. if (!m_wndSplitter.CreateStatic(this, 1, 2))
  139. {
  140. TRACE0("Failed to create splitter windown");
  141. return FALSE;
  142. }
  143. if (!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CPlayView),
  144. CSize(0, 0), pContext))
  145. {
  146. TRACE0("Failed to create CTestViewn"); 
  147. return FALSE;
  148. }
  149. DWORD dwStyle = 
  150. CGfxOutBarCtrl::fDragItems    |
  151. CGfxOutBarCtrl::fEditGroups   |
  152. CGfxOutBarCtrl::fEditItems    |
  153. CGfxOutBarCtrl::fRemoveGroups |
  154. CGfxOutBarCtrl::fRemoveItems  |
  155. CGfxOutBarCtrl::fAddGroups    |
  156. CGfxOutBarCtrl::fAnimation;
  157. // Here we create the outbar control; we give as id the parent splitter pane id here
  158. if (!m_wndOutlookBar.Create(WS_CHILD|WS_VISIBLE, CRect(0,0,0,0),
  159. &m_wndSplitter, m_wndSplitter.IdFromRowCol(0, 0), dwStyle))
  160. {
  161. TRACE0("Failed to create outlook bar.");
  162. return FALSE;
  163. }
  164.   //  UINT  nid=m_wndSplitter.IdFromRowCol(0, 0);
  165. // Tell the control to send message to this window (the mainframe) 
  166. // and not to its real parent (the splitter)
  167. m_wndOutlookBar.SetOwner(this);
  168. // Here we create the imagelists for the control
  169. m_ImageLarge.Create (32, 32, TRUE, 2, 1);
  170. for( int nIcon = 0; nIcon <12; ++nIcon ) 
  171. {
  172. HICON hIcon = AfxGetApp()->LoadIcon(CPlayApp::m_nImages[nIcon]);
  173. ASSERT(hIcon);
  174. m_ImageLarge.Add(hIcon);
  175. }
  176. // and we link them to the control
  177. m_wndOutlookBar.SetImageList(&m_ImageLarge, CGfxOutBarCtrl::fLargeIcon);
  178. m_wndOutlookBar.SetAnimationTickCount(20);
  179. m_wndOutlookBar.SetAnimSelHighlight(200);
  180. // Look at function reference for information about linking image list
  181. // Here we can add the folders to the control; we need at least one folder.
  182. // The numbers aside the text are an "lParam" value we can assign to each folder
  183. m_wndOutlookBar.AddFolder(_T("播放视频文件"),PLAY);
  184. m_wndOutlookBar.AddFolder(_T("采集视频文件"),CAPTURE);
  185.  //   m_wndOutlookBar.AddFolder(_T("发送数据"),SEND);
  186. // Here we insert the items; syntax is folder, index, text, image, lParam value for item
  187. m_wndOutlookBar.InsertItem(PLAY, Play_Set, _T("播放设置"),  0, 0);
  188. m_wndOutlookBar.InsertItem(PLAY, Play_Open, _T("打开视频文件"),1,0);
  189. m_wndOutlookBar.InsertItem(PLAY, Play_Begin, _T("开始播放"),2,0);
  190. m_wndOutlookBar.InsertItem(PLAY, Play_Pause, _T("暂停播放"),3,0);
  191. m_wndOutlookBar.InsertItem(PLAY, Play_Resume, _T("继续播放"),4, 0);
  192. m_wndOutlookBar.InsertItem(PLAY, Play_Stop, _T("停止"),5, 0);
  193. m_wndOutlookBar.InsertItem(CAPTURE, Cap_Preview, _T("实时播放"),6,0);
  194. m_wndOutlookBar.InsertItem(CAPTURE, Cap_Set, _T("采集文件设置"),7,0);
  195. m_wndOutlookBar.InsertItem(CAPTURE, Cap_Begin, _T("开始采集"),8,0);
  196. m_wndOutlookBar.InsertItem(CAPTURE, Cap_Pause, _T("暂停采集"),9,0);
  197. m_wndOutlookBar.InsertItem(CAPTURE, Cap_Resume, _T("继续采集"),10,0);
  198. m_wndOutlookBar.InsertItem(CAPTURE, Cap_Stop, _T("停止采集"),11,0);
  199. /* m_wndOutlookBar.InsertItem(SEND, Real_Set, _T("实时发送"), 12, 0);
  200. m_wndOutlookBar.InsertItem(SEND, Play_Open, _T("发送文件"),13,0);
  201. m_wndOutlookBar.InsertItem(SEND, Play_Begin, _T("开始发送"),14,0);
  202. m_wndOutlookBar.InsertItem(SEND, Play_Pause, _T("停止发送"),15,0);*/
  203. m_wndOutlookBar.SetSelFolder(1);
  204.  
  205. // Standard sizing for splitter
  206. CRect r;
  207. GetClientRect(&r);
  208. int w1 = r.Width()/7;
  209. int w2 = r.Width()/5;
  210. m_wndSplitter.SetColumnInfo( 0, w1, 0 );
  211. m_wndSplitter.SetColumnInfo( 1, w2, 0 );
  212. m_wndSplitter.RecalcLayout();
  213.     return TRUE;
  214. }
  215. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  216. {
  217. if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  218. return -1;
  219. if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
  220. | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  221. !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
  222. {
  223. TRACE0("Failed to create toolbarn");
  224. return -1;      // fail to create
  225. }
  226. if (!m_wndStatusBar.Create(this,WS_CHILD|WS_VISIBLE|CBRS_BOTTOM,ID_MY_STATUSBAR) ||
  227. !m_wndStatusBar.SetIndicators(indicators,
  228.   sizeof(indicators)/sizeof(UINT)))
  229. {
  230. TRACE0("Failed to create status barn");
  231. return -1;      // fail to create
  232. }
  233. m_wndStatusBar.SetPaneInfo(0,0,0,270);
  234. // TODO: Delete these three lines if you don't want the toolbar to
  235. //  be dockable
  236. m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  237. EnableDocking(CBRS_ALIGN_ANY);
  238. DockControlBar(&m_wndToolBar);
  239.     PopMenu.LoadMenu(IDR_POPUP);
  240. return 0;
  241. }
  242. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
  243. {
  244. if( !CFrameWnd::PreCreateWindow(cs) )
  245. return FALSE;
  246. // TODO: Modify the Window class or styles here by modifying
  247. //  the CREATESTRUCT cs
  248. return TRUE;
  249. }
  250. /////////////////////////////////////////////////////////////////////////////
  251. // CMainFrame diagnostics
  252. #ifdef _DEBUG
  253. void CMainFrame::AssertValid() const
  254. {
  255. CFrameWnd::AssertValid();
  256. }
  257. void CMainFrame::Dump(CDumpContext& dc) const
  258. {
  259. CFrameWnd::Dump(dc);
  260. }
  261. #endif //_DEBUG
  262. /////////////////////////////////////////////////////////////////////////////
  263. // CMainFrame message handlers
  264. void CMainFrame::OnViewStatusBar() 
  265. {
  266. // TODO: Add your command handler code here
  267. m_wndStatusBar.ShowWindow((m_wndStatusBar.GetStyle()&WS_VISIBLE)==0);
  268.     RecalcLayout();
  269. }
  270. void CMainFrame::OnUpdateViewStatusBar(CCmdUI* pCmdUI) 
  271. {
  272. // TODO: Add your command update UI handler code here
  273. pCmdUI->SetCheck((m_wndStatusBar.GetStyle()&WS_VISIBLE)!=0);
  274.     pCmdUI->SetCheck(m_wndStatusBar.ShowWindow(m_wndStatusBar.GetStyle()));
  275. }
  276. void CMainFrame::ActivateFrame(int nCmdShow) 
  277. {
  278. // TODO: Add your specialized code here and/or call the base class
  279. m_wndSplitter.SetActivePane(0,1,NULL);
  280. nCmdShow=SW_MAXIMIZE;
  281. CFrameWnd::ActivateFrame(nCmdShow);
  282. }
  283. void CMainFrame::OnClose() 
  284. {
  285. // TODO: Add your message handler code here and/or call default
  286. CPlayView* pView=(CPlayView*)GetActiveView();
  287. pView->SendMessage(WM_PREPARE_CLOSE);
  288.     ::WaitForSingleObject(g_eventClearup,0);
  289. CFrameWnd::OnClose();
  290. }