Beispiel #1
0
        public string GetTextRange(int startPos, int endPos)
        {
            if (startPos > endPos)
            {
                return(String.Empty);
            }

            var rng = new InternalTextRange();

            rng.Range.Min = startPos;
            rng.Range.Max = endPos;
            var ptr = Marshal.AllocHGlobal(Marshal.SizeOf(rng));

            try
            {
                var ptr2 = Marshal.AllocHGlobal(endPos - startPos + 1);
                rng.Text = ptr2;

                try
                {
                    Marshal.StructureToPtr(rng, ptr, false);
                    Ref.Send(Sci.SCI_GETTEXTRANGE, Sci.NIL, (Int32)ptr);
                    var ret = (InternalTextRange)Marshal.PtrToStructure(ptr, typeof(InternalTextRange));
                    return(Marshal.PtrToStringAnsi(ret.Text));
                }
                finally
                {
                    Marshal.FreeHGlobal(ptr2);
                }
            }
            finally
            {
                Marshal.DestroyStructure(ptr, typeof(InternalTextRange));
            }
        }
Beispiel #2
0
        public string GetTextRangeUnicode(int startPos, int endPos)
        {
            if (startPos > endPos)
            {
                return(String.Empty);
            }

            if (endPos > Ref.Send(Sci.SCI_GETTEXTLENGTH) - 1)
            {
                endPos = Ref.Send(Sci.SCI_GETTEXTLENGTH);
            }

            var rng = new InternalTextRange();

            rng.Range.Min = startPos;
            rng.Range.Max = endPos;
            var ptr = Marshal.AllocHGlobal(Marshal.SizeOf(rng));

            try
            {
                var ptr2 = Marshal.AllocHGlobal(endPos - startPos + 1);
                rng.Text = ptr2;

                try
                {
                    Marshal.StructureToPtr(rng, ptr, false);
                    var len = Ref.Send(Sci.SCI_GETTEXTRANGE, Sci.NIL, (Int32)ptr);
                    var ret = (InternalTextRange)Marshal.PtrToStructure(ptr, typeof(InternalTextRange));

                    var buffer = new byte[len];

                    for (var i = 0; i < len; i++)
                    {
                        buffer[i] = Marshal.ReadByte(ret.Text, i);
                    }

                    return(Encoding.UTF8.GetString(buffer).TrimEnd('\0'));
                }
                finally
                {
                    Marshal.FreeHGlobal(ptr2);
                }
            }
            finally
            {
                Marshal.DestroyStructure(ptr, typeof(InternalTextRange));
            }
        }