PDA

View Full Version : سوال: چگونه میتوان فاصله بین دو خط richtextbox را تغییر داد؟



alexmcse
شنبه 22 آذر 1393, 19:40 عصر
سلام
چگونه میتوان فاصله بین دو خط ریچ تکس باکس را تغییر داد
مثلا در ورد میتوان فاصله بین خطوط را تغییر داد
1 hello
2 good
هلو در خط اول وگود در خط دوم
حالا میخواهم فاصله این دو خط را تغییر بدهم
چطور?
لطفا به این عکس نگاه کنید

http://s5.picofile.com/file/8157048850/space.png

aliasghar2
شنبه 22 آذر 1393, 19:45 عصر
سلام از این کد میتونی استفاده کنی

rtb.SetValue(Paragraph.LineHeightProperty, 10.0);

alexmcse
شنبه 22 آذر 1393, 20:22 عصر
کلاس Paragraph در کدام namespace قراردارد؟

aliasghar2
شنبه 22 آذر 1393, 20:41 عصر
اقا شرمنده اینی که من دادم ماله wpf تو winform کار نمیکنه

plus
شنبه 22 آذر 1393, 21:34 عصر
ظاهرا برای این کار باید دست به دامن WinAPI بشین.این کد رو به پروژه اضافه کنید:

public static class RichTextBoxExtensions {
private const int PFM_SPACEBEFORE = 64;
private const int PFM_SPACEAFTER = 128;
private const int EM_SETPARAFORMAT = 1095;
private const int SCF_ALL = 4;

public static void SetParagraphSpacingAfter(this RichTextBox richTextBox, int value) {
PARAFORMAT fmt = new PARAFORMAT();
fmt.cbSize = Marshal.SizeOf(fmt);
fmt.dwMask = PFM_SPACEAFTER;
fmt.dySpaceAfter = value;
SendMessage(new HandleRef(richTextBox, richTextBox.Handle),
EM_SETPARAFORMAT,
SCF_ALL,
ref fmt
);
}
public static void SetParagraphSpacingBefore(this RichTextBox richTextBox, int value) {
PARAFORMAT fmt = new PARAFORMAT();
fmt.cbSize = Marshal.SizeOf(fmt);
fmt.dwMask = PFM_SPACEBEFORE;
fmt.dySpaceAfter = value;
SendMessage(new HandleRef(richTextBox, richTextBox.Handle),
EM_SETPARAFORMAT,
SCF_ALL,
ref fmt
);
}
[StructLayout(LayoutKind.Sequential)]
private struct PARAFORMAT {
public int cbSize;
public uint dwMask;
public short wNumbering;
public short wReserved;
public int dxStartIndent;
public int dxRightIndent;
public int dxOffset;
public short wAlignment;
public short cTabCount;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public int[] rgxTabs;

// PARAFORMAT2 from here onwards.
public int dySpaceBefore;
public int dySpaceAfter;
public int dyLineSpacing;
public short sStyle;
public byte bLineSpacingRule;
public byte bOutlineLevel;
public short wShadingWeight;
public short wShadingStyle;
public short wNumberingStart;
public short wNumberingStyle;
public short wNumberingTab;
public short wBorderSpace;
public short wBorderWidth;
public short wBorders;
}

[DllImport("user32", CharSet = CharSet.Auto)]
private static extern int SendMessage(HandleRef hWnd,
int msg,
int wParam,
ref PARAFORMAT lp);
}

به همراه namespace های

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

و بعد از متدهای SetParagraphSpacingAfter و SetParagraphSpacingBefore استفاده کنید.البته اگه به ارث بری وارد باشین شاید بهتر باشه بجای Extension Method از کلاس RichTextBox ارث بری کنید.
http://dominicweb.eu/en/blog/various/winforms-richtextbox-with-paragraph-spacing-csharp/

alexmcse
یک شنبه 23 آذر 1393, 15:51 عصر
ظاهرا برای این کار باید دست به دامن WinAPI بشین.این کد رو به پروژه اضافه کنید:

public static class RichTextBoxExtensions {
private const int PFM_SPACEBEFORE = 64;
private const int PFM_SPACEAFTER = 128;
private const int EM_SETPARAFORMAT = 1095;
private const int SCF_ALL = 4;

public static void SetParagraphSpacingAfter(this RichTextBox richTextBox, int value) {
PARAFORMAT fmt = new PARAFORMAT();
fmt.cbSize = Marshal.SizeOf(fmt);
fmt.dwMask = PFM_SPACEAFTER;
fmt.dySpaceAfter = value;
SendMessage(new HandleRef(richTextBox, richTextBox.Handle),
EM_SETPARAFORMAT,
SCF_ALL,
ref fmt
);
}
public static void SetParagraphSpacingBefore(this RichTextBox richTextBox, int value) {
PARAFORMAT fmt = new PARAFORMAT();
fmt.cbSize = Marshal.SizeOf(fmt);
fmt.dwMask = PFM_SPACEBEFORE;
fmt.dySpaceAfter = value;
SendMessage(new HandleRef(richTextBox, richTextBox.Handle),
EM_SETPARAFORMAT,
SCF_ALL,
ref fmt
);
}
[StructLayout(LayoutKind.Sequential)]
private struct PARAFORMAT {
public int cbSize;
public uint dwMask;
public short wNumbering;
public short wReserved;
public int dxStartIndent;
public int dxRightIndent;
public int dxOffset;
public short wAlignment;
public short cTabCount;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public int[] rgxTabs;

// PARAFORMAT2 from here onwards.
public int dySpaceBefore;
public int dySpaceAfter;
public int dyLineSpacing;
public short sStyle;
public byte bLineSpacingRule;
public byte bOutlineLevel;
public short wShadingWeight;
public short wShadingStyle;
public short wNumberingStart;
public short wNumberingStyle;
public short wNumberingTab;
public short wBorderSpace;
public short wBorderWidth;
public short wBorders;
}

[DllImport("user32", CharSet = CharSet.Auto)]
private static extern int SendMessage(HandleRef hWnd,
int msg,
int wParam,
ref PARAFORMAT lp);
}

به همراه namespace های

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

و بعد از متدهای SetParagraphSpacingAfter و SetParagraphSpacingBefore استفاده کنید.البته اگه به ارث بری وارد باشین شاید بهتر باشه بجای Extension Method از کلاس RichTextBox ارث بری کنید.
http://dominicweb.eu/en/blog/various/winforms-richtextbox-with-paragraph-spacing-csharp/


ممنون
اما در استفاده کردن متدها مشکل دارم
تغییر در بین خطوط داده نمیشود
لطفا یک مثال بزنید

plus
یک شنبه 23 آذر 1393, 16:37 عصر
یک RichTextBox در فرم قرار بدین و کدهای زیر رو در لود فرم بگذارین:

richTextBox1.Multiline = true;
richTextBox1.Text = "Hello, this is line #1\nThis is line #2\nThis is line #3";
richTextBox1.SetParagraphSpacingAfter(100);

alexmcse
یک شنبه 23 آذر 1393, 19:33 عصر
به این عکس نگاه کنید فاصله بین خطوط قرار نمیگیرد چکار کنم

http://s5.picofile.com/file/8157240884/pic1.png

alexmcse
یک شنبه 23 آذر 1393, 19:36 عصر
یک RichTextBox در فرم قرار بدین و کدهای زیر رو در لود فرم بگذارین:

richTextBox1.Multiline = true;
richTextBox1.Text = "Hello, this is line #1\nThis is line #2\nThis is line #3";
richTextBox1.SetParagraphSpacingAfter(100);


به این عکس نگاه کنید فاصله بین خطوط قرار نمیگیرد چکار کنم

http://s5.picofile.com/file/8157240884/pic1.png

khokhan
یک شنبه 23 آذر 1393, 22:10 عصر
به این عکس نگاه کنید فاصله بین خطوط قرار نمیگیرد چکار کنم

http://s5.picofile.com/file/8157240884/pic1.png
.................................................. .................................................. .........

[DllImport("user32", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(HandleRef hWnd, int msg, int wParam, ref PARAFORMAT lParam);
const int PFM_SPACEBEFORE = 0x00000040;
const int PFM_SPACEAFTER = 0x00000080;
const int PFM_LINESPACING = 0x00000100;
const int SCF_SELECTION = 1;
const int EM_SETPARAFORMAT = 1095;
public Form1()
{
InitializeComponent();
}
private void setLineFormat(byte rule, int space)
{
PARAFORMAT fmt = new PARAFORMAT();
fmt.cbSize = Marshal.SizeOf(fmt);
fmt.dwMask = PFM_LINESPACING;
fmt.dyLineSpacing = space;
fmt.bLineSpacingRule = rule;
richTextBox1.SelectAll();
SendMessage(new HandleRef(richTextBox1, richTextBox1.Handle),
EM_SETPARAFORMAT,
SCF_SELECTION,
ref fmt
);
}

.........
...

mojtabamalaekeh
دوشنبه 24 آذر 1393, 12:18 عصر
سلام
هرکاری توی Wordpad میشه انجام داد توی Richtext هم میشه
من هیچوقت تگ های فرمت رو حفظ نمیکنم. هروقت تگی بخوام نمونه اش رو با Wordpad ویندوز درست میکنم بعد Save میکنم و با یه ویرایشگر متنی ساده باز میکنم که کدهای قالب بندی رو ببینم.
تگ ها رو که بدست آوردین با خاصیت FormattedText و Text کار کنید، حله!
مثلا فاصله خط ها میشه:

/sl<N>
اطلاعات بیشتر (http://latex2rtf.sourceforge.net/RTF-Spec-1.0.txt)