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

📄 dmreaderdlg.cpp

📁 swf 格式文件(Flash)阅读器.根据 Flash 文件窗口的大小自适应调整阅读器窗口大小。直持压缩过 swf 文件。如果为 *.exe 格式 Flash 文件可用 Exe2Swf 程序进行分解为
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		//最大化/恢复button
		if (m_rtButtMax.PtInRect(point))
		{
			if (IsZoomed())
				pBitmap->LoadBitmap(IDB_SBTN_RESTORE_);
			else
				pBitmap->LoadBitmap(IDB_SBTN_MAX_);
		}
		else
		{
			if (IsZoomed())
				pBitmap->LoadBitmap(IDB_SBTN_RESTORE);
			else
				pBitmap->LoadBitmap(IDB_SBTN_MAX);
		}
		rtButton = m_rtButtMax;
		rtButton.OffsetRect(-rtWnd.left, -rtWnd.top);
		pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
		pDC->BitBlt(rtButton.left, rtButton.top, rtButton.Width(), rtButton.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
		pDisplayMemDC->SelectObject(pOldBitmap);
		pBitmap->DeleteObject();

		//最小化button
		if (m_rtButtMin.PtInRect(point))
			pBitmap->LoadBitmap(IDB_SBTN_MIN_);
		else
			pBitmap->LoadBitmap(IDB_SBTN_MIN);
		rtButton = m_rtButtMin;
		rtButton.OffsetRect(-rtWnd.left, -rtWnd.top);
		pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
		pDC->BitBlt(rtButton.left, rtButton.top, rtButton.Width(), rtButton.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
		pDisplayMemDC->SelectObject(pOldBitmap);
		pBitmap->DeleteObject();

		//<1:1>button
		if (m_rtButtBestView.PtInRect(point))
			pBitmap->LoadBitmap(IDB_SBTN_BESTVIEW_);
		else
			pBitmap->LoadBitmap(IDB_SBTN_BESTVIEW);
		rtButton = m_rtButtBestView;
		rtButton.OffsetRect(-rtWnd.left, -rtWnd.top);
		pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
		pDC->BitBlt(rtButton.left, rtButton.top, rtButton.Width(), rtButton.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
		pDisplayMemDC->SelectObject(pOldBitmap);
		pBitmap->DeleteObject();

		//<FullScreen>button
		if (m_rtButtFull.PtInRect(point))
			pBitmap->LoadBitmap(IDB_SBTN_FULLSCREEN_);
		else
			pBitmap->LoadBitmap(IDB_SBTN_FULLSCREEN);
		rtButton = m_rtButtFull;
		rtButton.OffsetRect(-rtWnd.left, -rtWnd.top);
		pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
		pDC->BitBlt(rtButton.left, rtButton.top, rtButton.Width(), rtButton.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
		pDisplayMemDC->SelectObject(pOldBitmap);
		pBitmap->DeleteObject();

		//<menu>button
		if (m_rtButtMeun.PtInRect(point))
			pBitmap->LoadBitmap(IDB_MENU_);
		else
			pBitmap->LoadBitmap(IDB_MENU);
		rtButton = m_rtButtMeun;
		rtButton.OffsetRect(-rtWnd.left, -rtWnd.top);
		pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
		pDC->BitBlt(rtButton.left, rtButton.top, rtButton.Width(), rtButton.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
		pDisplayMemDC->SelectObject(pOldBitmap);
		pBitmap->DeleteObject();
	}
	
	ReleaseDC(pDisplayMemDC);
	ReleaseDC(pDC);
	delete pDisplayMemDC;
	delete pBitmap;

	CDialog::OnNcMouseMove(nHitTest, point);
}

void CDmReaderDlg::OnNcLButtonDown(UINT nHitTest, CPoint point) 
{
	if(m_bFullScreen)
	{
		CDialog::OnNcLButtonDown(nHitTest, point);
		return;
	}

	//检测各按钮是否按到
	if (m_rtButtMeun.PtInRect(point))
	{
		CMenu menu;
		VERIFY(menu.LoadMenu(IDR_MENU_READER));
		CMenu* pPopup = menu.GetSubMenu(0);
		ASSERT(pPopup != NULL);
//		ClientToScreen(&point);
		pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,this);
	}
	else if (m_rtIcon.PtInRect(point))
	{
		// TODO:
	}
	else if(m_rtButtFull.PtInRect(point))
	{
		OnMenuFullScreen();
	}
	else if(m_rtButtBestView.PtInRect(point))
	{
		OnMenuBestShow();
	}
	else if (m_rtButtExit.PtInRect(point))
	{
		SendMessage(WM_CLOSE);
	}
	else if (m_rtButtMin.PtInRect(point))
	{
		SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, MAKELPARAM(point.x, point.y));
	}
	else if (m_rtButtMax.PtInRect(point))
	{
		if (IsZoomed())
			SendMessage(WM_SYSCOMMAND, SC_RESTORE, MAKELPARAM(point.x, point.y));
		else
		{
			SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, MAKELPARAM(point.x, point.y));
			Invalidate();
		}
	}
	else if (!IsZoomed())
		Default();
}

BEGIN_EVENTSINK_MAP(CDmReaderDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CDmReaderDlg)
	ON_EVENT(CDmReaderDlg, IDC_SHOCKWAVEFLASH1, -609 /* OnReadyStateChange */, OnOnReadyStateChangeShockwaveflash1, VTS_I4)
	ON_EVENT(CDmReaderDlg, IDC_SHOCKWAVEFLASH1, 1958 /* OnProgress */, OnOnProgressShockwaveflash1, VTS_I4)
	ON_EVENT(CDmReaderDlg, IDC_SHOCKWAVEFLASH1, 150 /* FSCommand */, OnFSCommandShockwaveflash1, VTS_BSTR VTS_BSTR)
	ON_EVENT(CDmReaderDlg, IDC_SHOCKWAVEFLASH1, 197 /* FlashCall */, OnFlashCallShockwaveflash1, VTS_BSTR)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

// -ZYZ- -获取解密数码杂志路径- [5/15/2005]
CString CDmReaderDlg::GetDecryBook(LPCTSTR lpszBook)
{

	return _T("");
}

// -ZYZ- 创建临时文件夹 [5/15/2005]
CString CDmReaderDlg::CreateBookTempDir()
{
	CString m_sTempDir;

	DWORD dwFileAttributes = FILE_ATTRIBUTE_HIDDEN;
	
	CString strSysTemp;
	GetWindowsDirectory(strSysTemp.GetBuffer(_MAX_PATH), _MAX_PATH);
	strSysTemp.ReleaseBuffer();
	strSysTemp = strSysTemp.Left(3);
	strSysTemp += "Temp";

	{
		GetTempPath(_MAX_PATH, strSysTemp.GetBuffer(_MAX_PATH));
		strSysTemp.ReleaseBuffer();
		strSysTemp.TrimRight('\\');
	}
	
	CreateDirectory(strSysTemp, NULL);
	strSysTemp += "\\~InnerDoc";
	CreateDirectory(strSysTemp, NULL);
	SetFileAttributes(strSysTemp, dwFileAttributes);
	
	if(GlbIsValidDirectory(strSysTemp))
	{
		m_sTempDir = strSysTemp;
		return m_sTempDir;
	}

	m_sTempDir = GlbGetAppPath();
	strSysTemp += "\\~InnerDoc";
	CreateDirectory(strSysTemp, NULL);
	SetFileAttributes(strSysTemp, dwFileAttributes);
	
	if(GlbIsValidDirectory(strSysTemp))
	{
		m_sTempDir = strSysTemp;
		return m_sTempDir;
	}
	else
	{
		m_sTempDir.Empty();
		return m_sTempDir;
	}
}

// -ZYZ- [5/23/2005] - 限定最大化和最小化
void CDmReaderDlg::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) 
{
	CRect rectWindow;
	CRect rectClient;
	GetWindowRect(rectWindow);
	GetClientRect(rectClient);
	int nW = GetSystemMetrics(SM_CXFULLSCREEN);
	int nH = GetSystemMetrics(SM_CYFULLSCREEN);

	lpMMI->ptMaxSize.x = nW + rectWindow.Width() - rectClient.Width() - 1;
	lpMMI->ptMaxSize.y = nH + rectWindow.Height() - rectClient.Height() - 1;
	
	CDialog::OnGetMinMaxInfo(lpMMI);
}

//根据影片宽高控制码,读取
long CDmReaderDlg::GetReadSize(int nCode)
{
	long nRead = -1;

	switch(nCode)
	{
	case 50:
		nRead = 6;//10
		break;
	case 58:      //11
	case 60:      //12
		nRead = 7;
		break;
	case 68:      //13
	case 70:      //14
		nRead = 8;
		break;
	case 78:      //15
	case 80:      //16
		nRead = 9;
		break;
	case 88:      //17
		nRead = 10;
		break;
	default:
		nRead = -1;
		break;
	}

	return nRead;
}

//获取 flash 文件的宽高
BOOL CDmReaderDlg::GetRect(int nCode, BYTE *pBytes, CRect &rt)
{
	//每次截取的位数
	int nCut = pBytes[0]>>3;
	int nRead = ((nCut * 4) + 5)/8 + 1;
//	nRead = GetReadSize(nCode);

	CString strSource;
	for(int i = 0;i < nRead;i++)
	{
		CString strTemp;
		BYTE bByte = pBytes[i];
		strTemp.Format("%X",bByte);
		if( strTemp.GetLength() <= 1 )
			strTemp = _T("0") + strTemp;
		strSource += strTemp;
	}
	
	//16 进制(字符串)转换为 2 进制(字符串)
	strSource = Convert16To2(strSource);

	//去掉前 5 位
	strSource = strSource.Right(strSource.GetLength() - 5);

	CString strX,strY;
	strX = strSource.Mid(nCut,nCut);
	strY = strSource.Mid(nCut * 3,nCut);

	CString strX1,strY1;
	strX1 = strSource.Mid(0,nCut);
	strY1 = strSource.Mid(nCut * 2,nCut);

	//2 进制(字符串)转换为 10 进制
	long nX = Convert2To10(strX) / 20;
	long nY = Convert2To10(strY) / 20;

	long nX1 = Convert2To10(strX1) / 20;
	long nY1 = Convert2To10(strY1) / 20;

	rt.left    = 0;
	rt.right   = nX - nX1;
	rt.top     = 0;
	rt.bottom  = nY - nY1;

	return TRUE;
}

BOOL CDmReaderDlg::GetRect(CString path,CRect &rt)
{
	CFile file;
	if(!file.Open(path,CFile::modeRead | CFile::typeBinary))
		return FALSE;

	//读取头 3 个字节,判断 flash 数据是否被压缩,或是否是有效的 flash 文件
	BYTE bFlag[ 3 ] = {0};
	file.SeekToBegin();
	if(!file.Read(bFlag,3))
	{
		file.Close();
		return FALSE;
	}

	//判断是否是被压缩过的 flash
	BOOL bZlib = FALSE;
	if( ( bFlag[0] == 'F' ) &&
		( bFlag[1] == 'W' ) &&
		( bFlag[2] == 'S' ) )
	{
		bZlib = FALSE;
	}
	else
	if( ( bFlag[0] == 'C' ) &&
		( bFlag[1] == 'W' ) &&
		( bFlag[2] == 'S' ) )
	{
		bZlib = TRUE;
	}
	else
	{//无效 flash 文件
		file.Close();
		return FALSE;
	}

	BOOL bGet = FALSE;
	if(bZlib)
	{//数据被压缩过,需要解压
		long nFileLen = file.GetLength();
		file.Seek(4,CFile::begin);

		//读取解压后 swf 文件大小
		long nSwfLen = 0;
		file.Read(&nSwfLen , 4);

		//分配空间,用以读取数据
		BYTE *pBytes     = new BYTE[nFileLen];
		memset(pBytes,'\0',nFileLen);

		//分配空间,用以解压
		BYTE *pDestBytes = new BYTE[nSwfLen + 1024];
		memset(pDestBytes,'\0',nSwfLen + 1024);
		
		unsigned long nDestLen = nSwfLen + 1024;
		file.Seek(8,CFile::begin);
		long nBeRead = file.Read(pBytes,nFileLen - 8);
		file.Close();
			
		int nCode = uncompress(pDestBytes,&nDestLen,pBytes,nFileLen - 8);
		//获取影片宽高
		bGet = GetRect(nCode,pDestBytes,rt);

		delete []pBytes;
		delete []pDestBytes;
	}
	else
	{
		//读取 flash 影片宽高数据控制码,控制码位于第 9 个字节
		//控制码总共分为如下几种类型 50,58,60,68,70,78,80,88
		BYTE bByte = 0;
		file.Seek(8,CFile::begin);
		if(!file.Read(&bByte,1))
		{
			file.Close();
			return FALSE;
		}
		
		//影片宽高数据控制码 16 进制显示
		CString strCode ;
		strCode.Format("%X",bByte);
		
		//将控制码转换为数据
		int nCode = (int)atoi(strCode.GetBuffer(0));
		
		//获取不同控制码所需要读取的节字数
		long nRead = GetReadSize(nCode);
		
		//无效控制码
		if( nRead == -1 )
		{
			file.Close();
			return FALSE;
		}
		
		//从第 8 个字节读取,读取影片宽高字节信息
		file.Seek(8,CFile::begin);
		BYTE *pBytes = new BYTE[nRead];
		memset(pBytes,'\0',nRead);
		file.Read(pBytes,nRead);
		file.Close();
		
		//获取影片宽高
		bGet = GetRect(nCode,pBytes,rt);
		delete []pBytes;
	}

	return bGet;
}

//二进制(字符串)转换成十进制
long CDmReaderDlg::Convert2To10(CString strBuff)
{
	long num = 0, sum = 0;
	int nLen = strBuff.GetLength();
	for ( int i = 0; i < nLen; i++ )
	{
		num = ( strBuff.GetAt(i) - 48 );
		num = num * (long)pow( 2, nLen - i - 1 );  
		sum += num;
	}

	return sum;
}

//16 进制(字符串)转换为 2 进制(字符串)
CString CDmReaderDlg::Convert16To2(CString strSource)
{
	//转换成大写字母
	strSource.MakeUpper();
	CString strDest;
	for( int i = 0;i < strSource.GetLength();i++ )
	{
		if(strSource.GetAt(i) == '0')
			strDest += _T("0000");

		if(strSource.GetAt(i) == '1')
			strDest += _T("0001");

		if(strSource.GetAt(i) == '2')
			strDest += _T("0010");

		if(strSource.GetAt(i) == '3')
			strDest += _T("0011");

		if(strSource.GetAt(i) == '4')
			strDest += _T("0100");

		if(strSource.GetAt(i) == '5')
			strDest += _T("0101");

		if(strSource.GetAt(i) == '6')
			strDest += _T("0110");

		if(strSource.GetAt(i) == '7')
			strDest += _T("0111");

		if(strSource.GetAt(i) == '8')
			strDest += _T("1000");

		if(strSource.GetAt(i) == '9')
			strDest += _T("1001");

		if(strSource.GetAt(i) == 'A')
			strDest += _T("1010");

		if(strSource.GetAt(i) == 'B')
			strDest += _T("1011");

		if(strSource.GetAt(i) == 'C')
			strDest += _T("1100");

		if(strSource.GetAt(i) == 'D')
			strDest += _T("1101");

		if(strSource.GetAt(i) == 'E')
			strDest += _T("1110");

		if(strSource.GetAt(i) == 'F')
			strDest += _T("1111");
	}

	return strDest;
}

//判断是否为 flash 文件
BOOL CDmReaderDlg::IsFlash(CString strPath)
{
	if(strPath.IsEmpty())
		return FALSE;
	if(!GlbIsValidFile(strPath))
		return FALSE;

	CFile file;
	if(!file.Open(strPath,CFile::modeRead | CFile::typeBinary))
		return FALSE;

	//读取头 3 个字节,判断是否为 flash 文件标志
	BYTE bFlag[ 3 ] = {0};
	file.SeekToBegin();
	if(!file.Read(bFlag,3))
	{
		file.Close();
		return FALSE;
	}
	file.Close();

	BOOL bFlash = FALSE;
	if( ( bFlag[0] == 'F' || bFlag[0] == 'C') &&
		( bFlag[1] == 'W' ) &&
		( bFlag[2] == 'S' ) )
	{
		bFlash = TRUE;
	}

	return bFlash;
}

void CDmReaderDlg::OnAbout() 
{
	CAboutDlg dlg;
	dlg.DoModal();
}

BOOL CAboutDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();

	COLORREF cr1 = RGB(255,0,0),//红
		     cr2 = RGB(0,255,0),//绿
			 cr3 = RGB(0,0,255);//蓝

	m_staticDm100.SetColours(cr1,cr1,cr1);
	m_staticDm100.SetURL("www.dm100.cn");
	return TRUE; 
}

void CDmReaderDlg::OnOnReadyStateChangeShockwaveflash1(long newState) 
{
}

void CDmReaderDlg::OnOnProgressShockwaveflash1(long percentDone) 
{
}

void CDmReaderDlg::OnFlashCallShockwaveflash1(LPCTSTR request) 
{
}

void CDmReaderDlg::OnFSCommandShockwaveflash1(LPCTSTR command, LPCTSTR args) 
{
	CString sCommand = command;
	sCommand.MakeLower();

	if(sCommand.Compare("dingyue") == 0)
	{
		HWND hEbookWnd = GlbFindEBookWnd(ECP_MAN_DATA);
		if(IsWindow(hEbookWnd))
		{
			if(!::IsWindowVisible(hEbookWnd) || ::IsIconic(hEbookWnd))
				::SendMessage(hEbookWnd, WM_COMMAND, 32771, 0L);
			::BringWindowToTop(hEbookWnd);
			::PostMessage(hEbookWnd, WM_SUBSFROMREADER, 0L, 0L);
		}
	}

	if(sCommand.Compare("quit") == 0)
	{
		exit(1);
	}
}

⌨️ 快捷键说明

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