📄 dmreaderdlg.cpp
字号:
//最大化/恢复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 + -