public LogicalCharacterAttribute GetLogicalCharacterAttribute(int char_index) { int line_index = GetLineIndexFromCharacterIndex(char_index); if (line_index == -1) { return(LogicalCharacterAttribute.None); } int char_in_line = char_index - lines_info[line_index].CharFirst; LogicalCharacterAttribute ret = lines_info[line_index].GetLogicalAttribute(char_in_line); return(ret); }
public void PrepareLayout(IntPtr hdc, IntPtr char_buffer, int max_char_len, int max_width) { ssa_struct_ptr = NativeScript.ScriptStringAnalyseCall (hdc, char_buffer, max_char_len, max_width, tab_def); //сколько поместилось int chars_clipped = NativeScript.GetPcOutChars(ssa_struct_ptr); //просматриваем с конца для поиска разрыва линии IntPtr attr_buffer = NativeScript.ScriptString_pLogAttr(ssa_struct_ptr); int line_break_ind = -1; //если вся строка уместилась в линию if (chars_clipped == max_char_len) { line_break_ind = chars_clipped - 1; } //если вся строка не уместилась, ищем крайний с конца SoftBreak if (line_break_ind == -1) { LogicalCharacterAttribute attr = LogicalCharacterAttribute.None; for (int i = chars_clipped - 1; i > 0; i--) { attr = NativeScript.GetCharacterAttribute(attr_buffer, i); if ((attr & LogicalCharacterAttribute.SoftBreak) == LogicalCharacterAttribute.SoftBreak) { line_break_ind = i - 1; break; } } } //если и softBreak не найден, рвем по умещению if (line_break_ind == -1) { line_break_ind = chars_clipped - 1; } //если разрываем, вторично вызываем обссчет с новой длиной строки if (line_break_ind + 1 != max_char_len) { //освобождаем предыдущий ssa_sctuct_ptr int res3 = NativeScript.ScriptStringFree(ref ssa_struct_ptr); if (res3 != 0) { Marshal.ThrowExceptionForHR(res3); } //и обновляем ssa_struct_ptr = NativeScript.ScriptStringAnalyseCall (hdc, char_buffer, line_break_ind + 1, tab_def); } //debug //string actual_string = Marshal.PtrToStringAuto(char_buffer, line_break_ind + 1); //char[] actual_chars = actual_string.ToCharArray(); //заполняем свойства Extent = NativeScript.GetScriptStringExtent(ssa_struct_ptr); CharLength = line_break_ind + 1; //debug //if (Extent.Width == 0) //{ // int debug = 0; //} }