【MergePara】电子书段落合并小工具

拿来讨好女朋友的东西,方便她读电子书的……因为网上下载的电子书有时会用硬回车分割成等长的若干行,放到Kindle或手机中排版很不美观,就做了这东西。本来打算把整篇文件转换的功能加进去的,但她说不需要,于是就这样了(当然加进去毫不为难,已经有按段保存的功能了,只要加个读文件的功能即可)。



界面就是上图这样。最小字符数和最大字符数分别为IDC_MIN和IDC_MAX,通过OnEnChange更新两个全局变量maxLen和minLen。第一个edit control名为IDC_INBOX,设置了Multiline和Want Return属性;第二个为IDC_OUTBOX,设置了Multiline、Want Return和Readonly属性。
单击“转换”按钮(IDC_BN_CONVERT),就会将IDC_INBOX的内容读入一个CString对象中,然后调用RemoveEnters函数处理之。
单击“清空”按钮(IDC_BN_CLEAR),调用SetWindowTextW清空两个edit control。
RemoveEnters函数如下:

void RemoveEnters (CString & intext)
{
       int currLoc =0, prevLoc=0, sublen, totalLen ;
       if((totalLen =intext. GetLength()) < minLen )
             return;

       while(currLoc < totalLen && prevLoc < totalLen && (currLoc=intext .Find( _T("\r" ), prevLoc)) != -1)
      {
             sublen=currLoc -prevLoc;
             if(sublen >= minLen && sublen <= maxLen )
                   if(!ispunct (intext[ currLoc-1]))
                  {
                         intext.Delete (currLoc, 2);
                         prevLoc=currLoc ;
                         continue;
                  }
                   prevLoc=currLoc +2;
      }
}



具体说来就是通过查找"\r\n"这个换行子串——其实是查找'\r',然后判断它与上一个'\r'的距离,若落在设定的范围内,则进一步判断它前面是否有标点,若没有,则将它视为一个断行硬回车,删除它和紧随其后的'\n'。
“开始自动保存”按钮会打开一个另存为对话框,之后每一次转换结果以append模式写入设定好的txt文件。
“复制到剪贴板”是在茶白要求下添加的功能,一开始不能处理Unicode字符,修改之后可以了。这应该是一个通用的剪贴板程序段,代码如下:

void CMergeParaDlg ::OnBnClickedBnToclip()
{
       // TODO: Add your control notification handler code here
       CString source ;
       GetDlgItem(IDC_OUTBOX )->GetWindowTextW( source);
       if(OpenClipboard ())
      {
             HGLOBAL clipBuffer ;
             EmptyClipboard();
#ifdef _UNICODE           //复制Unicode字符串到剪贴板
             wchar_t * buffer ;
             clipBuffer = GlobalAlloc (GMEM_DDESHARE, 2 * lstrlen(source) + sizeof(wchar_t ));
             buffer = (wchar_t *)GlobalLock( clipBuffer);
             wcscpy(buffer,source);
             GlobalUnlock(clipBuffer );
             SetClipboardData(CF_UNICODETEXT ,clipBuffer);
#else                    //复制ANSI字符串到剪贴板
             char *pbuff;
            clipBuffer = GlobalAlloc(GMEM_DDESHARE ,source. GetLength()+1);
             pbuff = (char *)GlobalLock(clipBuffer);
             strcpy(pbuff ,LPCSTR(source));
             GlobalUnlock(clipBuffer);
             SetClipboardData(CF_TEXT,clipBuffer);
#endif
             CloseClipboard();
      }
}


至于“自动检测”是一时兴起加上的,说起来丝毫不复杂,就是打开这样一个对话框然后自动检测样本文字的行长度而已。



最后秀一下恩爱~About对话框:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值