|
楼主 |
发表于 2009-3-4 15:18:52
|
显示全部楼层
Post by onelay;1955839
全英文也只能最多显示歌词显示区域的一半,右边一半什么都不显示好可惜。
左边和右边图为同一歌词的相同显示部分。只能显示一半的歌词显示区域,如果把令一半利用起来就完美了。
最近有点懒如果容易解决的话希望作者在升级版本时修改下,麻烦的话有时间的话我去读下代码。
谢谢作者的软件,希望它越来越完美!!!
修改了一下以下函数。版本出得比较晚,所以你可以自己看看。
void CUIMgr:rintLrc(const char* lpszStr)
{
std::string str = lpszStr;
size_t nPos = 0;
size_t nStart = 0;
size_t nLen = 0;
int nLine = 3;
size_t nPrintWid = m_nCOLS-STD_WID-4;
int nOffset = 0;
int nMid = (m_nLINES-8)/2; // in fact the index. base 0.
int nCnt1 = 0;
int nCnt2 = 0;
int nSize = strlen(lpszStr);
wchar_t* wcs = new wchar_t[nSize];
memset(wcs, 0, nSize*sizeof(wchar_t));
mbstowcs(wcs, lpszStr, nSize-1);
std::wstring wstr(wcs);
delete[] wcs;
#ifndef HAVE_MVWADDWSTR
char* cs = new char[nSize*2];
#endif
double fPatch = 1.0f;
size_t nPatchLen = 0;
while ((nPos=wstr.find(L'\n', nStart))!=std::wstring::npos && nLine <= m_nLINES-6)
{
nCnt1++;
nLen = nPos - nStart;
// patch begin
fPatch = 1;
if (nLen > 0)
{
char* cs2 = new char[nLen*2];
std::wstring wstr2 = wstr.substr(nStart,nLen);
wcstombs(cs2,wstr2.c_str(),nLen*2);
if (strlen(cs2) != wstr2.length())
{
fPatch = ((double)wstr2.length())/((double)strlen(cs2));
}
delete []cs2;
}
nPatchLen = (size_t)(((double)nPrintWid)*fPatch);
// patch end
if (nLen > nPatchLen)
{
nLen = nPatchLen;
wstr.insert(nStart + nLen, L"\n");
nPos = nStart + nLen;
nCnt2++;
if (nCnt1-nCnt2<nMid)
{
nOffset ++;
}
}
mvwhline(m_wins[3],nLine, 1, ' ', m_nCOLS-STD_WID-4);
if (nLen > 0)
{
#ifndef HAVE_MVWADDWSTR
memset(cs,0,nSize*2);
wcstombs(cs,wstr.substr(nStart,nLen).c_str(),nSize*2);
mvwaddstr(m_wins[3], nLine, 1, cs);
#else
mvwaddwstr(m_wins[3], nLine, 1, wstr.substr(nStart,nLen).c_str());
#endif
}
nLine ++;
nStart = nPos+1;
}
#ifndef HAVE_MVWADDWSTR
delete []cs;
#endif
#ifndef _WITHOUT_REVERSE
mvwchgat(m_wins[3],nMid+3+nOffset,1,m_nCOLS-STD_WID-4, A_REVERSE, 0, NULL);
#endif
wrefresh(m_wins[3]);
}
种处理也是有BUG的,问题就在于这种方法是假定中英文平均分布的情况下的。如果是以下歌词,问题还会有一点点,但多少比当初好多了。
[00:00.00]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRST
[00:10.00]一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十
[00:15.00]一二三四五ABCDEFGHIJKLMNOPQRSTUVWXYZOPQRSTUVWXYZ
[00:20.00]ABCDEFGHIJKLMNOPQRSTUVWXYZ一二三四五六七八九十一 |
|