DrawLineChars方法:
private void DrawLineChars(PaintEventArgs e, int firstChar, int lastChar, int
iLine, int iWordWrapLine, int
x,
int y)
{
Line
line =
lines[iLine];
LineInfo lineInfo =
LineInfos[iLine];
int from =
lineInfo.GetWordWrapStringStartPosition(iWordWrapLine);
int to = lineInfo.GetWordWrapStringFinishPosition(iWordWrapLine, line);
int startX
= x;
if
(startX <
LeftIndent)
firstChar++;
lastChar = Math.Min(to - from, lastChar);
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
//folded
block ?
if
(lineInfo.VisibleState ==
VisibleState.StartOfHiddenBlock)
{
//rendering by
FoldedBlockStyle
FoldedBlockStyle.Draw(e.Graphics, new Point(startX + firstChar * CharWidth,
y),
new Range(this, from + firstChar, iLine, from + lastChar + 1,
iLine));
}
else
{
//render by custom
styles
StyleIndex currentStyleIndex = StyleIndex.None;
int iLastFlushedChar = firstChar - 1;
int isChinaese = 0;
SizeF sizef = GetCharSize(new Font("宋体", 10), ‘中‘);
int len = (int)sizef.Width - CharWidth;
int nextLen = 0;
for (int iChar = firstChar; iChar <= lastChar; iChar++)
{
StyleIndex style = line[from + iChar].style;
if (IsChina(line[from + iChar].c))
{
isChinaese++;
}
if (currentStyleIndex != style)
{
FlushRendering(e.Graphics, currentStyleIndex,
new Point(startX + (iLastFlushedChar + 1) * CharWidth+nextLen,
y),
new Range(this, from + iLastFlushedChar + 1, iLine, from + iChar,
iLine));
iLastFlushedChar = iChar - 1;
currentStyleIndex = style;
if (isChinaese > 0)
{
nextLen = len * isChinaese;
}
}
}
FlushRendering(e.Graphics, currentStyleIndex, new Point(startX +
(iLastFlushedChar + 1) * CharWidth+nextLen, y),
new Range(this, from + iLastFlushedChar + 1, iLine, from + lastChar + 1,
iLine));
}
//draw
selection
if (!Selection.IsEmpty && lastChar >=
firstChar)
{
e.Graphics.SmoothingMode =
SmoothingMode.None;
var textRange = new Range(this, from + firstChar, iLine, from + lastChar + 1,
iLine);
textRange =
Selection.GetIntersectionWith(textRange);
if (textRange != null && SelectionStyle !=
null)
{
SelectionStyle.Draw(e.Graphics, new Point((startX + (textRange.Start.iChar -
from) * CharWidth) * 2,
y),
textRange);
}
}
}
//判断是否是中文
public bool IsChina(char c)
{
bool BoolValue = false;
if (Convert.ToInt32(c) <
Convert.ToInt32(Convert.ToChar(128)))
{
BoolValue = false;
}
else
{
return BoolValue = true;
}
return BoolValue;
}
//IME
mode
if
(range.tb.ImeAllowed)
for (int i = range.Start.iChar; i < range.End.iChar;
i++)
{
SizeF size = FastColoredTextBox.GetCharSize(f,
line[i].c);
var gs =
gr.Save();
//float k = size.Width>range.tb.CharWidth + 1?range.tb.CharWidth /
size.Width:1;
//gr.TranslateTransform(x,
y+(1-k)*range.tb.CharHeight/2);
//gr.ScaleTransform(k,
(float)Math.Sqrt(k));
//gr.DrawString(line[i].c.ToString(), f, ForeBrush, 0, 0,
stringFormat);
//gr.Restore(gs);
if(size.Width>range.tb.CharWidth*1.5f)
gr.DrawString(line[i].c.ToString(), f, ForeBrush, x, y+range.tb.CharHeight/4,
stringFormat);
else
gr.DrawString(line[i].c.ToString(), f, ForeBrush, x, y,
stringFormat);
if
(IsChina(line[i].c))
{
x +=
size.Width;
}
else
{
x +=
dx;
}
}