本文整理汇总了C#中ScintillaNET.Scintilla.DirectMessage方法的典型用法代码示例。如果您正苦于以下问题:C# Scintilla.DirectMessage方法的具体用法?C# Scintilla.DirectMessage怎么用?C# Scintilla.DirectMessage使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ScintillaNET.Scintilla
的用法示例。
在下文中一共展示了Scintilla.DirectMessage方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: GetStyledText
private static unsafe ArraySegment<byte> GetStyledText(Scintilla scintilla, int startBytePos, int endBytePos, bool addLineBreak)
{
Debug.Assert(endBytePos > startBytePos);
// Make sure the range is styled
scintilla.DirectMessage(NativeMethods.SCI_COLOURISE, new IntPtr(startBytePos), new IntPtr(endBytePos));
var byteLength = (endBytePos - startBytePos);
var buffer = new byte[(byteLength * 2) + (addLineBreak ? 4 : 0) + 2];
fixed (byte* bp = buffer)
{
NativeMethods.Sci_TextRange* tr = stackalloc NativeMethods.Sci_TextRange[1];
tr->chrg.cpMin = startBytePos;
tr->chrg.cpMax = endBytePos;
tr->lpstrText = new IntPtr(bp);
scintilla.DirectMessage(NativeMethods.SCI_GETSTYLEDTEXT, IntPtr.Zero, new IntPtr(tr));
byteLength *= 2;
}
// Add a line break?
// We do this when this range is part of a rectangular selection.
if (addLineBreak)
{
var style = buffer[byteLength - 1];
buffer[byteLength++] = (byte)'\r';
buffer[byteLength++] = style;
buffer[byteLength++] = (byte)'\n';
buffer[byteLength++] = style;
// Fix-up the NULL terminator just in case
buffer[byteLength] = 0;
buffer[byteLength + 1] = 0;
}
return new ArraySegment<byte>(buffer, 0, byteLength);
}
示例2: GetStyledSegments
private static unsafe List<ArraySegment<byte>> GetStyledSegments(Scintilla scintilla, bool currentSelection, bool currentLine, int startBytePos, int endBytePos, out StyleData[] styles)
{
var segments = new List<ArraySegment<byte>>();
if (currentSelection)
{
// Get each selection as a segment.
// Rectangular selections are ordered top to bottom and have line breaks appended.
var ranges = new List<Tuple<int, int>>();
var selCount = scintilla.DirectMessage(NativeMethods.SCI_GETSELECTIONS).ToInt32();
for (int i = 0; i < selCount; i++)
{
var selStartBytePos = scintilla.DirectMessage(NativeMethods.SCI_GETSELECTIONNSTART, new IntPtr(i)).ToInt32();
var selEndBytePos = scintilla.DirectMessage(NativeMethods.SCI_GETSELECTIONNEND, new IntPtr(i)).ToInt32();
ranges.Add(Tuple.Create(selStartBytePos, selEndBytePos));
}
var selIsRect = scintilla.DirectMessage(NativeMethods.SCI_SELECTIONISRECTANGLE) != IntPtr.Zero;
if (selIsRect)
ranges.OrderBy(r => r.Item1); // Sort top to bottom
foreach (var range in ranges)
{
var styledText = GetStyledText(scintilla, range.Item1, range.Item2, selIsRect);
segments.Add(styledText);
}
}
else if (currentLine)
{
// Get the current line
var mainSelection = scintilla.DirectMessage(NativeMethods.SCI_GETMAINSELECTION).ToInt32();
var mainCaretPos = scintilla.DirectMessage(NativeMethods.SCI_GETSELECTIONNCARET, new IntPtr(mainSelection)).ToInt32();
var lineIndex = scintilla.DirectMessage(NativeMethods.SCI_LINEFROMPOSITION, new IntPtr(mainCaretPos)).ToInt32();
var lineStartBytePos = scintilla.DirectMessage(NativeMethods.SCI_POSITIONFROMLINE, new IntPtr(lineIndex)).ToInt32();
var lineLength = scintilla.DirectMessage(NativeMethods.SCI_POSITIONFROMLINE, new IntPtr(lineIndex)).ToInt32();
var styledText = GetStyledText(scintilla, lineStartBytePos, (lineStartBytePos + lineLength), false);
segments.Add(styledText);
}
else // User-specified range
{
Debug.Assert(startBytePos != endBytePos);
var styledText = GetStyledText(scintilla, startBytePos, endBytePos, false);
segments.Add(styledText);
}
// Build a list of (used) styles
styles = new StyleData[NativeMethods.STYLE_MAX + 1];
styles[Style.Default].Used = true;
styles[Style.Default].FontName = scintilla.Styles[Style.Default].Font;
styles[Style.Default].SizeF = scintilla.Styles[Style.Default].SizeF;
styles[Style.Default].Weight = scintilla.DirectMessage(NativeMethods.SCI_STYLEGETWEIGHT, new IntPtr(Style.Default), IntPtr.Zero).ToInt32();
styles[Style.Default].Italic = scintilla.DirectMessage(NativeMethods.SCI_STYLEGETITALIC, new IntPtr(Style.Default), IntPtr.Zero).ToInt32();
styles[Style.Default].Underline = scintilla.DirectMessage(NativeMethods.SCI_STYLEGETUNDERLINE, new IntPtr(Style.Default), IntPtr.Zero).ToInt32();
styles[Style.Default].BackColor = scintilla.DirectMessage(NativeMethods.SCI_STYLEGETBACK, new IntPtr(Style.Default), IntPtr.Zero).ToInt32();
styles[Style.Default].ForeColor = scintilla.DirectMessage(NativeMethods.SCI_STYLEGETFORE, new IntPtr(Style.Default), IntPtr.Zero).ToInt32();
styles[Style.Default].Case = scintilla.DirectMessage(NativeMethods.SCI_STYLEGETCASE, new IntPtr(Style.Default), IntPtr.Zero).ToInt32();
styles[Style.Default].Visible = scintilla.DirectMessage(NativeMethods.SCI_STYLEGETVISIBLE, new IntPtr(Style.Default), IntPtr.Zero).ToInt32();
foreach (var seg in segments)
{
for (int i = 0; i < seg.Count; i += 2)
{
var style = seg.Array[i + 1];
if (!styles[style].Used)
{
styles[style].Used = true;
styles[style].FontName = scintilla.Styles[style].Font;
styles[style].SizeF = scintilla.Styles[style].SizeF;
styles[style].Weight = scintilla.DirectMessage(NativeMethods.SCI_STYLEGETWEIGHT, new IntPtr(style), IntPtr.Zero).ToInt32();
styles[style].Italic = scintilla.DirectMessage(NativeMethods.SCI_STYLEGETITALIC, new IntPtr(style), IntPtr.Zero).ToInt32();
styles[style].Underline = scintilla.DirectMessage(NativeMethods.SCI_STYLEGETUNDERLINE, new IntPtr(style), IntPtr.Zero).ToInt32();
styles[style].BackColor = scintilla.DirectMessage(NativeMethods.SCI_STYLEGETBACK, new IntPtr(style), IntPtr.Zero).ToInt32();
styles[style].ForeColor = scintilla.DirectMessage(NativeMethods.SCI_STYLEGETFORE, new IntPtr(style), IntPtr.Zero).ToInt32();
styles[style].Case = scintilla.DirectMessage(NativeMethods.SCI_STYLEGETCASE, new IntPtr(style), IntPtr.Zero).ToInt32();
styles[style].Visible = scintilla.DirectMessage(NativeMethods.SCI_STYLEGETVISIBLE, new IntPtr(style), IntPtr.Zero).ToInt32();
}
}
}
return segments;
}
示例3: CopyRtf
private static unsafe void CopyRtf(Scintilla scintilla, StyleData[] styles, List<ArraySegment<byte>> styledSegments)
{
// NppExport -> NppExport.cpp
// NppExport -> RTFExporter.cpp
// http://en.wikipedia.org/wiki/Rich_Text_Format
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms649013.aspx
// http://forums.codeguru.com/showthread.php?242982-Converting-pixels-to-twips
// http://en.wikipedia.org/wiki/UTF-8
try
{
// Calculate twips per space
int twips;
var fontStyle = FontStyle.Regular;
if (styles[Style.Default].Weight >= 700)
fontStyle |= FontStyle.Bold;
if (styles[Style.Default].Italic != 0)
fontStyle |= FontStyle.Italic;
if (styles[Style.Default].Underline != 0)
fontStyle |= FontStyle.Underline;
using (var graphics = scintilla.CreateGraphics())
using (var font = new Font(styles[Style.Default].FontName, styles[Style.Default].SizeF, fontStyle))
{
var width = graphics.MeasureString(" ", font).Width;
twips = (int)((width / graphics.DpiX) * 1440);
// TODO The twips value calculated seems too small on my computer
}
// Write RTF
using (var ms = new NativeMemoryStream(styledSegments.Sum(s => s.Count)))
using (var tw = new StreamWriter(ms, Encoding.ASCII))
{
var tabWidth = scintilla.DirectMessage(NativeMethods.SCI_GETTABWIDTH).ToInt32();
var deftab = tabWidth * twips;
tw.WriteLine(@"{{\rtf1\ansi\deff0\deftab{0}", deftab);
tw.Flush();
// Build the font table
tw.Write(@"{\fonttbl");
tw.Write(@"{{\f0 {0};}}", styles[Style.Default].FontName);
var fontIndex = 1;
for (int i = 0; i < styles.Length; i++)
{
if (!styles[i].Used)
continue;
if (i == Style.Default)
continue;
// Not a completely unique list, but close enough
if (styles[i].FontName != styles[Style.Default].FontName)
{
styles[i].FontIndex = fontIndex++;
tw.Write(@"{{\f{0} {1};}}", styles[i].FontIndex, styles[i].FontName);
}
}
tw.WriteLine("}"); // fonttbl
tw.Flush();
// Build the color table
tw.Write(@"{\colortbl");
tw.Write(@"\red{0}\green{1}\blue{2};", (styles[Style.Default].ForeColor >> 0) & 0xFF, (styles[Style.Default].ForeColor >> 8) & 0xFF, (styles[Style.Default].ForeColor >> 16) & 0xFF);
tw.Write(@"\red{0}\green{1}\blue{2};", (styles[Style.Default].BackColor >> 0) & 0xFF, (styles[Style.Default].BackColor >> 8) & 0xFF, (styles[Style.Default].BackColor >> 16) & 0xFF);
styles[Style.Default].ForeColorIndex = 0;
styles[Style.Default].BackColorIndex = 1;
var colorIndex = 2;
for (int i = 0; i < styles.Length; i++)
{
if (!styles[i].Used)
continue;
if (i == Style.Default)
continue;
// Not a completely unique list, but close enough
if (styles[i].ForeColor != styles[Style.Default].ForeColor)
{
styles[i].ForeColorIndex = colorIndex++;
tw.Write(@"\red{0}\green{1}\blue{2};", (styles[i].ForeColor >> 0) & 0xFF, (styles[i].ForeColor >> 8) & 0xFF, (styles[i].ForeColor >> 16) & 0xFF);
}
else
{
styles[i].ForeColorIndex = styles[Style.Default].ForeColorIndex;
}
if (styles[i].BackColor != styles[Style.Default].BackColor)
{
styles[i].BackColorIndex = colorIndex++;
tw.Write(@"\red{0}\green{1}\blue{2};", (styles[i].BackColor >> 0) & 0xFF, (styles[i].BackColor >> 8) & 0xFF, (styles[i].BackColor >> 16) & 0xFF);
}
else
{
styles[i].BackColorIndex = styles[Style.Default].BackColorIndex;
}
}
tw.WriteLine("}"); // colortbl
tw.Flush();
//.........这里部分代码省略.........
示例4: CopyHtml
private static unsafe void CopyHtml(Scintilla scintilla, StyleData[] styles, List<ArraySegment<byte>> styledSegments)
{
// NppExport -> NppExport.cpp
// NppExport -> HTMLExporter.cpp
// http://blogs.msdn.com/b/jmstall/archive/2007/01/21/html-clipboard.aspx
// http://blogs.msdn.com/b/jmstall/archive/2007/01/21/sample-code-html-clipboard.aspx
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms649015.aspx
try
{
long pos = 0;
byte[] bytes;
// Write HTML
using (var ms = new NativeMemoryStream(styledSegments.Sum(s => s.Count)))
using (var tw = new StreamWriter(ms, new UTF8Encoding(false)))
{
const int INDEX_START_HTML = 23;
const int INDEX_START_FRAGMENT = 65;
const int INDEX_END_FRAGMENT = 87;
const int INDEX_END_HTML = 41;
tw.WriteLine("Version:0.9");
tw.WriteLine("StartHTML:00000000");
tw.WriteLine("EndHTML:00000000");
tw.WriteLine("StartFragment:00000000");
tw.WriteLine("EndFragment:00000000");
tw.Flush();
// Patch header
pos = ms.Position;
ms.Seek(INDEX_START_HTML, SeekOrigin.Begin);
ms.Write((bytes = Encoding.ASCII.GetBytes(ms.Length.ToString("D8"))), 0, bytes.Length);
ms.Seek(pos, SeekOrigin.Begin);
tw.WriteLine("<html>");
tw.WriteLine("<head>");
tw.WriteLine(@"<meta charset=""utf-8"" />");
tw.WriteLine(@"<title>ScintillaNET v{0}</title>", scintilla.GetType().Assembly.GetName().Version.ToString(3));
tw.WriteLine("</head>");
tw.WriteLine("<body>");
tw.Flush();
// Patch header
pos = ms.Position;
ms.Seek(INDEX_START_FRAGMENT, SeekOrigin.Begin);
ms.Write((bytes = Encoding.ASCII.GetBytes(ms.Length.ToString("D8"))), 0, bytes.Length);
ms.Seek(pos, SeekOrigin.Begin);
tw.WriteLine("<!--StartFragment -->");
// Write the styles.
// We're doing the style tag in the body to include it in the "fragment".
tw.WriteLine(@"<style type=""text/css"" scoped="""">");
tw.Write("div#segments {");
tw.Write(" float: left;");
tw.Write(" white-space: pre;");
tw.Write(" line-height: {0}px;", scintilla.DirectMessage(NativeMethods.SCI_TEXTHEIGHT, new IntPtr(0)).ToInt32());
tw.Write(" background-color: #{0:X2}{1:X2}{2:X2};", (styles[Style.Default].BackColor >> 0) & 0xFF, (styles[Style.Default].BackColor >> 8) & 0xFF, (styles[Style.Default].BackColor >> 16) & 0xFF);
tw.WriteLine(" }");
for (int i = 0; i < styles.Length; i++)
{
if (!styles[i].Used)
continue;
tw.Write("span.s{0} {{", i);
tw.Write(@" font-family: ""{0}"";", styles[i].FontName);
tw.Write(" font-size: {0}pt;", styles[i].SizeF);
tw.Write(" font-weight: {0};", styles[i].Weight);
if (styles[i].Italic != 0)
tw.Write(" font-style: italic;");
if (styles[i].Underline != 0)
tw.Write(" text-decoration: underline;");
tw.Write(" background-color: #{0:X2}{1:X2}{2:X2};", (styles[i].BackColor >> 0) & 0xFF, (styles[i].BackColor >> 8) & 0xFF, (styles[i].BackColor >> 16) & 0xFF);
tw.Write(" color: #{0:X2}{1:X2}{2:X2};", (styles[i].ForeColor >> 0) & 0xFF, (styles[i].ForeColor >> 8) & 0xFF, (styles[i].ForeColor >> 16) & 0xFF);
switch ((StyleCase)styles[i].Case)
{
case StyleCase.Upper:
tw.Write(" text-transform: uppercase;");
break;
case StyleCase.Lower:
tw.Write(" text-transform: lowercase;");
break;
}
if (styles[i].Visible == 0)
tw.Write(" visibility: hidden;");
tw.WriteLine(" }");
}
tw.WriteLine("</style>");
tw.Write(@"<div id=""segments""><span class=""s{0}"">", Style.Default);
tw.Flush();
var tabSize = scintilla.DirectMessage(NativeMethods.SCI_GETTABWIDTH).ToInt32();
var tab = new string(' ', tabSize);
tw.AutoFlush = true;
var lastStyle = Style.Default;
var unicodeLineEndings = ((scintilla.DirectMessage(NativeMethods.SCI_GETLINEENDTYPESACTIVE).ToInt32() & NativeMethods.SC_LINE_END_TYPE_UNICODE) > 0);
//.........这里部分代码省略.........
示例5: Copy
public static void Copy(Scintilla scintilla, CopyFormat format, bool useSelection, bool allowLine, int startBytePos, int endBytePos)
{
// Plain text
if ((format & CopyFormat.Text) > 0)
{
if (useSelection)
{
if (allowLine)
scintilla.DirectMessage(NativeMethods.SCI_COPYALLOWLINE);
else
scintilla.DirectMessage(NativeMethods.SCI_COPY);
}
else
{
scintilla.DirectMessage(NativeMethods.SCI_COPYRANGE, new IntPtr(startBytePos), new IntPtr(endBytePos));
}
}
// RTF and/or HTML
if ((format & (CopyFormat.Rtf | CopyFormat.Html)) > 0)
{
// If we ever allow more than UTF-8, this will have to be revisited
Debug.Assert(scintilla.DirectMessage(NativeMethods.SCI_GETCODEPAGE).ToInt32() == NativeMethods.SC_CP_UTF8);
if (!registeredFormats)
{
// Register non-standard clipboard formats.
// Scintilla -> ScintillaWin.cxx
// NppExport -> HTMLExporter.h
// NppExport -> RTFExporter.h
CF_LINESELECT = NativeMethods.RegisterClipboardFormat("MSDEVLineSelect");
CF_VSLINETAG = NativeMethods.RegisterClipboardFormat("VisualStudioEditorOperationsLineCutCopyClipboardTag");
CF_HTML = NativeMethods.RegisterClipboardFormat("HTML Format");
CF_RTF = NativeMethods.RegisterClipboardFormat("Rich Text Format");
registeredFormats = true;
}
var lineCopy = false;
StyleData[] styles = null;
List<ArraySegment<byte>> styledSegments = null;
if (useSelection)
{
var selIsEmpty = scintilla.DirectMessage(NativeMethods.SCI_GETSELECTIONEMPTY) != IntPtr.Zero;
if (selIsEmpty)
{
if (allowLine)
{
// Get the current line
styledSegments = GetStyledSegments(scintilla, false, true, 0, 0, out styles);
lineCopy = true;
}
}
else
{
// Get every selection
styledSegments = GetStyledSegments(scintilla, true, false, 0, 0, out styles);
}
}
else if (startBytePos != endBytePos)
{
// User-specified range
styledSegments = GetStyledSegments(scintilla, false, false, startBytePos, endBytePos, out styles);
}
// If we have segments and can open the clipboard
if (styledSegments != null && styledSegments.Count > 0 && NativeMethods.OpenClipboard(scintilla.Handle))
{
if ((format & CopyFormat.Text) == 0)
{
// Do the things default (plain text) processing would normally give us
NativeMethods.EmptyClipboard();
if (lineCopy)
{
// Clipboard tags
NativeMethods.SetClipboardData(CF_LINESELECT, IntPtr.Zero);
NativeMethods.SetClipboardData(CF_VSLINETAG, IntPtr.Zero);
}
}
// RTF
if ((format & CopyFormat.Rtf) > 0)
CopyRtf(scintilla, styles, styledSegments);
// HTML
if ((format & CopyFormat.Html) > 0)
CopyHtml(scintilla, styles, styledSegments);
NativeMethods.CloseClipboard();
}
}
}
示例6: GetHtml
public static string GetHtml(Scintilla scintilla, int startBytePos, int endBytePos)
{
// If we ever allow more than UTF-8, this will have to be revisited
Debug.Assert(scintilla.DirectMessage(NativeMethods.SCI_GETCODEPAGE).ToInt32() == NativeMethods.SC_CP_UTF8);
if (startBytePos == endBytePos)
return string.Empty;
StyleData[] styles = null;
List<ArraySegment<byte>> styledSegments = GetStyledSegments(scintilla, false, false, startBytePos, endBytePos, out styles);
using (var ms = new NativeMemoryStream(styledSegments.Sum(s => s.Count))) // Hint
using (var sw = new StreamWriter(ms, new UTF8Encoding(false)))
{
// Write the styles
sw.WriteLine(@"<style type=""text/css"" scoped="""">");
sw.Write("div#segments {");
sw.Write(" float: left;");
sw.Write(" white-space: pre;");
sw.Write(" line-height: {0}px;", scintilla.DirectMessage(NativeMethods.SCI_TEXTHEIGHT, new IntPtr(0)).ToInt32());
sw.Write(" background-color: #{0:X2}{1:X2}{2:X2};", (styles[Style.Default].BackColor >> 0) & 0xFF, (styles[Style.Default].BackColor >> 8) & 0xFF, (styles[Style.Default].BackColor >> 16) & 0xFF);
sw.WriteLine(" }");
for (int i = 0; i < styles.Length; i++)
{
if (!styles[i].Used)
continue;
sw.Write("span.s{0} {{", i);
sw.Write(@" font-family: ""{0}"";", styles[i].FontName);
sw.Write(" font-size: {0}pt;", styles[i].SizeF);
sw.Write(" font-weight: {0};", styles[i].Weight);
if (styles[i].Italic != 0)
sw.Write(" font-style: italic;");
if (styles[i].Underline != 0)
sw.Write(" text-decoration: underline;");
sw.Write(" background-color: #{0:X2}{1:X2}{2:X2};", (styles[i].BackColor >> 0) & 0xFF, (styles[i].BackColor >> 8) & 0xFF, (styles[i].BackColor >> 16) & 0xFF);
sw.Write(" color: #{0:X2}{1:X2}{2:X2};", (styles[i].ForeColor >> 0) & 0xFF, (styles[i].ForeColor >> 8) & 0xFF, (styles[i].ForeColor >> 16) & 0xFF);
switch ((StyleCase)styles[i].Case)
{
case StyleCase.Upper:
sw.Write(" text-transform: uppercase;");
break;
case StyleCase.Lower:
sw.Write(" text-transform: lowercase;");
break;
}
if (styles[i].Visible == 0)
sw.Write(" visibility: hidden;");
sw.WriteLine(" }");
}
sw.WriteLine("</style>");
var unicodeLineEndings = ((scintilla.DirectMessage(NativeMethods.SCI_GETLINEENDTYPESACTIVE).ToInt32() & NativeMethods.SC_LINE_END_TYPE_UNICODE) > 0);
var tabSize = scintilla.DirectMessage(NativeMethods.SCI_GETTABWIDTH).ToInt32();
var tab = new string(' ', tabSize);
var lastStyle = Style.Default;
// Write the styled text
sw.Write(@"<div id=""segments""><span class=""s{0}"">", Style.Default);
sw.Flush();
sw.AutoFlush = true;
foreach (var seg in styledSegments)
{
var endOffset = seg.Offset + seg.Count;
for (int i = seg.Offset; i < endOffset; i += 2)
{
var ch = seg.Array[i];
var style = seg.Array[i + 1];
if (lastStyle != style)
{
sw.Write(@"</span><span class=""s{0}"">", style);
lastStyle = style;
}
switch (ch)
{
case (byte)'<':
sw.Write("<");
break;
case (byte)'>':
sw.Write(">");
break;
case (byte)'&':
sw.Write("&");
break;
case (byte)'\t':
sw.Write(tab);
break;
case (byte)'\r':
if (i + 2 < endOffset)
//.........这里部分代码省略.........