拿来讨好女朋友的东西,方便她读电子书的……因为网上下载的电子书有时会用硬回车分割成等长的若干行,放到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对话框: