Привет, я рассматриваю возможность изменения интервала между строками в System.Windows.Forms.RichTextBox
Я сослался на эту и эту статьи SO и пришел к выводу, что я нужно поиграть со структурой PARAFORMAT2.
Мое требование состоит в том, что мне нужно установить межстрочный интервал равным половине межстрочного интервала. Это означает, что мне нужно использовать bLineSpacingRule = 4, а затем dyLineSpacing = 100 (в моей системе одинарный межстрочный интервал выглядит как 200)
Но при этом текст разрезается пополам. Что мне нужно, чтобы «Пробел занимал почти половину строки», не теряя при этом половину строки
[img]https://i.sstatic.net /CAqXd.png[/img]
public partial class MainForm : Form
{
string[] Cards = { "A", "K", "Q", "J", "T", "9", "8", "7", "6", "5", "4", "3", "2" };
[DllImport("user32.dll")]
static extern bool HideCaret(IntPtr hWnd);
public class ReadOnlyRichTextBox : RichTextBox
{
[DllImport("user32.dll", EntryPoint = "SendMessage", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd, Int32 msg,
Int32 wParam, ref PARAFORMAT2 lParam);
private const int SCF_SELECTION = 1;
public const int PFM_LINESPACING = 256;
public const int EM_SETPARAFORMAT = 1095;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct PARAFORMAT2
{
public int cbSize;
public uint dwMask;
public Int16 wNumbering;
public Int16 wReserved;
public int dxStartIndent;
public int dxRightIndent;
public int dxOffset;
public Int16 wAlignment;
public Int16 cTabCount;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public int[] rgxTabs;
public int dySpaceBefore;
public int dySpaceAfter;
public int dyLineSpacing;
public Int16 sStyle;
public byte bLineSpacingRule;
public byte bOutlineLevel;
public Int16 wShadingWeight;
public Int16 wShadingStyle;
public Int16 wNumberingStart;
public Int16 wNumberingStyle;
public Int16 wNumberingTab;
public Int16 wBorderSpace;
public Int16 wBorderWidth;
public Int16 wBorders;
}
public void SetSelectionLineSpacing(byte bLineSpacingRule, int dyLineSpacing)
{
PARAFORMAT2 format = new PARAFORMAT2();
format.cbSize = Marshal.SizeOf(format);
format.dwMask = PFM_LINESPACING;
format.dyLineSpacing = dyLineSpacing;
format.bLineSpacingRule = bLineSpacingRule;
SendMessage(this.Handle, EM_SETPARAFORMAT, SCF_SELECTION, ref format);
}
[DllImport("user32.dll")]
static extern bool HideCaret(IntPtr hWnd);
const int WM_SETFOCUS = 0x0007;
const int WM_KILLFOCUS = 0x0008;
[DefaultValue(false)]
public bool SelectionHighlightEnabled { get; set; }
public ReadOnlyRichTextBox()
{
ReadOnly = true;
BorderStyle = BorderStyle.None;
ContextMenu = null;
BackColor = Color.White;
GotFocus += TextBoxGotFocus;
Cursor = Cursors.Arrow; // mouse cursor like in other controls
SelectionHighlightEnabled = false;
}
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_SETFOCUS && !SelectionHighlightEnabled)
m.Msg = WM_KILLFOCUS;
base.WndProc(ref m);
}
private void TextBoxGotFocus(object sender, EventArgs args)
{
HideCaret(this.Handle);
}
}
private ReadOnlyRichTextBox[] r = new ReadOnlyRichTextBox[169];
public MainForm()
{
int x = 0;
int y = 0;
//InitializeComponent();
//splitContainer1.TabStop = false;
//RichTextBox rr = new RichTextBox();
for (int i = 0; i < 169; i++)
{
r[i] = new ReadOnlyRichTextBox();
r[i].SetSelectionLineSpacing(4,200); // This function is called to set line spacing
//tabControl2.TabPages["Range"].Controls.Add(r[i]);
this.Controls.Add(r[i]);
r[i].Size = new Size(40, 40);
r[i].Location = new Point(x, y);
if (i % 13 == 12)
{
x = 0;
y += 40;
}
else
{
x += 40;
}
int a = i / 13;
int b = i % 13;
string temp = ((a < b) ? (Cards[a] + Cards[b]) : (Cards[b] + Cards[a]));
r[i].Text += temp + ((a < b) ? "s" : ((a > b) ? "o" : " "));
if (a == b)
r[i].BackColor = Color.FromArgb(128 + 5 * a, 128 + 5 * a, 255);
else if (a < b)
r[i].BackColor = Color.FromArgb(128 + 5 * a, 255, 128 + 5 * a);
else if (a > b)
r[i].BackColor = Color.FromArgb(255, 128 + 5 * a, 128 + 5 * a);
r[i].Text = r[i].Text + "\n\r" + a.ToString() + b.ToString();
r[i].SelectionStart = 0;
r[i].SelectionLength = 3;
r[i].SelectionFont = new Font(r[i].Font.FontFamily, (float)8.0);
r[i].SelectionStart = 3;
r[i].SelectionLength = r[i].TextLength - 3;
r[i].SelectionFont = new Font(r[i].Font.FontFamily, (float)7.2);
}
}
private void TextBoxGotFocus(object sender, EventArgs args)
{
HideCaret(Handle);
}
}
ПРИМЕЧАНИЕ
Я ограничен System.Windows.Forms.RichTextBox и не могу использовать System. Windows.Controls.RichTextBox, поскольку это не приложение WPF.
Привет, я рассматриваю возможность изменения интервала между строками в System.Windows.Forms.RichTextBox Я сослался на эту и эту статьи SO и пришел к выводу, что я нужно поиграть со структурой PARAFORMAT2. Мое требование состоит в том, что мне нужно установить межстрочный интервал равным половине межстрочного интервала. Это означает, что мне нужно использовать bLineSpacingRule = 4, а затем dyLineSpacing = 100 (в моей системе одинарный межстрочный интервал выглядит как 200) Но при этом текст разрезается пополам. Что мне нужно, чтобы «Пробел занимал почти половину строки», не теряя при этом половину строки [img]https://i.sstatic.net /CAqXd.png[/img]
[list] [*]Первый квадрат с[code]bLineSpacingRule = 4[/code] и dyLineSpacing = 100
[*]Второй квадрат с[code]bLineSpacingRule = 4[/code] и dyLineSpacing = 200
Мне нужен третий квадрат.
[/list] Как мне этого добиться? Мой элемент управления объявлен следующим образом [code]public partial class MainForm : Form { string[] Cards = { "A", "K", "Q", "J", "T", "9", "8", "7", "6", "5", "4", "3", "2" }; [DllImport("user32.dll")] static extern bool HideCaret(IntPtr hWnd);
private const int SCF_SELECTION = 1; public const int PFM_LINESPACING = 256; public const int EM_SETPARAFORMAT = 1095; [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct PARAFORMAT2 { public int cbSize; public uint dwMask; public Int16 wNumbering; public Int16 wReserved; public int dxStartIndent; public int dxRightIndent; public int dxOffset; public Int16 wAlignment; public Int16 cTabCount; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public int[] rgxTabs; public int dySpaceBefore; public int dySpaceAfter; public int dyLineSpacing; public Int16 sStyle; public byte bLineSpacingRule; public byte bOutlineLevel; public Int16 wShadingWeight; public Int16 wShadingStyle; public Int16 wNumberingStart; public Int16 wNumberingStyle; public Int16 wNumberingTab; public Int16 wBorderSpace; public Int16 wBorderWidth; public Int16 wBorders; }
public void SetSelectionLineSpacing(byte bLineSpacingRule, int dyLineSpacing) { PARAFORMAT2 format = new PARAFORMAT2(); format.cbSize = Marshal.SizeOf(format); format.dwMask = PFM_LINESPACING; format.dyLineSpacing = dyLineSpacing; format.bLineSpacingRule = bLineSpacingRule; SendMessage(this.Handle, EM_SETPARAFORMAT, SCF_SELECTION, ref format); } [DllImport("user32.dll")] static extern bool HideCaret(IntPtr hWnd); const int WM_SETFOCUS = 0x0007; const int WM_KILLFOCUS = 0x0008; [DefaultValue(false)] public bool SelectionHighlightEnabled { get; set; } public ReadOnlyRichTextBox() { ReadOnly = true; BorderStyle = BorderStyle.None; ContextMenu = null; BackColor = Color.White; GotFocus += TextBoxGotFocus; Cursor = Cursors.Arrow; // mouse cursor like in other controls SelectionHighlightEnabled = false; } protected override void WndProc(ref Message m) { if (m.Msg == WM_SETFOCUS && !SelectionHighlightEnabled) m.Msg = WM_KILLFOCUS;
base.WndProc(ref m); }
private void TextBoxGotFocus(object sender, EventArgs args) { HideCaret(this.Handle); } } private ReadOnlyRichTextBox[] r = new ReadOnlyRichTextBox[169]; public MainForm() { int x = 0; int y = 0; //InitializeComponent(); //splitContainer1.TabStop = false; //RichTextBox rr = new RichTextBox();
for (int i = 0; i < 169; i++) { r[i] = new ReadOnlyRichTextBox(); r[i].SetSelectionLineSpacing(4,200); // This function is called to set line spacing //tabControl2.TabPages["Range"].Controls.Add(r[i]); this.Controls.Add(r[i]); r[i].Size = new Size(40, 40); r[i].Location = new Point(x, y);
if (i % 13 == 12) { x = 0; y += 40; } else { x += 40; } int a = i / 13; int b = i % 13; string temp = ((a < b) ? (Cards[a] + Cards[b]) : (Cards[b] + Cards[a])); r[i].Text += temp + ((a < b) ? "s" : ((a > b) ? "o" : " ")); if (a == b) r[i].BackColor = Color.FromArgb(128 + 5 * a, 128 + 5 * a, 255); else if (a < b) r[i].BackColor = Color.FromArgb(128 + 5 * a, 255, 128 + 5 * a); else if (a > b) r[i].BackColor = Color.FromArgb(255, 128 + 5 * a, 128 + 5 * a);
r[i].SelectionFont = new Font(r[i].Font.FontFamily, (float)7.2); } } private void TextBoxGotFocus(object sender, EventArgs args) { HideCaret(Handle); } } [/code] [b]ПРИМЕЧАНИЕ[/b] Я ограничен System.Windows.Forms.RichTextBox и не могу использовать System. Windows.Controls.RichTextBox, поскольку это не приложение WPF.
После загрузки шрифта урду на мой телефон Android размер курсора стал огромным, а расстояние между всеми строками стало огромным (пример WhatsApp). Я удалил шрифт урду, но курсор по-прежнему большой, и я не могу найти способ вернуть его в нормальное...
Есть ли способ добиться межстрочного интервала в Jetpack Compose? Похоже на обычные lineSpacingExta и lineSpacingMuliplier в Android?
Я знаю, что в Text и TextStyle есть lineHeight , но это не одно и то же. Высота строки определяет размер каждой...
Я пытался найти способ изменить значение по умолчанию межстрочного интервала в файле шрифта, используя QFont, QFontMetrics или что-то в этом роде. Я использую QPainter::drawText, чтобы нарисовать текст в ограничивающем прямоугольнике.
Странно, что...
Я пробовал искать в Markwon API и плагинах, но не нашел способа добавить дополнительный интервал между строками.
Кто-нибудь знает, как это сделать? Должен ли я использовать конкретный плагин или опцию из библиотеки?
Вот пример моего кода:
fun...