Beispiel #1
0
            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;
                //}
            }