文本和边框之间的富文本框填充

时间:2010-05-26 14:45:52

标签: c# winforms

是否可以在文本和边框之间的Rich Text Box控件中添加填充?

我尝试将一个富文本框对接到一个面板中,其四边的填充设置为10,这就完成了我想要的。除非需要填充富文本框的垂直滚动条,否则也会填充。

11 个答案:

答案 0 :(得分:27)

RichTextBox没有填充属性。

可以通过将RichTextBox放在 Panel 中来实现快速和脏填充,它具有与RichTextBox相同的BackColor属性(通常为Color.White)。

然后,将RichTextBox的Dock属性设置为Fill,并使用Panel控件的Padding属性。

答案 1 :(得分:22)

EM_GETRECTEM_SETRECT

将这两者结合在一起,你可以做到这一点:

enter image description here

......看起来像这样:

enter image description here

我写了a small C# extension class来包装这一切。

用法示例:

const int dist = 24;
richTextBox1.SetInnerMargins(dist, dist, dist, 0);

这将左边,上边和右边的内边距设置为24,底部为零。

请注意,滚动时,上边距保持不变,如下所示:

enter image description here

就个人而言,这对我来说看起来“不自然”。我希望滚动上边距时也是零。

也许有一种解决方法......

完整源代码

截至要求:

public static class RichTextBoxExtensions
{
    public static void SetInnerMargins(this TextBoxBase textBox, int left, int top, int right, int bottom)
    {
        var rect = textBox.GetFormattingRect();

        var newRect = new Rectangle(left, top, rect.Width - left - right, rect.Height - top - bottom);
        textBox.SetFormattingRect(newRect);
    }

    [StructLayout(LayoutKind.Sequential)]
    private struct RECT
    {
        public readonly int Left;
        public readonly int Top;
        public readonly int Right;
        public readonly int Bottom;

        private RECT(int left, int top, int right, int bottom)
        {
            Left = left;
            Top = top;
            Right = right;
            Bottom = bottom;
        }

        public RECT(Rectangle r) : this(r.Left, r.Top, r.Right, r.Bottom)
        {
        }
    }

    [DllImport(@"User32.dll", EntryPoint = @"SendMessage", CharSet = CharSet.Auto)]
    private static extern int SendMessageRefRect(IntPtr hWnd, uint msg, int wParam, ref RECT rect);

    [DllImport(@"user32.dll", EntryPoint = @"SendMessage", CharSet = CharSet.Auto)]
    private static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, ref Rectangle lParam);

    private const int EmGetrect = 0xB2;
    private const int EmSetrect = 0xB3;

    private static void SetFormattingRect(this TextBoxBase textbox, Rectangle rect)
    {
        var rc = new RECT(rect);
        SendMessageRefRect(textbox.Handle, EmSetrect, 0, ref rc);
    }

    private static Rectangle GetFormattingRect(this TextBoxBase textbox)
    {
        var rect = new Rectangle();
        SendMessage(textbox.Handle, EmGetrect, (IntPtr) 0, ref rect);
        return rect;
    }
}

答案 2 :(得分:10)

我遇到了同样的问题,所描述的答案对我没有帮助,这对我有用,所以如果有帮助的话我会分享它。

richTextBox1.SelectAll();
richTextBox1.SelectionIndent += 15;//play with this values to match yours
richTextBox1.SelectionRightIndent += 15;//this too
richTextBox1.SelectionLength = 0;
//this is a little hack because without this
//i've got the first line of my richTB selected anyway.
richTextBox1.SelectionBackColor = richTextBox1.BackColor;

答案 3 :(得分:6)

一种快速简便的方法是通过在表单加载和表单/控件调整大小事件中调用此示例方法来从垂直滚动中偏移文本:

private void AdjustTextBoxRMargin()
{
    richTextBox1.RightMargin = richTextBox1.Size.Width - 35;
}

35的值似乎适用于Win7,但在其他版本的Windows上可能有所不同。

答案 4 :(得分:3)

由于RichTextBox没有填充属性。您可以创建自己的RichTextBoxSubclass,如本文所示:

http://www.codeproject.com/Articles/21437/A-Padded-Rich-Text-Box-Subclass

答案 5 :(得分:1)

也许这就是你需要的东西?

richTextBox.SelectionIndent += 20;

答案 6 :(得分:0)

在controltemplate中,内容部分是这样的:

<ScrollViewer x:Name="PART_ContentHost" 
              Style="{StaticResource ScrollViewerTextBox}"
              VerticalAlignment="Top"/>`

为滚动查看器创建样式(和控件模板);在Grid列上将MinWidth设置为类似于滚动条的宽度,并在ScrollContentPresenter上根据您的喜好调整边距。

<Style x:Key="ScrollViewerTextBox" TargetType="{x:Type ScrollViewer}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ScrollViewer}">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition/>
                        <ColumnDefinition Width="Auto" MinWidth="18"/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition/>
                        <RowDefinition Height="Auto"/>
                    </Grid.RowDefinitions>
                    <ScrollContentPresenter Grid.Column="0" Margin="3 3 3 0" CanVerticallyScroll="True" CanContentScroll="True"/>
                    <ScrollBar x:Name="PART_VerticalScrollBar" 
                               Grid.Row="0" 
                               Grid.Column="1"
                               Value="{TemplateBinding VerticalOffset}" 
                               Maximum="{TemplateBinding ScrollableHeight}" 
                               ViewportSize="{TemplateBinding ViewportHeight}" 
                               Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}">
                        <ScrollBar.ContextMenu>
                            <ContextMenu Visibility="Hidden" />
                        </ScrollBar.ContextMenu>
                    </ScrollBar>
                    <ScrollBar x:Name="PART_HorizontalScrollBar" 
                               Orientation="Horizontal" 
                               Grid.Row="1" 
                               Grid.Column="0" 
                               Value="{TemplateBinding HorizontalOffset}" 
                               Maximum="{TemplateBinding ScrollableWidth}" 
                               ViewportSize="{TemplateBinding ViewportWidth}" 
                               Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}">
                        <ScrollBar.ContextMenu>
                            <ContextMenu Visibility="Hidden" />
                        </ScrollBar.ContextMenu>
                    </ScrollBar>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

答案 7 :(得分:0)

这是一个更简单的答案。它不是可自定义的,但是会在整个文本(顶部,底部,左侧和右侧)周围放置一个小的填充。

在设计时,设置RichTextBox的ShowSelectionMargin属性 到True。运行时,您可能会注意到已应用了页边距(从无页边距到页边距),它看起来有点像“ jerkey”。如果是这样,请在加载RichTextBox之前放置一个Me.SuspendLayout,之后再放置一个Me.ResumeLayout

答案 8 :(得分:0)

这是一个简单的解决方案,用于设置RichTextBox的左右边界,这在C#Windows应用程序中对我来说效果很好。它将左右页边距都设置为4像素。

[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hWnd, uint wMsg, UIntPtr wParam, IntPtr lParam);

// both left and right margins set to 4 pixels with the last parm: 0x00040004
SendMessage(richtextbox1.Handle, 0xd3, (UIntPtr)0x3, (IntPtr)0x00040004);

我在下面尝试使SendMessage更合适:

const int EM_SETMARGINS = 0xd3;
const int EC_LEFTMARGIN = 0x1;
const int EC_RIGHTMARGIN = 0x2;

SendMessage(richtextbox1.Handle, EM_SETMARGINS,
 (UIntPtr)(EC_LEFTMARGIN | EC_RIGHTMARGIN), (IntPtr)0x00040004);

我认为问题最初发布时无法解决。

答案 9 :(得分:-1)

也许你正在寻找缩进文字?像左右缩进? 如果是这样,那么你可以使用rtf对象的ReGEtIndent和ReSetIndent方法。

我在这做什么:

//first I find the length of the active window

nLen := REGEtIndent( ::oActive:hWnd )    
//now resetIndents of the rtf control    
RESetIndent( ::oActive:hWnd, nLen[ 1 ] + 100, nLen[ 2 ] + 100, -25 )

希望有所帮助。

答案 10 :(得分:-3)

将右侧的填充设置为0,然后将RichTextBox的RightMargin设置为10.未经测试,但应该可以正常工作。