在Openoffice Writer状态栏上显示输入焦点所在行列
2010-01-20 16:04:55| 分类:
openoffice
| 标签:
|举报
|字号大中小 订阅
1. 计算行号
首先在SwEditShell里获得当前光标所在的TxtFrm对象指针和光标偏移量:
[code]
SwPaM *pCrsr = GetCrsr(); // 得到当前位置
SwPosition *pPos = pCrsr->GetPoint(); // 得到当前光标位置
SwTxtNode* pTNd = pPos->nNode.GetNode().GetTxtNode(); // 获得光标位置的TxtNode
SwTxtFrm* pFrm = ( SwTxtFrm* )pTNd->GetFrm(); // 获得TxtNode对应的TxtFrm
xub_StrLen nCurNd = pPos->nContent.GetIndex(); // 光标偏移量
[/code]
然后通过SwTxtFrm类中的成员变量nAllLines、nThisLines和成员函数GetLineCount( xub_StrLen nPos ),nAllLines表示从文档开始到该TxtFrm一共有多少行,nThisLines表示该TxtFrm包含多少行,GetLineCount( xub_StrLen nPos )函数能获得光标偏移量(由nPos指定)所在行数。所以nAllLines - nThisLines + GetLineCount(nPos) 就是当前焦点所在行号了。
[code]
UINT32 SwTxtFrm::CurrLineNumber( xub_StrLen nPos )
{
UINT32 nLineNr = 0;
if ( IsInDocBody() )
{
GetFormatted();
nLineNr = GetAllLines() - GetThisLines() + GetLineCount( nPos );
}
return nLineNr;
}
[/code]
2. 计算列号
先获得光标偏移量,如果段落仅有一行,光标偏移量就是列号,如果多于一行,就用一个小算法得到列号:将光标偏移量作减一操作,同时将列数(初值为0)作加一操作,直得当初的光标偏移量所在行与当前光标偏移量所在行不是同一行为止,此时的列数值就是要计算的列号(也许有更好的计算列数的方法)。
[code]
UINT32 SwTxtFrm::CurrColumnNumber( xub_StrLen nPos )
{
UINT32 nColumnNr = 0;
if ( IsInDocBody() )
{
if (GetLineCount(0) == GetLineCount( nPos ))
{
nColumnNr = nPos + 1;
}
else
{
USHORT nOriLine = GetLineCount( nPos );
while(nOriLine == GetLineCount( nPos ) && nPos > 0)
{
nPos--;
nColumnNr++;
}
}
}
return nColumnNr;
}
[/code]
评论这张
转发至微博
转发至微博
评论