由于老大又给我下了任务 时间很紧 又想记录下自己写的第一个真正的Symbian代码 希望能帮到大家 程序还是很弱 也不健壮 海涵
<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} -->
void CMyTextShowAppView::Draw ( const TRect & aRect) const
{
TBuf16 <800> iRealText ; // 测试内容
TBuf16 <400> iShowText; // 显示当前内容
iRealText = _L ( "ARMV5 builds give the best performance and smallest code compared to "
"other alternatives, and are typically used primarily for ROM builds. "
"The compiler is not distributed as part of the SDK: it can be obtained "
"as part of the RealView Developer Suite 2.2 from ARM (http://www.arm.com/)." );
iRealText. Append ( ' ' ); // 格式需要,通过空格来结束
_LIT ( KFontName, "Sans MT 936_S60" ); // 定义 Font 的名称
TInt KTextHight = 150; // 定义字体的大小
TInt KLineHight = 20; // 配合上面的定义大小
TInt KLineWidth = aRect. Width (); // 获得当前设备屏幕的宽
TInt KSpaceWidth = 4; // 当前设备空格的像素 ** 此处最好有函数得到 **
/*========================================================================================*/
TInt iNowWidth = 0; // 目前显示的宽剩余量
TInt iStoreNextBegin = 0; // 记录下次开始的位子
TInt iStoreNowEnd = 0; // 记录当前结束的
TInt iStoreNowBegin = 0; // 记录本行开始的字符
TBool iNewLine = ETrue ; // 标志是否是新的一行
TInt iLineNum = 0; // 记录显示的行数
TInt spaceArray[16]; // 记录每行的空格数,用于空格间距调整
TInt iSpaceNum = 0; // 记录单行空格数
// Get the standard graphics context
CWindowGc & gc = SystemGc ();
// Gets the control's extent
TRect drawRect(aRect);
// Clears the screen
gc. Clear (drawRect);
// 设置并运用字体
CFont *iFont;
iCoeEnv -> ScreenDevice ()-> GetNearestFontInTwips (iFont, TFontSpec (KFontName,KTextHight)); // 按要求设置字体
gc. UseFont (iFont);
/*
* 文本要求,没有中文,没有连续空格,单个字符快(空格分隔)不能超过 30
* 判断是否是新的一行开始
* 是 :: 得到上次遗留字符的像素需求
* 需要更新剩余显示的宽度
* 设置新的一行开始标志
* 得到新的一行开始的位置
* 获得一个新的字符
* 判断是空格?是 :: 把空格的 I 变量记录为这行的结束,结束空格直接输出,循环完毕
* 判断是换行?是 :: 设置新行 把 I - 1 位置的记录为本行结束 , 并把 I 的下个位置认为是下一行的开始
*/
for ( TInt i = 0;i != iRealText. Length (); ++i)
{
if (iNewLine)
{
iSpaceNum = 0;
TPtrC16 tempPtr(iRealText. Ptr ()+ iStoreNextBegin,i - iStoreNextBegin); // 获得上次遗留字符
TInt iRemainderWidth = iFont-> TextWidthInPixels (tempPtr);
iNowWidth = KLineWidth - iRemainderWidth;
iNewLine = EFalse ;
iStoreNowBegin = iStoreNextBegin; // 上次循环记录的 Begin 赋值
}
TPtrC16 ptr(iRealText. Ptr ()+ i,1); // 获得 Text 中的一个字符
if (*(iRealText. Ptr ()+ i) == ' ' )
{
iStoreNowEnd = i; // 记录空格
spaceArray[++iSpaceNum] = i; //0 单元不使用, Num 直接是本行空格数
if (i + 1 == iRealText. Length ())
{
gc. SetPenColor ( TRgb (0x008eff)); // 改变颜色
gc. SetUnderlineStyle ( EUnderlineOn ); // 添加下划线,显示网址
iNewLine = ETrue ;
}
}
else if ((*(iRealText. Ptr ()+ i) == '/n' )) //|| (*(iRealText.Ptr()+ i) == '#'))
{
iNewLine = ETrue ;
iStoreNowEnd = i-1;
iStoreNextBegin = i + 1;
}
if (!iNewLine) // 如果上文得到是换行,无需再计算,直接输出
{
TInt iCharWidth = iFont-> TextWidthInPixels (ptr);
iNowWidth -=iCharWidth; // 减去当前的像素需求
if (iNowWidth < 0) // 本行无法满足需求
{
if (iStoreNowEnd - iStoreNowBegin == 0)
iStoreNowEnd = i-1;
iStoreNextBegin = iStoreNowEnd + 1; // 记录本单词的开始位置
/*
* 判断是否需要拉伸操作
*/
if (iSpaceNum > 4) // 空格也大于 5 的时候 才开始调整
{
TPtrC16 iRemainderPtr(iRealText. Ptr ()+ iStoreNowEnd,i - iStoreNowEnd);
TInt iRemainderWidth = iFont-> TextWidthInPixels (iRemainderPtr); // 显示这一行 没有拉伸操作时不须恢复记录
if (iRemainderWidth > 16) // 当剩余的宽度大于 16
{
// 下面的数据减一是为了显示的时候不会太挤
TInt adjustSpaceWidth = (iSpaceNum * KSpaceWidth + iRemainderWidth)/(iSpaceNum - 1) - 1;
TInt tempPtrWidth = 0; // 当前显示段字符的像素
for ( TInt i = 0; i < iSpaceNum; i++)
{
TPtrC16 tempPtr(iRealText. Ptr ()+ iStoreNowBegin,spaceArray[i + 1] - iStoreNowBegin);
iShowText. Append (tempPtr);
gc. DrawText (iShowText, TPoint ( Rect (). iTl . iX + tempPtrWidth + i * adjustSpaceWidth, Rect (). iTl . iY + KLineHight + KLineHight * iLineNum)); // 打印
iShowText. Zero (); // 清空
tempPtrWidth += iFont-> TextWidthInPixels (tempPtr);
iStoreNowBegin = spaceArray[i + 1] + 1; // 下次打印的开始是本次空格的后个位置
}
iNewLine = ETrue ;
++iLineNum;
continue ; // 打印完毕,不要做下次处理
}
}
iNewLine = ETrue ; // 开始打印
}
}
if (iNewLine)
{
TPtrC16 tempPtr(iRealText. Ptr ()+ iStoreNowBegin,iStoreNowEnd - iStoreNowBegin + 1); // 得到本行的开始于长度数据
iShowText. Append (tempPtr);
gc. DrawText (iShowText, TPoint ( Rect (). iTl . iX , Rect (). iTl . iY + KLineHight + KLineHight * iLineNum)); // 打印
iShowText. Zero (); // 清空
++iLineNum; // 行数加 为接下来的打印做准备
}
}
gc. DiscardFont (); // 释放 font
}