📄 readbookwnd.cpp
字号:
// ReadBookWnd.cpp: implementation of the CReadBookWnd class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ReadBookWnd.h"
#include "GotoDlg.h"
#include "OptionDlg.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
COLORREF CReadBookWnd::m_Colors[] =
{
RGB(0,0,0), //dark
RGB(192,192,192), //light grey
RGB(128,128,128), //dark grey
RGB(255,255,255), //write
RGB(255,0,0), //red
RGB(255,255,0), //yellow
RGB(0,255,0), //green
RGB(0,0,255), //blue
RGB(255,0,255), //purple
RGB(0,255,255), //teal
RGB(128,0,0), //dark red
RGB(128,128,0), //dark yellow
RGB(0,128,0), //dark green
RGB(0,0,128), //dark blue
RGB(128,0,128), //dark purple
RGB(0,128,128), //dark teal
};
CReadBookWnd::CReadBookWnd()
{
m_BookName.Empty();
m_RecentPage = 0;
m_BookMark = 0;
m_FavorFlag = -1;
m_MainWnd = NULL;
m_FullScreenFlag = FALSE;
m_SlideFlag = FALSE;
}
CReadBookWnd::~CReadBookWnd()
{
}
LRESULT CReadBookWnd::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// TODO : Add Code for message handler. Call DefWindowProc if necessary.
LoadSHMenuBar(MAKEINTRESOURCE(IDR_READMENU));
SendMessage(m_hWndCB, SHCMBM_OVERRIDEKEY, VK_TBACK,
MAKELPARAM(SHMBOF_NODEFAULT | SHMBOF_NOTIFY, SHMBOF_NODEFAULT | SHMBOF_NOTIFY));
return 0;
}
void CReadBookWnd::ShowBook()
{
g_hWndLast = m_hWnd;
if (m_FullScreenFlag)
{
HMENU hMenu = (HMENU)SendMessage(m_hWndCB, SHCMBM_GETSUBMENU, 0, IDM_MENU);
CheckMenuItem(hMenu,IDM_FULLSCREEN,MF_CHECKED);
m_ShowBuf.m_FullScreen = TRUE;
}
else
m_ShowBuf.m_FullScreen = FALSE;
m_ShowBuf.SetFontCtrl(m_Setting[2],m_Setting[1]);
// m_ShowBuf.m_byCurrentFontSize = m_Setting[1];
// m_ShowBuf.m_byCurrentFontType = m_Setting[2];
m_ShowBuf.LoadFile(m_bFormat,m_BookPath);
if (m_ShowBuf.m_nMaxLinePerPage == 0)
return;
int k = m_ShowBuf.m_pcLine.GetSize();
if (k < m_ShowBuf.m_nMaxLinePerPage)
m_TotalPage = 1;
else
{
if (k % (m_ShowBuf.m_nMaxLinePerPage - 1))
m_TotalPage = k / (m_ShowBuf.m_nMaxLinePerPage - 1) + 1;
else
m_TotalPage = k / (m_ShowBuf.m_nMaxLinePerPage - 1);
}
if (m_LastPagePos)
{
if (m_LastPagePos >= k)
m_ShowBuf.m_nStartLine = k - 1;
else
m_ShowBuf.m_nStartLine = m_LastPagePos;
}
else
{
m_ShowBuf.m_nStartLine = 0;
}
m_ShowBuf.m_nEndLine = m_ShowBuf.m_nStartLine + m_ShowBuf.m_nMaxLinePerPage;
RedrawWindow();
GetPages();
}
LRESULT CReadBookWnd::OnSlide(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
CString SlideStr;
TBBUTTONINFO tbbi;
ZeroMemory(&tbbi,sizeof(tbbi));
tbbi.cbSize = sizeof(tbbi);
tbbi.dwMask = TBIF_TEXT;
if (!m_SlideFlag)
{
SlideStr.LoadString(IDS_STOP);
tbbi.pszText = SlideStr.LockBuffer();
tbbi.cchText = SlideStr.GetLength();
SlideStr.UnlockBuffer();
SendMessage (m_hWndCB, TB_SETBUTTONINFO, IDM_ACTION, (LPARAM)&tbbi);
SetTimer(1,(m_Setting[5] + 1) * 5000);
m_SlideFlag = TRUE;
}
else
{
KillTimer(1);
SlideStr.LoadString(IDS_READSLIDE);
tbbi.pszText = SlideStr.LockBuffer();
tbbi.cchText = SlideStr.GetLength();
SlideStr.UnlockBuffer();
SendMessage (m_hWndCB, TB_SETBUTTONINFO, IDM_ACTION, (LPARAM)&tbbi);
m_SlideFlag = FALSE;
}
return 0;
}
LRESULT CReadBookWnd::OnMenu(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
KillTimer(1);
TBBUTTONINFO tbbi;
ZeroMemory(&tbbi,sizeof(tbbi));
tbbi.cbSize = sizeof(tbbi);
tbbi.dwMask = TBIF_TEXT;
CString SlideStr;
SlideStr.LoadString(IDS_READSLIDE);
tbbi.pszText = SlideStr.LockBuffer();
tbbi.cchText = SlideStr.GetLength();
SlideStr.UnlockBuffer();
SendMessage (m_hWndCB, TB_SETBUTTONINFO, IDM_ACTION, (LPARAM)&tbbi);
m_SlideFlag = FALSE;
HMENU hMenu = (HMENU)SendMessage(m_hWndCB, SHCMBM_GETSUBMENU, 0, IDM_MENU);
switch (wID)
{
case IDM_GOTO:
{
CGotoDlg GotoDlg;
GotoDlg.m_WindowTitle = m_BookName;
GotoDlg.m_RecentPage = m_RecentPage + 1;
GotoDlg.m_TotalPage = m_TotalPage;
if (GotoDlg.DoModal() == IDOK)
{
if (GotoDlg.m_GotoPageNo <= 0)
{
m_ShowBuf.m_nStartLine = 0;
m_ShowBuf.m_nEndLine = m_ShowBuf.m_nMaxLinePerPage;
}
else
{
if (GotoDlg.m_GotoPageNo > m_TotalPage)
GotoDlg.m_GotoPageNo = m_TotalPage;
m_ShowBuf.m_nStartLine = (GotoDlg.m_GotoPageNo -1 ) * (m_ShowBuf.m_nMaxLinePerPage - 1);
m_ShowBuf.m_nEndLine = m_ShowBuf.m_nStartLine + m_ShowBuf.m_nMaxLinePerPage;
}
RedrawWindow();
GetPages();
}
break;
}
case IDM_SETBOOKMARK:
{
m_BookMark = m_ShowBuf.m_nEndLine;
break;
}
case IDM_GOTOBOOKMARK:
{
if (m_BookMark)
{
m_ShowBuf.m_nEndLine = m_BookMark;
m_ShowBuf.m_nStartLine = m_ShowBuf.m_nEndLine - m_ShowBuf.m_nMaxLinePerPage;
if (m_ShowBuf.m_nStartLine < 0)
m_ShowBuf.m_nStartLine = 0;
RedrawWindow();
GetPages();
}
break;
}
case IDM_ADDTOFAVOR:
{
CString Msg,MsgTitle,BookName;
BookName = GetSpecStr(m_BookPath,_T("\\"));
BookName = GetSpecStr(BookName,_T("."),FALSE);
Msg.Format(MSG_ADDWARNING,BookName);
MsgTitle.LoadString(TITLE_TXT);
if (MessageBox(Msg,MsgTitle, MB_YESNO | MB_ICONQUESTION) == IDYES)
{
m_FavorFlag = TRUE;
EnableDelFavorite(MF_GRAYED,MF_GRAYED);
}
break;
}
case IDM_DELETEFAVOR:
{
CString Msg,MsgTitle,BookName;
BookName = GetSpecStr(m_BookPath,_T("\\"));
BookName = GetSpecStr(BookName,_T("."),FALSE);
Msg.Format(MSG_DELWARNING,BookName);
MsgTitle.LoadString(TITLE_TXT);
if (MessageBox(Msg,MsgTitle, MB_YESNO | MB_ICONQUESTION) == IDYES)
{
m_FavorFlag = FALSE;
EnableDelFavorite(MF_GRAYED,MF_GRAYED);
}
break;
}
case IDM_OPTION:
{
COptionDlg OptionDlg;
for (int i = 0 ; i < 7 ; i++)
{
OptionDlg.m_Setting[i] = m_Setting[i];
}
if (OptionDlg.DoModal() == IDOK)
{
BOOL UpdateFlag = FALSE;
for (i = 0 ;i < 7 ; i++)
{
if (m_Setting[i] != OptionDlg.m_Setting[i])
{
m_Setting[i] = OptionDlg.m_Setting[i];
UpdateFlag = TRUE;
}
}
if (UpdateFlag)
ShowBook();
}
m_LastPagePos = m_ShowBuf.m_nStartLine;
break;
}
case IDM_FULLSCREEN:
{
if (m_FullScreenFlag)
{
m_FullScreenFlag = FALSE;
if (m_Setting[6])
m_LastPagePos = m_ShowBuf.m_nStartLine;
else
m_LastPagePos = -1;
if (m_MainWnd != NULL)
::SendMessage(m_MainWnd,READ_RETURN,(WPARAM)this,FALSE);
DestroyWindow();
}
else
::SendMessage(m_MainWnd,READ_FULLSCREEN,0,0);
break;
}
}
return 0;
}
void CReadBookWnd::EnableDelFavorite(UINT AddFlag,UINT DelFlag)
{
HMENU hMenu = (HMENU)SendMessage(m_hWndCB, SHCMBM_GETSUBMENU, 0, IDM_MENU);
EnableMenuItem(hMenu,IDM_DELETEFAVOR,DelFlag);
EnableMenuItem(hMenu,IDM_ADDTOFAVOR,AddFlag);
}
LRESULT CReadBookWnd::OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// TODO : Add Code for message handler. Call DefWindowProc if necessary.
if (m_RecentPage < m_TotalPage)
{
m_ShowBuf.m_nStartLine += m_ShowBuf.m_nMaxLinePerPage - 1 ;
m_ShowBuf.m_nEndLine = m_ShowBuf.m_nStartLine + m_ShowBuf.m_nMaxLinePerPage;
}
RedrawWindow();
GetPages();
return 0;
}
LRESULT CReadBookWnd::OnKeyDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// TODO : Add Code for message handler. Call DefWindowProc if necessary.
switch (wParam)
{
case VK_TUP:
{
if (m_ShowBuf.m_nStartLine > 0)
{
m_ShowBuf.m_nStartLine --;
m_ShowBuf.m_nEndLine -- ;
RedrawWindow();
GetPages();
}
break;
}
case VK_TDOWN:
{
if (m_ShowBuf.m_nStartLine < m_ShowBuf.m_pcLine.GetSize() - 1)
{
m_ShowBuf.m_nStartLine ++;
m_ShowBuf.m_nEndLine ++ ;
RedrawWindow();
GetPages();
}
break;
}
case VK_TLEFT:
{
if (m_ShowBuf.m_nStartLine == 0)
break;
if (m_ShowBuf.m_nStartLine - (m_ShowBuf.m_nMaxLinePerPage - 1) <= 0)
{
m_ShowBuf.m_nStartLine = 0;
m_ShowBuf.m_nEndLine = m_ShowBuf.m_nMaxLinePerPage;
RedrawWindow();
}
else
{
m_ShowBuf.m_nStartLine -= m_ShowBuf.m_nMaxLinePerPage -1;
m_ShowBuf.m_nEndLine -= m_ShowBuf.m_nMaxLinePerPage -1;
RedrawWindow();
}
GetPages();
break;
}
case VK_TRIGHT:
{
if (m_ShowBuf.m_nStartLine + m_ShowBuf.m_nMaxLinePerPage - 1 <= m_ShowBuf.m_pcLine.GetSize() - 1)
{
m_ShowBuf.m_nStartLine += m_ShowBuf.m_nMaxLinePerPage - 1;
m_ShowBuf.m_nEndLine = m_ShowBuf.m_nStartLine + m_ShowBuf.m_nMaxLinePerPage;
RedrawWindow();
GetPages();
}
else
{
m_ShowBuf.m_nStartLine = m_ShowBuf.m_pcLine.GetSize() - 1;
m_ShowBuf.m_nEndLine = m_ShowBuf.m_nStartLine + m_ShowBuf.m_nMaxLinePerPage;
RedrawWindow();
GetPages();
}
break;
}
case VK_RETURN:
{
KillTimer(1);
TBBUTTONINFO tbbi;
ZeroMemory(&tbbi,sizeof(tbbi));
tbbi.cbSize = sizeof(tbbi);
tbbi.dwMask = TBIF_TEXT;
CString SlideStr;
SlideStr.LoadString(IDS_READSLIDE);
tbbi.pszText = SlideStr.LockBuffer();
tbbi.cchText = SlideStr.GetLength();
SlideStr.UnlockBuffer();
SendMessage (m_hWndCB, TB_SETBUTTONINFO, IDM_ACTION, (LPARAM)&tbbi);
m_SlideFlag = FALSE;
if (m_FullScreenFlag)
{
if (m_Setting[6])
m_LastPagePos = m_ShowBuf.m_nStartLine;
else
m_LastPagePos = -1;
if (m_MainWnd != NULL)
::SendMessage(m_MainWnd,READ_RETURN,WPARAM(this),FALSE);
DestroyWindow();
}
}
}
return 0;
}
void CReadBookWnd::GetPages()
{
//get recent page
if (m_ShowBuf.m_nMaxLinePerPage == 0)
return;
// if (m_ShowBuf.m_nStartLine % (m_ShowBuf.m_nMaxLinePerPage - 1))
// m_RecentPage = m_ShowBuf.m_nStartLine / (m_ShowBuf.m_nMaxLinePerPage - 1) + 1;
// else
m_RecentPage = m_ShowBuf.m_nStartLine / (m_ShowBuf.m_nMaxLinePerPage - 1);
if (m_RecentPage > m_TotalPage - 1)
m_RecentPage = m_TotalPage - 1;
//set text of window
CString WindowTitle,TotalTitle;
WindowTitle.Format(_T(" %d / %d"),m_RecentPage + 1,m_TotalPage);
int strLen = 22 - WindowTitle.GetLength();
if (m_BookName.GetLength() > strLen)
TotalTitle.Format(_T("%s%s"),m_BookName.Left(strLen - 3) + _T("..."),WindowTitle);
else
{
for (int i = m_BookName.GetLength() ; i < strLen ; i++)
WindowTitle = _T(" ") + WindowTitle;
TotalTitle.Format(_T("%s%s"),m_BookName.Left(strLen),WindowTitle);
}
SetWindowText(TotalTitle);
}
LRESULT CReadBookWnd::OnHotKey(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
KillTimer(1);
TBBUTTONINFO tbbi;
ZeroMemory(&tbbi,sizeof(tbbi));
tbbi.cbSize = sizeof(tbbi);
tbbi.dwMask = TBIF_TEXT;
CString SlideStr;
SlideStr.LoadString(IDS_READSLIDE);
tbbi.pszText = SlideStr.LockBuffer();
tbbi.cchText = SlideStr.GetLength();
SlideStr.UnlockBuffer();
SendMessage (m_hWndCB, TB_SETBUTTONINFO, IDM_ACTION, (LPARAM)&tbbi);
m_SlideFlag = FALSE;
g_hWndLast = NULL;
if (m_Setting[6])
m_LastPagePos = m_ShowBuf.m_nStartLine;
else
m_LastPagePos = -1;
if (m_MainWnd != NULL)
{
if (!m_FullScreenFlag)
::SendMessage(m_MainWnd,READ_RETURN,(WPARAM)this,TRUE);
else
::SendMessage(m_MainWnd,READ_RETURN,(WPARAM)this,TRUE);
}
DestroyWindow();
return 0;
}
CString CReadBookWnd::GetSpecStr(CString TotalStr, LPCTSTR FindStr, BOOL RightFlag)
{
int Pos = 0, LastPos = 0;
CString LastStr;
LastStr.Empty();
while (1)
{
Pos = TotalStr.Find(FindStr,LastPos + 1);
if (Pos == -1)
break;
LastPos = Pos;
}
if (RightFlag)
LastStr = TotalStr.Mid(LastPos + 1);
else
LastStr = TotalStr.Left(LastPos);
return LastStr;
}
void CReadBookWnd::MoveMenuBar(BOOL VisibleFlag)
{
if (VisibleFlag)
::MoveWindow(m_hWndCB, 0, 200, 176, 20, TRUE);
else
::MoveWindow(m_hWndCB, 0, 220, 176, 20, TRUE);
}
LRESULT CReadBookWnd::OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// TODO : Add Code for message handler. Call DefWindowProc if necessary.
CPaintDC dc(m_hWnd);
if (m_ShowBuf.m_pcLine.GetSize == 0)
return 0;
//get rect
CRect rect;
GetClientRect(rect);
// set color
dc.FillSolidRect(rect,m_Colors[m_Setting[4]]);
dc.SetTextColor(m_Colors[m_Setting[3]]);
//set font type and font size
LOGFONT lf;
ZeroMemory(&lf,sizeof(lf));
CFontHandle ft = dc.GetCurrentFont();
if (ft)
ft.GetLogFont(&lf);
CString FontName;
UINT FontID = FONT1_TXT;
FontName.LoadString(FontID + m_Setting[2]);
lstrcpy(lf.lfFaceName, FontName);
lf.lfWeight = 500;
lf.lfHeight = m_Setting[1] * 2 + 18;
CFont NewFont;
NewFont.CreateFontIndirect(&lf);
HFONT OldFont = dc.SelectFont(NewFont.m_hFont);
//draw text
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
rect.bottom = tm.tmHeight;
rect.left += 5;
rect.right -= 5;
for(int i = m_ShowBuf.m_nStartLine;i < m_ShowBuf.m_nEndLine;i++)
{
if (i >= m_ShowBuf.m_pcLine.GetSize())
{
// m_ShowBuf.m_nEndLine = m_ShowBuf.m_pcLine.GetSize();
break;
}
CString strPos = m_ShowBuf.m_pcLine[i];
dc.DrawText(strPos,-1,rect,DT_LEFT|DT_WORDBREAK);
rect.top += tm.tmHeight;
rect.bottom += tm.tmHeight;
}
//delet font
NewFont.DeleteObject();
dc.SelectFont(OldFont);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -