目录
这是我历经十来年,一直坚持开发的一个软件,可以把网络上的公版TXT小说,直接转换为本地藏书,并提供多种阅读、听书方式,目前已经比较完善了。
一、有声小说书屋软件功能
1、界面介绍
左侧是树形列表, 代表着书籍、章节
右侧是显示, 显示章节内容
2、听书功能
1)点击上册工具栏的 喇叭,可实现听书功能,
使用的是微软的TTS技术,不过目前的TTS 还是很机械声,听书效果一般
2)生成网页,借助 edge浏览器的听书功能
左侧,树形列表中,选中某本书,然后右键点击 出现菜单
选择生成本地网站
这样就生成 本地网页版
默认edge浏览器打开,
右键 选择 大声朗读功能, 即可用比较好的自然语音 阅读
3、 扩展书屋
首先,在竖形列表中,选中一个目录,比如四大名著,然后将TXT格式小说或epub格式小说,拖入到左侧竖形列表中,就可以自动往书屋中,添加新书了。
二、所用技术介绍
总体框架使用的VC的 SDI 单文档程序 框架
1、导入小说,自动分章节功能
这里使用线程才实现导入分章节模块
//导入小说线程
UINT ImportXiaoshuoThread(LPVOID parm)
{
CMainFrame *pMainFrm=m_XiaoshuoParam.pFram;
CImportTreeView *pView=m_XiaoshuoParam.pView;
CTreeCtrl &nTreeCtrl=*m_XiaoshuoParam.pTreeCtrl;
pMainFrm->beginImport(m_XiaoshuoParam.pFram,m_XiaoshuoParam.hDrop,m_XiaoshuoParam.pView,m_XiaoshuoParam.pImportView,nTreeCtrl,m_XiaoshuoParam.hItem);
return 1;
}
AfxBeginThread(ImportXiaoshuoThread,NULL);
1)、epub格式小说
对于epub格式,有专门的处理方式,网上有个好像是华为的epub格式库,借鉴它的方法进行解析的
2)、txt格式小说
这是使用最广的格式了,
解析的策略是,读取小说,然后按照 关键字进行章节的划分,如:章、回、节、卷等,实在没有找到关键字的,则按字数划分
2、显示技术
派生 CScrollView 类,实现自己的显示视图界面。
按照BODY、 段落 、行、字,进行数据结构设计, 然后进行显示算法设计等
3、XML存储技术
导入后的小说章节,采用XML格式进行存储。
网上有开源的XML读写类,可以使用
4、本地网站技术
先使用VUE,打造本地网站
客户端生成网站,实际上就是写文件
void CMyView::ToGenMyHtml()
{
CString htmlStr;
htmlStr=L"<html lang=\"zh-cn\">\n\
<head>\n\
<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">\n\
<title>古典小说-听小说</title>\n\
<link rel=\"stylesheet\" href=\"HTML/js/element_lib/theme-chalk/index.css\">\n\
<link rel='stylesheet' href='http://gudianxiaoshuo.com/js/myCss/gudianxiaoshuo.css'>\n\
<script src=\"HTML/js/vue.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n\
";
CString jsFile;
if (pMain->BExistFile(L"gudian.txt"))
{
jsFile = L"<script type=\"text/javascript\" src=\"http://gudianxiaoshuo.com/js/myHeader_gudian.js\" charset=\"utf-8\"></script>\n";
}
else if (pMain->BExistFile(L"web.txt"))
{
jsFile = L"<script type=\"text/javascript\" src=\"http://gudianxiaoshuo.com/js/myHeader.js\" charset=\"utf-8\"></script>\n";
}
else{
jsFile = L"<script type=\"text/javascript\" src=\"http://gudianxiaoshuo.com/js/myHeader_yousheng.js\" charset=\"utf-8\"></script>\n";
}
jsFile += L"<script type=\"text/javascript\" src=\"http://gudianxiaoshuo.com/js/comp/comp_headBtns.js\" charset=\"utf-8\"></script>\n";
htmlStr += jsFile;
htmlStr += L"</head>\n";
CFile nFile_Save;
CString strFile=g_strPath+_T("听小说.html");
nFile_Save.Open(strFile,CFile::modeCreate|CFile::modeWrite);
WORD sign=0xfeff; //保存为UNICODE格式 否则的话 中文可能出现乱码
nFile_Save.Write(&sign,2);
nFile_Save.Write(htmlStr,htmlStr.GetLength()*2); // 直接将数据保存到文档中, ASCII 方式存储, 其中 ASC为0的 不显示 效果与空格相同,但ASC吗不同 空格为0x20
nFile_Save.Close();
g_curWebTitle = L"古典小说-听小说";
//ShellExecute(NULL,NULL,strFile,NULL,NULL,SW_NORMAL);
OpenUrlWithEdge(strFile.GetBuffer());
strFile.ReleaseBuffer();
}