/// <summary> /// 获取字符串排版时截断到下一行的位置 /// </summary> /// <param name="aText"></param> /// <param name="aBreakRough">是否粗暴截断</param> /// <param name="aPos">在第X个后面断开 X > 0</param> private void FindLineBreak(string aText, bool aBreakRough, int aStartPos, ref int aPos) { GetHeadTailBreak(aText, ref aPos); // 根据行首、尾的约束条件找APos不符合时应该在哪一个位置并重新赋值给APos if (aPos < 1) { return; } if (aBreakRough) { return; } CharType vPosCharType = HC.GetUnicodeCharType((ushort)(aText[aPos - 1])); // 当前类型 CharType vNextCharType = HC.GetUnicodeCharType((ushort)(aText[aPos + 1 - 1])); // 下一个字符类型 if (MatchBreak(vPosCharType, vNextCharType, aText, aPos + 1) != BreakPosition.jbpPrev) // 不能在当前截断,当前往前找截断 { if (vPosCharType != CharType.jctBreak) { bool vFindBreak = false; CharType vPrevCharType; for (int i = aPos - 1; i >= aStartPos; i--) { vPrevCharType = HC.GetUnicodeCharType((ushort)(aText[i - 1])); if (MatchBreak(vPrevCharType, vPosCharType, aText, i + 1) == BreakPosition.jbpPrev) { aPos = i; vFindBreak = true; break; } vPosCharType = vPrevCharType; } if (!vFindBreak) // 没找到 { aPos = 0; } } } }