Межстрочный интервал RichTextBox в форме Windows – C#C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Межстрочный интервал RichTextBox в форме Windows – C#

Сообщение Anonymous »

Привет, я рассматриваю возможность изменения интервала между строками в System.Windows.Forms.RichTextBox
Я сослался на эту и эту статьи SO и пришел к выводу, что я нужно поиграть со структурой PARAFORMAT2.
Мое требование состоит в том, что мне нужно установить межстрочный интервал равным половине межстрочного интервала. Это означает, что мне нужно использовать bLineSpacingRule = 4, а затем dyLineSpacing = 100 (в моей системе одинарный межстрочный интервал выглядит как 200)
Но при этом текст разрезается пополам. Что мне нужно, чтобы «Пробел занимал почти половину строки», не теряя при этом половину строки
[img]https://i.sstatic.net /CAqXd.png[/img]
  • Первый квадрат с

    Код: Выделить всё

    bLineSpacingRule = 4
    и dyLineSpacing = 100
  • Второй квадрат с

    Код: Выделить всё

    bLineSpacingRule = 4
    и dyLineSpacing = 200

    Мне нужен третий квадрат.
Как мне этого добиться?
Мой элемент управления объявлен следующим образом

Код: Выделить всё

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.

Подробнее здесь: https://stackoverflow.com/questions/517 ... rm-c-sharp
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Уменьшите межстрочный интервал в Tailwind CSS
    Anonymous » » в форуме CSS
    0 Ответы
    26 Просмотры
    Последнее сообщение Anonymous
  • Чрезмерный межстрочный интервал после загрузки шрифта на Xiaomi android
    Anonymous » » в форуме Android
    0 Ответы
    147 Просмотры
    Последнее сообщение Anonymous
  • Межстрочный интервал в Jetpack Compose
    Anonymous » » в форуме Android
    0 Ответы
    35 Просмотры
    Последнее сообщение Anonymous
  • QFont не позволяет устанавливать межстрочный интервал или интерлиньяж вручную.
    Anonymous » » в форуме C++
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Android Kotlin: как установить межстрочный интервал с помощью разрыва заголовка Markwon
    Anonymous » » в форуме Android
    0 Ответы
    30 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»