📄 kingbookdoc.cpp
字号:
// GUI/KingBookDoc.cpp : CKingBookDoc 类的实现
//
#include "stdafx.h"
#include "KingBook.h"
#include "KingBookDoc.h"
#include "KingBookDialog.h"
#include "AddbatDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CKingBookDoc
IMPLEMENT_DYNCREATE(CKingBookDoc, CDocument)
BEGIN_MESSAGE_MAP(CKingBookDoc, CDocument)
ON_COMMAND(IDM_OPEN_BOOK, &CKingBookDoc::OnOpenBook)
ON_COMMAND(IDM_EDIT_BOOK, &CKingBookDoc::OnEditBook)
ON_COMMAND(IDM_ADD_BOOK, &CKingBookDoc::OnAddBook)
ON_COMMAND(IDM_EDIT_BOOKCLASS, &CKingBookDoc::OnEditBookclass)
ON_COMMAND(IDM_ADD_SUB_BOOKCLASS, &CKingBookDoc::OnAddSubBookclass)
ON_COMMAND(IDM_DELETE_BOOK, &CKingBookDoc::OnDeleteBook)
ON_COMMAND(IDM_DELETE_BOOKCLASS, &CKingBookDoc::OnDeleteBookclass)
ON_COMMAND(IDM_ADDTO_FAVORITE, &CKingBookDoc::OnAddtoFavorite)
ON_COMMAND(IDM_DELFROM_FAVORITE, &CKingBookDoc::OnDelfromFavorite)
ON_COMMAND(IDM_ADD_BATCH_BOOK, &CKingBookDoc::OnAddBatchBook)
END_MESSAGE_MAP()
// CKingBookDoc 构造/析构
/// <summary>文档类的默认构造函数</summary>
/// <exception>NULL</exception>
/// <remarks>加载图书数据的XML文档.
/// </remarks>
CKingBookDoc::CKingBookDoc()
{
try{
// 加载数据文件
this->bookLib.Load(((CKingBookApp*)AfxGetApp())->GetBookXml());
}
catch(Library::KXmlFileException& e)
{
AfxMessageBox(e.what());
}
this->SetTitle(_T("Kingbook 电子图书管理"));
}
CKingBookDoc::~CKingBookDoc()
{
}
BOOL CKingBookDoc::OnNewDocument()
{
return TRUE;
//if (!CDocument::OnNewDocument())
// return FALSE;
/// / TODO: 在此添加重新初始化代码
/// / (SDI 文档将重用该文档)
//return TRUE;
}
/// <stdname>
/// int CKingBookDoc::SetShownBookClass(const std::string& classID)
/// </stdname>
/// <summary>在TreeView中选中这个分类(ID), 将在ListView中显示这个分类的图书.通知文档类.</summary>
/// <param name="classID">图书分类的ID</param>
/// <returns>成功返回0.</returns>
/// <exception>NULL</exception>
/// <remarks>一个Set函数</remarks>
int CKingBookDoc::SetShownBookClass(const std::string& classID)
{
this->m_strShownBookClass = classID;
return 0;
}
/// <stdname>
/// const std::string& CKingBookDoc::GetShownBookClass() const
/// </stdname>
/// <summary>得到TreeView中选中的图书分类, ListView中显示这个分类的图书</summary>
/// <returns>返回分类的ID</returns>
/// <exception>NULL</exception>
/// <remarks>Get方法</remarks>
const std::string& CKingBookDoc::GetShownBookClass() const
{
return this->m_strShownBookClass;
}
/// <summary>在ListView里选中bookID这本图书.通知文档类</summary>
/// <param name="bookID">图书的ID</param>
/// <returns>成功返回0</returns>
/// <exception>NULL</exception>
/// <remarks>Set方法</remarks>
int CKingBookDoc::SetShownBook(const std::string& bookID)
{
this->m_strShownBook = bookID;
return 0;
}
/// <summary>得到ListView中选中的图书的ID。</summary>
/// <returns>返回图书的ID</returns>
/// <exception>NULL</exception>
/// <remarks>Get方法</remarks>
const std::string& CKingBookDoc::GetShownBook() const
{
return this->m_strShownBook;
}
/// <summary>打开图书ListView中选中的图书</summary>
/// <returns>成功返回0。</returns>
/// <exception>NULL</exception>
/// <remarks>两种打开方式:以"Http"开头的URL使用IE打开; 其他有OS决定使用相应的应用程序打开.
/// </remarks>
int CKingBookDoc::OpenBook()
{
try{
Library::Book tmpBook(this->m_strShownBook);
this->bookLib.GetBookInfo(tmpBook, tmpBook);
CString url = tmpBook.GetURL().c_str();
url = url.TrimLeft(_T(" "));
// TODO Http开头的URL
if(url.MakeLower().Find(_T("http")) == 0)
{
// 使用IE打开
ShellExecute(NULL, "open", "iexplore.exe", url, NULL, SW_SHOWNORMAL);
}
else
{
ShellExecute(NULL, "open", url, NULL, NULL, SW_SHOWNORMAL);
}
//
this->bookLib.OnOpenBook(this->m_strShownBook);
}
catch(Library::KXmlFileException& e)
{
AfxMessageBox(e.what());
}
return 0;
}
/// <summary>使用这本书的一个URL打开</summary>
/// <summary>使用一本书的一个URL打开, 这本图书已经在ListView中选中.</summary>
/// <param name="url">图书的一个URL</param>
/// <returns>成功返回0</returns>
/// <exception>NULL</exception>
/// <remarks>一本图书可以有多个URL, 这些URL只会显示在InfoView(htmlView)中, 在InfoView中
/// 点击这些链接,将调用这个函数.<br/>
/// 两种打开方式:以"Http"开头的URL使用IE打开; 其他有OS决定使用相应的应用程序打开.
/// </remarks>
int CKingBookDoc::OpenBook(const CString& url)
{
try{
CString urlTmp = url;
urlTmp = urlTmp.TrimLeft(_T(" "));
// TODO Http开头的URL
if(urlTmp.MakeLower().Find(_T("http")) == 0)
{
// 使用IE打开
ShellExecute(NULL, "open", "iexplore.exe", urlTmp, NULL, SW_SHOWNORMAL);
}
else
{
ShellExecute(NULL, "open", urlTmp, NULL, NULL, SW_SHOWNORMAL);
}
//
this->bookLib.OnOpenBook(this->m_strShownBook);
}
catch(Library::KXmlFileException& e)
{
AfxMessageBox(e.what());
}
return 0;
}
// CKingBookDoc 序列化
void CKingBookDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: 在此添加存储代码
}
else
{
// TODO: 在此添加加载代码
}
}
// CKingBookDoc 诊断
#ifdef _DEBUG
void CKingBookDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CKingBookDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
// CKingBookDoc 命令
/// <summary>响应打开图书事件</summary>
/// <returns>void</returns>
/// <remarks>使用图书的首要链接,打开图书;更新所有视图, 因为图书的打开次数发生变化.</remarks>
void CKingBookDoc::OnOpenBook()
{
this->OpenBook();
// 频率发生了变化, 更新视图
this->UpdateAllViews(NULL, IDUP_DOC_BOOK);
}
/// <remarks>调用CreateBookInfoFile()以使InfoView能够显示最新内容。</remarks>
/// <summary>响应编辑图书信息事件</summary>
/// <returns>void</returns>
/// <exception>NULL</exception>
/// <remarks>显示图书信息对话框;修改图书的信息; 调用CreateBookInfoFile(),产生新的图书信息文件;
/// 更新所有视图, 图书的信息发生变化
/// </remarks>
/// <seealso cref="CBookInfoDlg">CBookInfoDlg图书信息对话框</seealso>
/// <seealso cref="CKingBookDoc::CreateBookInfoFile">CKingBookDoc::CreateBookInfoFile 产生图书信息文件</seealso>
void CKingBookDoc::OnEditBook()
{
// 编辑前的图书信息存放在这个变量里
Library::Book bookOldInfo;
this->bookLib.GetBookInfo(Library::BookObject(this->m_strShownBook), bookOldInfo);
CBookInfoDlg infoDlg(_T("编辑图书信息"), bookOldInfo);
if( infoDlg.DoModal() == IDOK) // 确定 修改
{
// 编辑后的图书信息存放在这个变量里
Library::Book bookNewInfo = infoDlg.GetBookInfo();
try{
this->bookLib.ModifyBookInfo(bookOldInfo, bookNewInfo);
this->bookLib.Save();
this->CreateBookInfoFile(bookNewInfo.GetID(), true);
// 更新视图
this->UpdateAllViews(NULL, IDUP_DOC_BOOK);
}
catch(Library::KXmlFileException &e)
{
AfxMessageBox(e.what());
}
}
}
/// <remarks>调用CreateBookInfoFile()以使InfoView能够显示最新内容。</remarks>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -