RealPlayXCtl.cpp
上传用户:sy_eblight
上传日期:2020-11-03
资源大小:267k
文件大小:10k
源码类别:

Static控件

开发平台:

Visual C++

  1. // RealPlayXCtl.cpp : Implementation of the CRealPlayXCtrl ActiveX Control class.
  2. #include "stdafx.h"
  3. #include "RealPlayX.h"
  4. #include "RealPlayXCtl.h"
  5. #include "RealPlayXPpg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. IMPLEMENT_DYNCREATE(CRealPlayXCtrl, COleControl)
  12. /////////////////////////////////////////////////////////////////////////////
  13. // Message map
  14. BEGIN_MESSAGE_MAP(CRealPlayXCtrl, COleControl)
  15. //{{AFX_MSG_MAP(CRealPlayXCtrl)
  16. ON_WM_DESTROY()
  17. ON_WM_CREATE()
  18. ON_WM_ERASEBKGND()
  19. //}}AFX_MSG_MAP
  20. ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
  21. END_MESSAGE_MAP()
  22. /////////////////////////////////////////////////////////////////////////////
  23. // Dispatch map
  24. BEGIN_DISPATCH_MAP(CRealPlayXCtrl, COleControl)
  25. //{{AFX_DISPATCH_MAP(CRealPlayXCtrl)
  26. DISP_FUNCTION(CRealPlayXCtrl, "SetDeviceInfo", SetDeviceInfo, VT_BOOL, VTS_BSTR VTS_I4 VTS_I2 VTS_BSTR VTS_BSTR)
  27. DISP_FUNCTION(CRealPlayXCtrl, "StartPlay", StartPlay, VT_BOOL, VTS_NONE)
  28. DISP_FUNCTION(CRealPlayXCtrl, "StopPlay", StopPlay, VT_BOOL, VTS_NONE)
  29. //}}AFX_DISPATCH_MAP
  30. DISP_FUNCTION_ID(CRealPlayXCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
  31. END_DISPATCH_MAP()
  32. /////////////////////////////////////////////////////////////////////////////
  33. // Event map
  34. BEGIN_EVENT_MAP(CRealPlayXCtrl, COleControl)
  35. //{{AFX_EVENT_MAP(CRealPlayXCtrl)
  36. // NOTE - ClassWizard will add and remove event map entries
  37. //    DO NOT EDIT what you see in these blocks of generated code !
  38. //}}AFX_EVENT_MAP
  39. END_EVENT_MAP()
  40. /////////////////////////////////////////////////////////////////////////////
  41. // Property pages
  42. // TODO: Add more property pages as needed.  Remember to increase the count!
  43. BEGIN_PROPPAGEIDS(CRealPlayXCtrl, 1)
  44. PROPPAGEID(CRealPlayXPropPage::guid)
  45. END_PROPPAGEIDS(CRealPlayXCtrl)
  46. /////////////////////////////////////////////////////////////////////////////
  47. // Initialize class factory and guid
  48. IMPLEMENT_OLECREATE_EX(CRealPlayXCtrl, "REALPLAYX.RealPlayXCtrl.1",
  49. 0x30209fbc, 0x57eb, 0x4f87, 0xbf, 0x3e, 0x74, 0xe, 0x3d, 0x80, 0x19, 0xd2)
  50. /////////////////////////////////////////////////////////////////////////////
  51. // Type library ID and version
  52. IMPLEMENT_OLETYPELIB(CRealPlayXCtrl, _tlid, _wVerMajor, _wVerMinor)
  53. /////////////////////////////////////////////////////////////////////////////
  54. // Interface IDs
  55. const IID BASED_CODE IID_DRealPlayX =
  56. { 0x59dce921, 0x4ce3, 0x4791, { 0xb9, 0xe5, 0xde, 0x1c, 0xfc, 0xe8, 0xa7, 0x1c } };
  57. const IID BASED_CODE IID_DRealPlayXEvents =
  58. { 0x97ea9bd2, 0x418f, 0x49a4, { 0x9a, 0xdd, 0x7f, 0xed, 0x27, 0xbf, 0xd0, 0xed } };
  59. /////////////////////////////////////////////////////////////////////////////
  60. // Control type information
  61. static const DWORD BASED_CODE _dwRealPlayXOleMisc =
  62. OLEMISC_ACTIVATEWHENVISIBLE |
  63. OLEMISC_SETCLIENTSITEFIRST |
  64. OLEMISC_INSIDEOUT |
  65. OLEMISC_CANTLINKINSIDE |
  66. OLEMISC_RECOMPOSEONRESIZE;
  67. IMPLEMENT_OLECTLTYPE(CRealPlayXCtrl, IDS_REALPLAYX, _dwRealPlayXOleMisc)
  68. /////////////////////////////////////////////////////////////////////////////
  69. // CRealPlayXCtrl::CRealPlayXCtrlFactory::UpdateRegistry -
  70. // Adds or removes system registry entries for CRealPlayXCtrl
  71. BOOL CRealPlayXCtrl::CRealPlayXCtrlFactory::UpdateRegistry(BOOL bRegister)
  72. {
  73. // TODO: Verify that your control follows apartment-model threading rules.
  74. // Refer to MFC TechNote 64 for more information.
  75. // If your control does not conform to the apartment-model rules, then
  76. // you must modify the code below, changing the 6th parameter from
  77. // afxRegApartmentThreading to 0.
  78. if (bRegister)
  79. return AfxOleRegisterControlClass(
  80. AfxGetInstanceHandle(),
  81. m_clsid,
  82. m_lpszProgID,
  83. IDS_REALPLAYX,
  84. IDB_REALPLAYX,
  85. afxRegApartmentThreading,
  86. _dwRealPlayXOleMisc,
  87. _tlid,
  88. _wVerMajor,
  89. _wVerMinor);
  90. else
  91. return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
  92. }
  93. /////////////////////////////////////////////////////////////////////////////
  94. // CRealPlayXCtrl::CRealPlayXCtrl - Constructor
  95. CRealPlayXCtrl::CRealPlayXCtrl()
  96. {
  97. InitializeIIDs(&IID_DRealPlayX, &IID_DRealPlayXEvents);
  98. // TODO: Initialize your control's instance data here.
  99. m_LoginID = 0;
  100. m_strDvrIP = "";
  101. m_nChannel = -1;
  102. m_hRealPlay = 0;
  103. }
  104. /////////////////////////////////////////////////////////////////////////////
  105. // CRealPlayXCtrl::~CRealPlayXCtrl - Destructor
  106. CRealPlayXCtrl::~CRealPlayXCtrl()
  107. {
  108. // TODO: Cleanup your control's instance data here.
  109. }
  110. /////////////////////////////////////////////////////////////////////////////
  111. // CRealPlayXCtrl::OnDraw - Drawing function
  112. void CRealPlayXCtrl::OnDraw(
  113. CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
  114. {
  115. // TODO: Replace the following code with your own drawing code.
  116. //pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
  117. //pdc->Ellipse(rcBounds);
  118. }
  119. /////////////////////////////////////////////////////////////////////////////
  120. // CRealPlayXCtrl::DoPropExchange - Persistence support
  121. void CRealPlayXCtrl::DoPropExchange(CPropExchange* pPX)
  122. {
  123. ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
  124. COleControl::DoPropExchange(pPX);
  125. // TODO: Call PX_ functions for each persistent custom property.
  126. }
  127. /////////////////////////////////////////////////////////////////////////////
  128. // CRealPlayXCtrl::OnResetState - Reset control to default state
  129. void CRealPlayXCtrl::OnResetState()
  130. {
  131. COleControl::OnResetState();  // Resets defaults found in DoPropExchange
  132. // TODO: Reset any other control state here.
  133. }
  134. /////////////////////////////////////////////////////////////////////////////
  135. // CRealPlayXCtrl::AboutBox - Display an "About" box to the user
  136. void CRealPlayXCtrl::AboutBox()
  137. {
  138. CDialog dlgAbout(IDD_ABOUTBOX_REALPLAYX);
  139. dlgAbout.DoModal();
  140. }
  141. /////////////////////////////////////////////////////////////////////////////
  142. // CRealPlayXCtrl message handlers
  143. // 连接设备
  144. BOOL CRealPlayXCtrl::SetDeviceInfo(LPCTSTR strDvrIP, long nPort, short nChannel, LPCTSTR strUserId, LPCTSTR strUserPwd) 
  145. {
  146. // TODO: Add your dispatch handler code here
  147. BOOL bSuccess = FALSE;
  148. // 不相同设备,重新登入
  149. if(strDvrIP != m_strDvrIP)
  150. {
  151. // 登入之前先注销
  152. if(0 != m_LoginID)
  153. {
  154. CLIENT_Logout(m_LoginID);
  155. m_LoginID = 0;
  156. m_strDvrIP = "";
  157. //刷新页面
  158. Invalidate();
  159. }
  160. int err = 0; //存储可能的错误返回值
  161. NET_DEVICEINFO deviceInfo;
  162. // 调用登入接口
  163. long lRet = CLIENT_Login((LPSTR)strDvrIP,(WORD)nPort,(LPSTR)strUserId,(LPSTR)strUserPwd,&deviceInfo,&err);
  164. if(0 != lRet)
  165. {
  166. m_LoginID = lRet;
  167. m_nChannel = nChannel;
  168. m_strDvrIP = strDvrIP;
  169. bSuccess = TRUE;
  170. }
  171. else
  172. {
  173. m_LoginID = 0;
  174. m_nChannel = -1;
  175. bSuccess = FALSE;
  176. ShowLoginErrorReason(err);
  177. }
  178. }
  179. else
  180. {
  181. // 相同设备,没有登入的话再登入
  182. if(0 == m_LoginID)
  183. {
  184. int err = 0; //存储可能的错误返回值
  185. NET_DEVICEINFO deviceInfo;
  186. // 调用登入接口
  187. long lRet = CLIENT_Login((LPSTR)strDvrIP,(WORD)nPort,(LPSTR)strUserId,(LPSTR)strUserPwd,&deviceInfo,&err);
  188. if(0 != lRet)
  189. {
  190. m_LoginID = lRet;
  191. m_nChannel = nChannel;
  192. bSuccess = TRUE;
  193. }
  194. else
  195. {
  196. m_LoginID = 0;
  197. m_nChannel = -1;
  198. bSuccess = FALSE;
  199. ShowLoginErrorReason(err);
  200. }
  201. }
  202. else
  203. {
  204. m_nChannel = nChannel;
  205. bSuccess = TRUE;
  206. }
  207. }
  208. return bSuccess;
  209. }
  210. // 开始播放
  211. BOOL CRealPlayXCtrl::StartPlay() 
  212. {
  213. // TODO: Add your dispatch handler code here
  214. BOOL bSuccess = FALSE;
  215. if(0 != m_LoginID)
  216. {
  217. // 关闭当前画面视频
  218. if(0 != m_hRealPlay)
  219. {
  220. BOOL bRet = CLIENT_StopRealPlay(m_hRealPlay);
  221. //刷新页面
  222. Invalidate();
  223. }
  224. // 开始播放
  225. long lRet = CLIENT_RealPlay(m_LoginID,m_nChannel,m_hWnd);
  226. if(0 != lRet)
  227. {
  228. m_hRealPlay = lRet;
  229. bSuccess = TRUE;
  230. }
  231. else
  232. {
  233. m_hRealPlay = 0;
  234. bSuccess = FALSE;
  235. }
  236. }
  237. return bSuccess;
  238. }
  239. // 停止播放
  240. BOOL CRealPlayXCtrl::StopPlay() 
  241. {
  242. // TODO: Add your dispatch handler code here
  243. BOOL bSuccess = TRUE;
  244. // 关闭视频
  245. if(0 != m_hRealPlay)
  246. {
  247. BOOL bRet = CLIENT_StopRealPlay(m_hRealPlay);
  248. m_hRealPlay = 0;
  249. //刷新页面
  250. Invalidate();
  251. }
  252. return bSuccess;
  253. }
  254. void CRealPlayXCtrl::OnDestroy() 
  255. {
  256. COleControl::OnDestroy();
  257. // TODO: Add your message handler code here
  258. if(0 != m_LoginID)
  259. {
  260. CLIENT_Logout(m_LoginID);
  261. }
  262. //清空SDK, 释放占用的资源
  263. CLIENT_Cleanup();
  264. }
  265. int CRealPlayXCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  266. {
  267. if (COleControl::OnCreate(lpCreateStruct) == -1)
  268. return -1;
  269. // TODO: Add your specialized creation code here
  270. //初始化网络SDK
  271. BOOL ret = CLIENT_Init(DisConnectFunc, (DWORD)this);
  272. if (!ret)
  273. {
  274. //初始化失败
  275. }
  276. return 0;
  277. }
  278. //设备断开时回调函数
  279. void CALLBACK DisConnectFunc(LONG lLoginID, char *pchDVRIP, LONG nDVRPort, DWORD dwUser)
  280. {
  281. if(dwUser == 0)
  282. {
  283. return;
  284. }
  285. CRealPlayXCtrl *pCtl = (CRealPlayXCtrl *)dwUser;
  286. pCtl->DeviceDisConnect(lLoginID, pchDVRIP,nDVRPort);
  287. }
  288. //设备断开处理
  289. void CRealPlayXCtrl::DeviceDisConnect(LONG lLoginID, char *sDVRIP, LONG nDVRPort)
  290. {
  291. //连接中断
  292. }
  293. //显示登入失败原因
  294. void CRealPlayXCtrl::ShowLoginErrorReason(int nError)
  295. {
  296. if(1 == nError) MessageBox("密码不正确!","提示");
  297. else if(2 == nError) MessageBox("帐号不存在!","提示");
  298. else if(3 == nError) MessageBox("等待登录返回超时!","提示");
  299. else if(4 == nError) MessageBox("帐号已登录!","提示");
  300. else if(5 == nError) MessageBox("帐号已被锁定!","提示");
  301. else if(6 == nError) MessageBox("帐号又被列为黑名单!","提示");
  302. else if(7 == nError) MessageBox("资源不足,系统忙!","提示");
  303. else if(9 == nError) MessageBox("找不到网络主机!","提示");
  304. else MessageBox("登入失败!","提示");
  305. }
  306. BOOL CRealPlayXCtrl::OnEraseBkgnd(CDC* pDC) 
  307. {
  308. // TODO: Add your message handler code here and/or call default
  309. CBitmap bitmap;
  310. bitmap.LoadBitmap(IDB_BACKGROUND);
  311. BITMAP bmp;
  312. bitmap.GetBitmap(&bmp);
  313. CDC dcCompatible;
  314. dcCompatible.CreateCompatibleDC(pDC);
  315. dcCompatible.SelectObject(&bitmap);
  316. CRect rect;
  317. GetClientRect(&rect);
  318. pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,
  319. bmp.bmWidth,bmp.bmHeight,SRCCOPY);
  320. return TRUE;
  321. }