⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xaviplayer.cpp

📁 这是一本学习 window编程的很好的参考教材
💻 CPP
字号:
// XAviPlayer.cpp : Implementation of CXAviPlayer
#include "stdafx.h"

#include "XAviPlayer.h"
#include "commctrl.h"
#include <assert.h>
#pragma comment(lib,"Winmm.lib")
/////////////////////////////////////////////////////////////////////////////
// CXAviPlayer

#define PBM_SETPOS              (WM_USER+2)

// message loop for our thread.
BOOL WaitWithMessageLoop(HANDLE hEvent)   
{       
	DWORD dwRet;       
	MSG msg;
	while (1)       
	{
		dwRet = MsgWaitForMultipleObjects(1, &hEvent, FALSE, 2000, QS_ALLINPUT);
		if (dwRet == WAIT_OBJECT_0)       
		{
			return TRUE;
		} 
		else if (dwRet == WAIT_OBJECT_0 + 1)       
		{
			// window message
			while (PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE))       
			{
                  TranslateMessage(&msg);          
				  DispatchMessage(&msg);
			}       
		} 
		else       
		{
			return FALSE;       
		}       
	}   
}

// thread callback. processes all the dialog stuff.
DWORD WINAPI ThreadCallback(CXAviPlayer* pthis)
{
	assert(pthis!=NULL);
	::SetCursor(::LoadCursor(NULL, IDC_ARROW));
	while (1)
	{
		// we have to go now.
		if (pthis->m_bLast)
		{
			if (!pthis->m_pDlg)		// should not happen.
			{
				SetEvent(pthis->m_hStop);
				return 1;
			}
			Animate_Stop(pthis->m_pDlg->m_hwndAnim);
			::DestroyWindow(pthis->m_pDlg->m_hWnd);
			SetEvent(pthis->m_hStop);		// allows ::Stop to procede.
			ExitThread(0L);
			return 1L;
		}
		// we got the signal to display new additional text.
		if (pthis->m_bTextNew&&!pthis->m_bFirst)
		{
			if (!pthis->m_pDlg)	return 1L;	// should not happen.
			HWND hwndControl = ::GetDlgItem(pthis->m_pDlg->m_hWnd, IDC_TEXT);
			if (hwndControl!=NULL&&pthis->m_pDlg->m_nRows)	
				::SetWindowText(hwndControl, pthis->m_pDlg->m_sText);
			pthis->m_bTextNew = FALSE;
		}
		// we have to draw the dialog box and initialize all the AVI stuff.
		if (pthis->m_bFirst)
		{
			pthis->m_bFirst = FALSE;
			HWND hWndTemp = pthis->m_pDlg->Create(NULL);
			::SetWindowText(pthis->m_pDlg->m_hWnd, pthis->m_sTitle);
			::ShowWindow(pthis->m_pDlg->m_hWnd, SW_SHOW);
			::UpdateWindow(pthis->m_pDlg->m_hWnd);
			// allow ::Play() to procede further.
			if (pthis->m_hStart)	ReleaseMutex(pthis->m_hStart);
		}
		else if (!pthis->m_bLast&&pthis->m_pDlg)	// right part is a pure precautionary measure.
		{
			// it was a mathemetician who designed this formula.
			double t = (timeGetTime()-(pthis->m_pDlg->m_StartTime))/1000;
			double c = log(0.5)/(-(pthis->m_pDlg->m_halfLife));
			double L = lMaxRange - lMaxRange*exp(-c*t);
			::SendMessage(pthis->m_pDlg->m_hwndProgress, PBM_SETPOS, (WPARAM)L, 0);
		}
		WaitWithMessageLoop(NULL);	// better than sleeping, at least in this routine.
	}
	return 1L;
}

LRESULT CXAviPlayer::Stop()
{
	if (!m_pDlg)			return S_OK;
	m_bLast = TRUE;	// signaling the thread, that we have to go now.
	WaitForSingleObject(m_hStop, INFINITE);	// give him the chance to tidy up.
	if (m_hThread)
	{
		CloseHandle(m_hThread);
		m_hThread = 0L;
	}
	if (m_pDlg)
	{	
		delete (m_pDlg);
		m_pDlg = NULL;
		return S_OK;
	}
	return S_FALSE;
}

CXAviPlayer::~CXAviPlayer()
{
	if (m_hThread)	// we have played an AVI.
	{
		m_bLast = TRUE;
		WaitForSingleObject(m_hStop, INFINITE);
		if (m_pDlg)
		{
			::DestroyWindow(m_pDlg->m_hWnd);
			delete m_pDlg;
			m_pDlg = NULL;
			ATLTRACE(_T("Window destroyed, Pointer deleted.\n"));
		}
	}
	if (m_hStart)	
	{
		CloseHandle(m_hStart);
		m_hStart = 0L;
	}
	if (m_hStop)	
	{
		CloseHandle(m_hStop);
		m_hStop = 0L;
	}
}

CXAviPlayer::CXAviPlayer()
{
	m_pDlg = NULL;		// vital pointer to dialog box.
	m_bLast = FALSE;	// not stopping now.
	m_bFirst = FALSE;	// but starting at the beginning.
	m_bTextNew = FALSE;	// we don't initial display additional text.
	m_hStart = CreateMutex(NULL, NULL, NULL);	// mutex for synchronizing thread and Play()
	m_hStop = CreateEvent(NULL, TRUE, FALSE, NULL);	// nonsignaled event, which is turned on later.
	m_hThread = 0L;		// on leaving we close the handle.
}


LRESULT CXAviPlayer::Play( long hWnd,  TCHAR* Title, 
							   long Repeat)
{
	// paying tribute to compability.
	return(PlayEx( hWnd, Title, Repeat, 0, 0, 0, FALSE, 0));
}

LRESULT CXAviPlayer::PlayEx( long hWnd,  TCHAR* Title, 
			long Repeat, long Width, long Height, long nTextRows, 
			BOOL Progress, long HalfLife)
{
	

	m_bFirst = TRUE;
	m_sTitle[0] = '\0';
	unsigned long len = _tcslen(Title);
	len = (len > 255) ? 255 : len;
	if (len)	strncpy(m_sTitle,Title, len);
	m_sTitle[len] = '\0';
	
	m_pDlg = new CXAviPlay(IDR_FILECOPY, Repeat, Width, 
		Height, nTextRows, Progress, HalfLife, (HWND)hWnd);

	DWORD ThreadID;
	if (!m_hStart)
	{
		m_hStart = CreateMutex(NULL, NULL, NULL);
		m_bLast = FALSE;
	}
	m_hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadCallback,  (LPVOID)this, 0, &ThreadID);
	WaitForSingleObject(m_hStart, INFINITE);
	if (m_hStart) 
	{
		CloseHandle(m_hStart);
		m_hStart = 0L;
	}
	ATLTRACE("now S_OK\n");
	return S_OK;
}

LRESULT CXAviPlayer::SetText(TCHAR* sText)
{


	if (!m_pDlg)	return S_OK;
	unsigned long len = _tcslen(sText);
	len = (len > 255) ? 255 : len;
	if (len)	strncpy(m_pDlg->m_sText,sText, len);
	m_pDlg->m_sText[len] = '\0';
	m_bTextNew = TRUE;
	return S_OK;
}

LRESULT CXAviPlayer::ResetProgressBar()
{
	if (m_pDlg)	m_pDlg->ResetProgressBar();
	ATLTRACE("Resetting ProgressBar\n");
	return S_OK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -