C#/.NET 重构RichTextBox透明控件闪烁问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#/.NET 重构RichTextBox透明控件闪烁问题相关的知识,希望对你有一定的参考价值。

class TransparentRichTextBox : RichTextBox

public TransparentRichTextBox()



override protected CreateParams CreateParams

get

CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x20;
return cp;



override protected void OnPaintBackground(PaintEventArgs e)




这个是网上找的透明背景的RichTextBox控件的代码,但是每次滚动滚动条,或者改变控件大小,都会闪烁,但我这个没法加双缓冲,不然就变成一块黑色的背景了。。。求高手帮忙解决下,谢谢~~

修改你的制作思路, 拖动滚动条或改变控件大小不要即时版.而是拖动完成后改变.
就跟你电脑没装显卡驱动时,移动一个窗体是看到一个虚框,而后完成移动动作一个道理
参考技术A 都是这样的,建议自己做个类似的控件就可以了追问

自己做不来Richtextbox这种复杂的控件。。。

在 vb.net 中调整 RichTextBox 的字体样式

【中文标题】在 vb.net 中调整 RichTextBox 的字体样式【英文标题】:Adjusting font style for a RichTextBox in vb.net 【发布时间】:2012-01-26 15:03:23 【问题描述】:

我在调整 RichTextBox 中的字体样式时遇到了麻烦,我已经看到了一些不同的方法来讨论单个属性(比如切换粗体和关闭)......但我正在努力做到这一点我的字体类可以调整 any 属性(粗体、斜体、下划线)。

我知道 Font.Style 是一组布尔标志(位域?)...但我不确定如何同时处理所有属性。

麻烦的代码如下:

Public Sub ModifyFontStyle(Optional ByVal Plain As Object = Nothing, Optional ByVal Bold As Object = Nothing, _
                           Optional ByVal Italics As Object = Nothing, Optional ByVal Underlined As Object = Nothing)
    Dim newFontStyle As System.Drawing.FontStyle


    If Plain Then
        newFontStyle = Drawing.FontStyle.Regular
        GivenFont = New Drawing.Font(GivenFont.FontFamily, GivenFont.Size, newFontStyle)
        Exit Sub
    End If

    If Bold IsNot Nothing Then
        If Bold Then
            newFontStyle = GivenFont.Style + Drawing.FontStyle.Bold
        Else
            newFontStyle = GivenFont.Style - Drawing.FontStyle.Bold
        End If
    End If


    If Italics IsNot Nothing Then
        If Italics Then
            newFontStyle = GivenFont.Style + Drawing.FontStyle.Italic
        Else
            newFontStyle = GivenFont.Style - Drawing.FontStyle.Italic
        End If
    End If

    If Underlined IsNot Nothing Then
        If Underlined Then
            newFontStyle = GivenFont.Style + Drawing.FontStyle.Underline
        Else
            newFontStyle = GivenFont.Style - Drawing.FontStyle.Underline
        End If
    End If

    GivenFont = New Drawing.Font(GivenFont.FontFamily, GivenFont.Size, newFontStyle)

End Sub

这是这段代码的最终问题:

我切换粗体(设置为 true) - 文本变为粗体。 我切换下划线 - 文本现在是粗体和下划线。 我切换斜体 - 文本现在是粗体、下划线和斜体。 我再次切换粗体(设置为 false) - 文本现在是删除线。

字体发生了什么变化?文本应加下划线,斜体不得删除线...

这是我的逻辑错误还是简单的误解?

好吧,感谢您抽出宝贵时间,我会继续修改它,直到它起作用或者我得到一个有效的答案,

【问题讨论】:

我想出了我需要做的事情:检查我正在调整的特定属性并阻止它多次添加到字体样式中。稍后我会发布这个问题的答案。 标志被移除,请参考FAQ。 【参考方案1】:

您使用了错误的运算符。它们确实类似于位标志,枚举具有 [Flags] 属性。您需要使用 Or 运算符打开样式,使用 And 运算符关闭样式。像这样:

    Dim style = Me.Font.Style
    '--- turn bold on
    style = style Or FontStyle.Bold
    '--- turn bold off
    style = style And Not FontStyle.Bold

【讨论】:

【参考方案2】:

嗯,我明白了。我已经让它成功运行了。

Public Sub ModifyFontStyle(Optional ByVal Plain As Object = Nothing, Optional ByVal Bold As Object = Nothing, _
                           Optional ByVal Italics As Object = Nothing, Optional ByVal Underlined As Object = Nothing)
    Dim newFontStyle As System.Drawing.FontStyle


    If Plain Then
        newFontStyle = Drawing.FontStyle.Regular
        GivenFont = New Drawing.Font(GivenFont.FontFamily, GivenFont.Size, newFontStyle)
        Exit Sub
    End If

    If Bold IsNot Nothing Then
        If Bold And Not GivenFont.Bold Then
            newFontStyle = GivenFont.Style + Drawing.FontStyle.Bold
        Else
            newFontStyle = GivenFont.Style - Drawing.FontStyle.Bold
        End If
    End If


    If Italics IsNot Nothing Then
        If Italics And Not GivenFont.Italic Then
            newFontStyle = GivenFont.Style + Drawing.FontStyle.Italic
        Else
            newFontStyle = GivenFont.Style - Drawing.FontStyle.Italic
        End If
    End If

    If Underlined IsNot Nothing Then
        If Underlined And Not GivenFont.Underline Then
            newFontStyle = GivenFont.Style + Drawing.FontStyle.Underline
        Else
            newFontStyle = GivenFont.Style - Drawing.FontStyle.Underline
        End If
    End If

    GivenFont = New Drawing.Font(GivenFont.FontFamily, GivenFont.Size, newFontStyle)

End Sub

感谢您的宝贵时间!

【讨论】:

以上是关于C#/.NET 重构RichTextBox透明控件闪烁问题的主要内容,如果未能解决你的问题,请参考以下文章

HOW TO:使用 Visual C# .NET 打印 RichTextBox 控件的内容

如何将颜色格式应用于 Richtextbox *作为用户类型*(VB.Net)

vb.net中如何控制richtextbox垂直滚动条向下滚动

在 vb.net 中调整 RichTextBox 的字体样式

从richtextbox逐行读取并显示在标签中(vb.net)

.net 4.5 中可绑定的 WPF Richtextbox