今天再次研究了一下CEikEdwin的输入法状态。总结了一下代码。
inputImage是输入法状态。shiftImage是Shift状态。
void CQGEditBox::DrawInputMethodIndicator(const TRect& aRect)
{
MAknEditingStateIndicator* editingState = CAknEnv::Static()->EditingStateIndicator();
if (!editingState)
return;
CAknIndicatorContainer* indicator = editingState->IndicatorContainer();
if (!indicator)
return;
TInt inputImage = -1;
if(indicator->IndicatorState(S_uid(EAknNaviPaneEditorIndicatorPinyin)))
{
inputImage = iImage_input[0];
}
else if(indicator->IndicatorState(S_uid(EAknNaviPaneEditorIndicatorStroke)))
{
inputImage = iImage_input[1];
}
else if(indicator->IndicatorState(S_uid(EAknNaviPaneEditorIndicatorUpperCase)) ||
indicator->IndicatorState(S_uid(EAknNaviPaneEditorIndicatorUpperCaseSelect)) ||
indicator->IndicatorState(S_uid(EAknNaviPaneEditorIndicatorQwertyShift)))
{
inputImage = iImage_input[2];
}
else if(indicator->IndicatorState(S_uid(EAknNaviPaneEditorIndicatorTextCase)) ||
indicator->IndicatorState(S_uid(EAknNaviPaneEditorIndicatorTextCaseSelect)))
{
inputImage = iImage_input[3];
}
else if(indicator->IndicatorState(S_uid(EAknNaviPaneEditorIndicatorLowerCase)) ||
indicator->IndicatorState(S_uid(EAknNaviPaneEditorIndicatorLowerCaseSelect)))
{
inputImage = iImage_input[4];
}
else if(indicator->IndicatorState(S_uid(EAknNaviPaneEditorIndicatorNumberCase)) ||
indicator->IndicatorState(S_uid(EAknNaviPaneEditorIndicatorNumberCaseSelect)))
{
inputImage = iImage_input[5];
}
TInt shiftImage = -1;
if(indicator->IndicatorState(S_uid(111)))
{
shiftImage = iImage_shift[0];
}
else if(indicator->IndicatorState(S_uid(112)))
{
shiftImage = iImage_shift[1];
}
TSize size = Graphics()->SurfaceSize(inputImage);
TPoint pos(aRect.iTl.iX, aRect.iTl.iY-size.iHeight);
Graphics()->DrawSurface(pos, inputImage);
pos.iX += size.iWidth;
Graphics()->DrawSurface(pos, shiftImage);
}
====================================================================================
Symbian设置CEikEdwin字体
先说第一种,它只适用于2nd
TCharFormat charFormat;
Mem::FillZ(&charFormat, sizeof (TCharFormat));
TCharFormatMask charMask;
Mem::FillZ(&charMask, sizeof (TCharFormatMask));
TFontSpec sFontSpec = PocoUtils::NormalFont()->FontSpecInTwips();
charFormat.iFontSpec.iTypeface = sFontSpec.iTypeface;
charMask.SetAttrib(EAttFontTypeface);
charFormat.iFontSpec.iHeight = sFontSpec.iHeight;
charMask.SetAttrib(EAttFontHeight);
charFormat.iFontPresentation.iTextColor = KDarkGreenColour;
charMask.SetAttrib(EAttColor);
charFormat.iFontPresentation.iStrikethrough = (TFontStrikethrough)EFalse;
charMask.SetAttrib(EAttFontStrikethrough);
charFormat.iFontPresentation.iUnderline = (TFontUnderline)EFalse;
charMask.SetAttrib(EAttFontUnderline);
CCharFormatLayer* FormatLayer1 = CCharFormatLayer::NewL(charFormat,charMask);
iTitle->SetCharFormatLayer(FormatLayer1);
再来介绍第二种,它使用于2nd和3rd
CFont* font=NULL;
#ifdef _UIQ3_SDK_
TFontSpec fontSpec=CEikonEnv::Static()->NormalFont()->FontSpecInTwips();
fontSpec.iHeight-=fontSpec.iHeight/4;
fontSpec.iFontStyle.SetPosture(EPostureUpright);
CEikonEnv::Static()->ScreenDevice()->GetNearestFontInTwips(font,fontSpec);
#else
font=CEikonEnv::Static()->NormalFont();
#endif
CGlobalText* globalText = (CGlobalText*)edwin->Text();
TCharFormat charFormat;
Mem::FillZ(&charFormat, sizeof (TCharFormat));
TCharFormatMask charMask;
Mem::FillZ(&charMask, sizeof (TCharFormatMask));
TFontSpec sFontSpec = font->FontSpecInTwips();
charFormat.iFontSpec.iTypeface = sFontSpec.iTypeface;
charMask.SetAttrib(EAttFontTypeface);
charFormat.iFontSpec.iHeight = sFontSpec.iHeight;
charMask.SetAttrib(EAttFontHeight);
charFormat.iFontPresentation.iTextColor = KDarkGreenColour;
charMask.SetAttrib(EAttColor);
globalText->ApplyCharFormatL(charFormat,charMask,0,edwin->TextLength());