www.pudn.com > PhoneReaderSrc.rar > 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; 
}