Ejemplo n.º 1
0
        /// <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;
                    }
                }
            }
        }