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

📄 readbookwnd.cpp

📁 Smartphone手机阅读软件
💻 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 + -