MAV8Dlg.cpp
上传用户:hxb_1234
上传日期:2010-03-30
资源大小:8328k
文件大小:15k
源码类别:

VC书籍

开发平台:

Visual C++

  1. // MAV8Dlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "MAV8.h"
  5. #include <windows.h>
  6. #include <mmsystem.h>
  7. #include ".av8incav8api.h"
  8. #include ".av8incdefine.h"
  9. #include "Overlay.h"
  10. #include "PlayWnd.h"
  11. #include "MAV8Dlg.h"
  12. #include "PlayWnd.h"
  13. #ifdef _DEBUG
  14. #define new DEBUG_NEW
  15. #undef THIS_FILE
  16. static char THIS_FILE[] = __FILE__;
  17. #endif
  18. #define WM_DATABLOCK_UPDATE WM_USER+20
  19. static char caFileName[STRSIZE];// = "catest1.mpg";
  20. typedef WORD (CALLBACK *USER_CALLBACK) (HDRVR hdrvr, UINT msg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2);
  21. WORD CALLBACK _loadds MyCallBack(HDRVR hdrvr, UINT msg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2);
  22. static HMMIO hmmioInput;
  23. static HMMIO hmmioOutput;
  24. HDRVR hVFDrv;
  25. BYTE bStream;
  26. HWND hWnd;
  27. BOOL Ready = false;
  28. extern PBYTE  pbMem[];
  29. extern BOOL Rendered;
  30. PBYTE RWPtr;
  31. PBYTE tmpMem;
  32. DWORD m_ReceivedBytes = 0; // maximize = 0x8000
  33. DWORD m_RemainBytes = 0; // maximize = 0x8000
  34. int rwIndex = 0;
  35. PBYTE Ptr[100];
  36. BOOL CaptureToFile;
  37. extern BOOL PeekAndPump();
  38. void Setdata (LPSTR lpBuffer, LONG dwBufferWrite)
  39. {
  40. DWORD Bytes = (DWORD)(dwBufferWrite);
  41. if ((m_ReceivedBytes + Bytes )> 0x8000) {
  42. CopyMemory((PVOID)(Ptr[rwIndex]+(LONGLONG)m_ReceivedBytes), 
  43. (PVOID)(lpBuffer),
  44. (DWORD)(Bytes = 0x8000 - m_ReceivedBytes));
  45. m_RemainBytes = dwBufferWrite - Bytes;
  46. RWPtr = Ptr[rwIndex];
  47. rwIndex = (rwIndex + 1)%100;
  48. Ready = true;
  49. tmpMem = new BYTE[m_RemainBytes];
  50. CopyMemory((PVOID)(tmpMem), 
  51. (PVOID)(lpBuffer + Bytes),
  52. (DWORD)(m_RemainBytes));
  53. m_ReceivedBytes = 0;
  54. TRACE2 ("A Block Ready = %lX, %lXn",(DWORD)(lpBuffer), Bytes);
  55. } else {
  56. if (m_RemainBytes != 0) {
  57. CopyMemory((PVOID)(Ptr[rwIndex]+(LONGLONG)m_ReceivedBytes), 
  58. (PVOID)(tmpMem),
  59. (DWORD)(m_RemainBytes));
  60. m_ReceivedBytes += m_RemainBytes;
  61. delete tmpMem;
  62. m_RemainBytes = 0;
  63. }
  64. CopyMemory((PVOID)(Ptr[rwIndex]+(LONGLONG)m_ReceivedBytes), 
  65. (PVOID)(lpBuffer),
  66. Bytes);
  67. m_ReceivedBytes += Bytes;
  68. }
  69. }
  70. WORD CALLBACK _loadds MyCallBack(HDRVR hdrvr, UINT msg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2)
  71. {
  72. DWORD dwFlags = 0;
  73. // TRACE0("MyCallBack ");
  74. switch (msg)
  75. {
  76. case VF_MSGUSER_BUF_WRITE:
  77.     {
  78.         LONG lRet;
  79.         LPVF_BUFWRITE_STRUCT lpBufWrite = (LPVF_BUFWRITE_STRUCT)dwParam1;
  80. Setdata ((LPSTR)lpBufWrite->lpBuffer, (LONG)lpBufWrite->dwBufferWrite);
  81. TRACE0 ("Sentn");
  82. if (CaptureToFile) {
  83. lRet = mmioWrite(hmmioOutput, (LPSTR)lpBufWrite->lpBuffer, (LONG)lpBufWrite->dwBufferWrite);         
  84. if (lRet == -1L)
  85. {
  86.     return (FALSE);
  87. }
  88. }
  89.         break;
  90.     }
  91. case VF_MSGUSER_BUF_CREATE:
  92.     {
  93.         LPVF_CALLBACK_STRUCT lpCallback = (LPVF_CALLBACK_STRUCT)dwParam1;
  94. if (CaptureToFile) {
  95.         if (lpCallback->wSubMsg == VF_SUBMSG_OUTPUT)
  96.     {
  97.                 dwFlags = MMIO_CREATE | MMIO_WRITE;
  98.                 hmmioOutput = mmioOpen((LPTSTR)caFileName, (LPMMIOINFO)NULL, dwFlags);
  99.     }
  100.         else
  101.             {
  102.                 dwFlags = MMIO_READ | MMIO_DENYWRITE;
  103.                 hmmioInput = mmioOpen((LPTSTR)caFileName, (LPMMIOINFO)NULL, dwFlags);
  104.             }
  105. }
  106. TRACE0 ("Createn");
  107.         break;
  108.     }
  109. case VF_MSGUSER_BUF_CLOSE:
  110.     {
  111.         LPVF_CALLBACK_STRUCT lpCallback = (LPVF_CALLBACK_STRUCT)dwParam1;
  112. if (CaptureToFile) {
  113.         if (lpCallback->wSubMsg == VF_SUBMSG_OUTPUT)
  114.     {
  115.         if (hmmioOutput)
  116.     {
  117.         mmioClose(hmmioOutput, NULL);
  118.         hmmioOutput = NULL;
  119.     }
  120.     }
  121.         else
  122.     {
  123.         if (hmmioInput)
  124.         {
  125.             mmioClose(hmmioInput, NULL);
  126.             hmmioInput = NULL;
  127.         }
  128.     }
  129. }
  130. TRACE0 ("Closedn");
  131.         break;
  132.     }
  133.     } // switch
  134. return 1;
  135. }
  136. /////////////////////////////////////////////////////////////////////////////
  137. // CAboutDlg dialog used for App About
  138. class CAboutDlg : public CDialog
  139. {
  140. public:
  141. CAboutDlg();
  142. // Dialog Data
  143. //{{AFX_DATA(CAboutDlg)
  144. enum { IDD = IDD_ABOUTBOX };
  145. //}}AFX_DATA
  146. // ClassWizard generated virtual function overrides
  147. //{{AFX_VIRTUAL(CAboutDlg)
  148. protected:
  149. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  150. //}}AFX_VIRTUAL
  151. // Implementation
  152. protected:
  153. //{{AFX_MSG(CAboutDlg)
  154. //}}AFX_MSG
  155. DECLARE_MESSAGE_MAP()
  156. };
  157. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  158. {
  159. //{{AFX_DATA_INIT(CAboutDlg)
  160. //}}AFX_DATA_INIT
  161. }
  162. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  163. {
  164. CDialog::DoDataExchange(pDX);
  165. //{{AFX_DATA_MAP(CAboutDlg)
  166. //}}AFX_DATA_MAP
  167. }
  168. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  169. //{{AFX_MSG_MAP(CAboutDlg)
  170. // No message handlers
  171. //}}AFX_MSG_MAP
  172. END_MESSAGE_MAP()
  173. void CMAV8Dlg::CountDevice ()
  174. {
  175. CString Msg;
  176. hVFDrv = OpenDriver (L"AV8api.dll", NULL, NULL);
  177. if (hVFDrv) {
  178. if (HVFAssign (hVFDrv, 0)) {
  179. if (HVFLock (hVFDrv, VF_CAP_ALL)) {
  180. pbDeviceLocked = TRUE;
  181. }
  182. else {
  183. pbDeviceLocked= FALSE;
  184. }
  185. }
  186. else {
  187. pbDeviceLocked = FALSE;
  188. CloseDriver (hVFDrv,NULL,NULL);
  189. hVFDrv = 0;
  190. }
  191. GetDlgItem (IDC_CHECK1)->EnableWindow(pbDeviceLocked);
  192. GetDlgItem (IDC_RECORD)->EnableWindow(false);
  193. }
  194. void CMAV8Dlg::CloseAllDevice ()
  195. {
  196. if (hVFDrv) {
  197. HVFUnlock (hVFDrv, VF_CAP_ALL);
  198. CloseDriver (hVFDrv, NULL, NULL);
  199. hVFDrv = NULL;
  200. }
  201. }
  202. BOOL CMAV8Dlg::InitEncodeVideoVxD(HDRVR m_hVFDrv, BYTE m_bStream)
  203. {
  204.     DWORD dwValue;
  205.     WORD  wWidth, wHeight;
  206.     wWidth=352;
  207.     wHeight=288;
  208.     dwValue=MAKELONG(wWidth, wHeight);
  209.     HVFSet(m_hVFDrv, m_bStream, VF_INDEX_VID_OUTPUTSIZE, dwValue);
  210.     /* SDL - also set video width and height to scale images */
  211.     wWidth = (wWidth * 45) / 44; // try to maintain standard MPEG SIF aspect ratio
  212.     dwValue = MAKELONG(wWidth, wHeight /* [sic] */);
  213.     HVFSet(m_hVFDrv, m_bStream, VF_INDEX_VID_INPUTSIZE, dwValue);
  214.     HVFSet(m_hVFDrv, m_bStream, VF_INDEX_VID_BITRATE, 512000); //BITRATE_DEFAULT);
  215.     HVFSet(m_hVFDrv, m_bStream, VF_INDEX_VID_RATE, VF_FLAG_VID_25);
  216.     HVFSet(m_hVFDrv, m_bStream, VF_INDEX_VID_IINTERVAL, IINTERVAL_DEFAULT);
  217.     HVFSet(m_hVFDrv, m_bStream, VF_INDEX_VID_BINTERVAL, PINTERVAL_DEFAULT);
  218.     HVFSet(m_hVFDrv, m_bStream, VF_INDEX_VID_MODE, VF_FLAG_VID_PAL);
  219.     HVFSet(m_hVFDrv, m_bStream, VF_INDEX_VID_SOURCE, VF_FLAG_VID_COMPOSITE);
  220.     HVFSet(m_hVFDrv, m_bStream, VF_INDEX_VID_ALGORITHM, VF_FLAG_VID_MPEG);
  221.     HVFSet(m_hVFDrv, m_bStream, VF_INDEX_VID_BRIGHTNESS, BRIGHTNESS_DEFAULT);
  222.     HVFSet(m_hVFDrv, m_bStream, VF_INDEX_VID_CONTRAST, CONTRAST_DEFAULT);    
  223.     HVFSet(m_hVFDrv, m_bStream, VF_INDEX_VID_HUE, HUE_DEFAULT);
  224.     HVFSet(m_hVFDrv, m_bStream, VF_INDEX_VID_SATURATION, SATURATION_DEFAULT);
  225.     return TRUE;
  226. }
  227. BOOL CMAV8Dlg::InitEncodeAudioVxD(HDRVR m_hVFDrv, BYTE m_bStream)
  228. {
  229.   DWORD dwValue;
  230. HVFSet(m_hVFDrv, m_bStream, VF_INDEX_AUD_SAMPLE, SAMPLE_RATE_DEFAULT);
  231. HVFSet(m_hVFDrv, m_bStream, VF_INDEX_AUD_BITRATE, BIT_RATE_DEFAULT);
  232. dwValue=VF_FLAG_AUD_MPEG; // set to MPEG algorithm
  233. dwValue=(dwValue<<16)+VF_FLAG_AUD_NONE;
  234. HVFSet(m_hVFDrv, m_bStream, VF_INDEX_AUD_ALGORITHM, dwValue);
  235. HVFSet(m_hVFDrv, m_bStream, VF_INDEX_AUD_MODE, MODE_DEFAULT);
  236. HVFSet(m_hVFDrv, m_bStream, VF_INDEX_AUD_VOLUME, VOLUME_MIN);
  237. HVFSet(m_hVFDrv, m_bStream, VF_INDEX_AUD_VOLUME, VOLUME_DEFAULT);
  238. HVFSet(m_hVFDrv, m_bStream, VF_INDEX_AUD_GAIN, GAIN_DEFAULT);
  239. return TRUE;
  240. }
  241. BOOL CMAV8Dlg::InitEncodeSystemVxD(HDRVR m_hVFDrv, BYTE m_bStream)
  242. {
  243. HVFSet(m_hVFDrv, m_bStream, VF_INDEX_STM_TYPE, VF_FLAG_MPGSYS);
  244. HVFSet(m_hVFDrv, m_bStream, VF_INDEX_STM_ENCODEMODE, VF_FLAG_STM_NORMAL);
  245. return TRUE;
  246. }
  247. /////////////////////////////////////////////////////////////////////////////
  248. // CMAV8Dlg dialog
  249. CMAV8Dlg::CMAV8Dlg(CWnd* pParent /*=NULL*/)
  250. : CDialog(CMAV8Dlg::IDD, pParent)
  251. {
  252. //{{AFX_DATA_INIT(CMAV8Dlg)
  253. m_InputWnd = TRUE;
  254. m_ToFile = FALSE;
  255. //}}AFX_DATA_INIT
  256. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  257. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  258. pOverlayWnd=NULL;
  259. IsCapture = FALSE;
  260. hVFDrv = 0;
  261. pPlayWnd = NULL;
  262. }
  263. CMAV8Dlg::~CMAV8Dlg()
  264. {
  265. if(pOverlayWnd)
  266. delete pOverlayWnd;
  267. pOverlayWnd = NULL;
  268. IsCapture = FALSE;
  269. hVFDrv = 0;
  270. }
  271. void CMAV8Dlg::DoDataExchange(CDataExchange* pDX)
  272. {
  273. CDialog::DoDataExchange(pDX);
  274. //{{AFX_DATA_MAP(CMAV8Dlg)
  275. DDX_Control(pDX, IDC_CHECK1, m_Check1);
  276. DDX_Check(pDX, IDC_INWINDOW, m_InputWnd);
  277. DDX_Check(pDX, IDC_TOFILE, m_ToFile);
  278. //}}AFX_DATA_MAP
  279. }
  280. BEGIN_MESSAGE_MAP(CMAV8Dlg, CDialog)
  281. //{{AFX_MSG_MAP(CMAV8Dlg)
  282. ON_WM_SYSCOMMAND()
  283. ON_WM_PAINT()
  284. ON_WM_QUERYDRAGICON()
  285. ON_WM_DESTROY()
  286. ON_BN_CLICKED(IDC_CHECK1, OnCheck1)
  287. ON_BN_CLICKED(IDC_RECORD, OnRecstop1)
  288. ON_BN_CLICKED(IDC_TOFILE, OnTofile)
  289. ON_BN_CLICKED(IDC_STOP, OnRecstop1)
  290. ON_BN_CLICKED(IDC_INWINDOW, OnInwindow)
  291. //}}AFX_MSG_MAP
  292. END_MESSAGE_MAP()
  293. /////////////////////////////////////////////////////////////////////////////
  294. // CMAV8Dlg message handlers
  295. BOOL CMAV8Dlg::OnInitDialog()
  296. {
  297. CDialog::OnInitDialog();
  298. // Add "About..." menu item to system menu.
  299. // IDM_ABOUTBOX must be in the system command range.
  300. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  301. ASSERT(IDM_ABOUTBOX < 0xF000);
  302. CMenu* pSysMenu = GetSystemMenu(FALSE);
  303. if (pSysMenu != NULL)
  304. {
  305. CString strAboutMenu;
  306. strAboutMenu.LoadString(IDS_ABOUTBOX);
  307. if (!strAboutMenu.IsEmpty())
  308. {
  309. pSysMenu->AppendMenu(MF_SEPARATOR);
  310. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  311. }
  312. }
  313. // Set the icon for this dialog.  The framework does this automatically
  314. //  when the application's main window is not a dialog
  315. SetIcon(m_hIcon, TRUE); // Set big icon
  316. SetIcon(m_hIcon, FALSE); // Set small icon
  317. // TODO: Add extra initialization here
  318. CountDevice ();
  319. GetDlgItem (IDC_EDIT1)->SetWindowText ("c:\temp1.mpg");
  320. GetDlgItem (IDC_EDIT1)->EnableWindow (m_ToFile);
  321. GetDlgItem (IDC_STOP)->EnableWindow (IsCapture);
  322. CaptureToFile = m_ToFile;
  323. return TRUE;  // return TRUE  unless you set the focus to a control
  324. }
  325. void CMAV8Dlg::OnSysCommand(UINT nID, LPARAM lParam)
  326. {
  327. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  328. {
  329. CAboutDlg dlgAbout;
  330. dlgAbout.DoModal();
  331. }
  332. else
  333. {
  334. CDialog::OnSysCommand(nID, lParam);
  335. }
  336. }
  337. // If you add a minimize button to your dialog, you will need the code below
  338. //  to draw the icon.  For MFC applications using the document/view model,
  339. //  this is automatically done for you by the framework.
  340. void CMAV8Dlg::OnPaint() 
  341. {
  342. if (IsIconic())
  343. {
  344. CPaintDC dc(this); // device context for painting
  345. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  346. // Center icon in client rectangle
  347. int cxIcon = GetSystemMetrics(SM_CXICON);
  348. int cyIcon = GetSystemMetrics(SM_CYICON);
  349. CRect rect;
  350. GetClientRect(&rect);
  351. int x = (rect.Width() - cxIcon + 1) / 2;
  352. int y = (rect.Height() - cyIcon + 1) / 2;
  353. // Draw the icon
  354. dc.DrawIcon(x, y, m_hIcon);
  355. }
  356. else
  357. {
  358. CDialog::OnPaint();
  359. }
  360. }
  361. // The system calls this to obtain the cursor to display while the user drags
  362. //  the minimized window.
  363. HCURSOR CMAV8Dlg::OnQueryDragIcon()
  364. {
  365. return (HCURSOR) m_hIcon;
  366. }
  367. void CMAV8Dlg::OnDestroy() 
  368. {
  369. CDialog::OnDestroy();
  370. CloseAllDevice ();
  371. }
  372. void CMAV8Dlg::CreateVideoWindow ()
  373. {
  374. int nXDelta;
  375. int nXScreenSize, nXNew;
  376. CRect RectDlg;
  377. GetWindowRect(RectDlg);
  378. // readjust the control window location
  379. nXScreenSize=::GetSystemMetrics(SM_CXSCREEN);
  380. nXNew=nXScreenSize/2+50;
  381. nXDelta=nXNew-RectDlg.left;
  382. RectDlg.left=nXNew;
  383. RectDlg.right=RectDlg.right+nXDelta;
  384. MoveWindow(&RectDlg);
  385. // calcuate the overlay window size and location
  386. WORD wOverlayWidth;
  387. WORD wOverlayHeight;
  388. wOverlayWidth = 352;
  389. wOverlayHeight = 288;
  390. RectDlg.left=RectDlg.left-wOverlayWidth-10;
  391. RectDlg.right=RectDlg.left + wOverlayWidth + GetSystemMetrics(SM_CXFRAME)+5;
  392. RectDlg.bottom=RectDlg.top+ wOverlayHeight + 10+
  393. GetSystemMetrics(SM_CYFRAME)+ 
  394. //GetSystemMetrics(SM_CYCAPTION)+GetSystemMetrics(SM_CYMENU);
  395. GetSystemMetrics(SM_CYCAPTION); // test
  396. pOverlayWnd=new COverlay(hVFDrv, RectDlg, wOverlayWidth, wOverlayHeight);
  397. pOverlayWnd->ShowWindow(SW_SHOWNORMAL);
  398. pOverlayWnd->UpdateWindow();
  399. InitEncodeVideoVxD(hVFDrv, 0);
  400.         InitEncodeAudioVxD(hVFDrv, 0);
  401.     InitEncodeSystemVxD(hVFDrv, 0);
  402. }
  403. void CMAV8Dlg::RecordOrStop (int id, CString fn)
  404. {
  405.     WORD flags;
  406. if (IsCapture) {
  407. // Stop capture
  408.         HVFStop(hVFDrv, bStream);
  409. TRACE0 ("HVFStopn");
  410. if (id == 0) {
  411. if (pPlayWnd) {
  412. pPlayWnd->m_pimc->StopWhenReady();
  413. TRACE0 ("StopWhenReadyn");
  414. }
  415. }
  416.         HVFClose(hVFDrv, bStream);
  417. TRACE0 ("HVFClosen");
  418. bStream = 0;
  419. IsCapture = FALSE;
  420. }
  421. else {
  422. // Start Record
  423. IsCapture = TRUE;
  424. flags = VF_FLAG_MPEG | VF_FLAG_ENCODE | VF_FLAG_OUTBUF;
  425. lstrcpy (caFileName, fn.GetBuffer (MAX_PATH));
  426. bStream = static_cast<BYTE> (HVFOpen(hVFDrv, 
  427. flags, 
  428. reinterpret_cast<unsigned long>(MyCallBack)));
  429. fn.ReleaseBuffer ();
  430. InitEncodeVideoVxD(hVFDrv, bStream);
  431.         InitEncodeAudioVxD(hVFDrv, bStream);
  432. InitEncodeSystemVxD(hVFDrv, bStream);
  433.         
  434. if (id == 0) {
  435. for (int i = 0; i< 100; i++)
  436. Ptr[i] = pbMem[i];
  437. rwIndex = 0;
  438. Ready = false;
  439. }
  440. HVFRecord(hVFDrv, bStream, NULL, NULL);
  441. if (id == 0) {
  442. pPlayWnd->Render ();
  443. }
  444. }
  445. GetDlgItem (IDC_STOP)->EnableWindow (IsCapture);
  446. GetDlgItem (IDC_INWINDOW)->EnableWindow (!IsCapture);
  447. GetDlgItem (IDC_TOFILE)->EnableWindow (!IsCapture);
  448. }
  449. void CMAV8Dlg::OnCheck1() 
  450. {
  451. if (m_Check1.GetCheck () == 1) {
  452. if (m_InputWnd && !pOverlayWnd)
  453. CreateVideoWindow ();
  454. GetDlgItem (IDC_RECORD)->EnableWindow (TRUE);
  455. pPlayWnd = new CPlayWnd (); ///
  456. hWnd = pPlayWnd->GetSafeHwnd ();
  457. pPlayWnd->ShowWindow (SW_SHOW); ///
  458. pPlayWnd->UpdateWindow(); ///
  459. }
  460. else {
  461. delete pOverlayWnd;
  462. pOverlayWnd = NULL;
  463. delete pPlayWnd;
  464. pPlayWnd= NULL;
  465. GetDlgItem (IDC_RECORD)->EnableWindow (FALSE);
  466. GetDlgItem (IDC_STOP)->EnableWindow (FALSE);
  467. }
  468. }
  469. void CMAV8Dlg::OnRecstop1() 
  470. {
  471. CString fn;
  472. GetDlgItem (IDC_EDIT1)->GetWindowText (fn);
  473. RecordOrStop (0, fn);
  474. }
  475. void CMAV8Dlg::OnTofile() 
  476. {
  477. UpdateData (TRUE);
  478. CaptureToFile = m_ToFile;
  479. GetDlgItem (IDC_EDIT1)->EnableWindow (m_ToFile);
  480. }
  481. void CMAV8Dlg::OnInwindow() 
  482. {
  483. UpdateData (TRUE);
  484. if (m_InputWnd) {
  485. if(!pOverlayWnd) {
  486. CreateVideoWindow ();
  487. }
  488. } else {
  489. if(pOverlayWnd)
  490. delete pOverlayWnd;
  491. pOverlayWnd = NULL;
  492. }
  493. }