winforms 如何给予RichTextBox具有平面外观?

ldxq2e6h  于 2023-08-07  发布在  其他
关注(0)|答案(6)|浏览(130)

我正在开发一个WinForms SmartClient应用程序,它使用了很多RichTextBox控件--出于各种原因,有些控件代替了常规的TextBox。不幸的是,RichTextBox绘制了丑陋的Win95 3D边框,而不是主题XP或Vista风格的边框。
有没有人知道如何将主题边框应用到RichTextBox?我不介意为了这个目的把它们子类化。
谢谢你,谢谢

6ioyuze2

6ioyuze21#

这真的是一个黑客,但你可以做的一件事是把面板控件放到页面上。为它指定一个BorderStyle为FixedSingle(默认情况下为None)。
将RichTextBox拖放到面板中,并将BorderStyle设置为none。然后将RichTextBox的Dock属性设置为Fill。
这将给予你一个平面边框的RichTextBox。

u3r8eeie

u3r8eeie2#

回到过去,我不得不用一个面板来解决这个问题,其中文本框是内部的一个组件,并将DockPadding设置为3或4像素。然后我会将面板样式设置为单个像素。
我总是觉得这真的很烦人!

hgc7kmma

hgc7kmma3#

下面是VB.NET代码,它用-1填充非客户区,然后用蓝色填充非客户区。它可以使用SharpDevelop 4.4转换为C#。我从这篇文章中获得了代码:
http://www.codeproject.com/Articles/13723/Themed-RichTextBox-A-RichTextBox-with-XP-styled-bo

Imports System.Runtime.InteropServices
Imports System.Windows.Forms
Imports System.Windows.Forms.VisualStyles
Imports System.Drawing
Imports System.Diagnostics

Public Class FlatRichTextBox
    Inherits RichTextBox

    Private BorderRect As RECT

    Sub New()
        If VisualStyleInformation.IsEnabledByUser Then
            BorderStyle = BorderStyle.None
        End If
    End Sub

    Protected Overrides Sub WndProc(ByRef m As Message)
        Const WM_NCPAINT = &H85
        Const WM_NCCALCSIZE = &H83
        Const WM_THEMECHANGED = &H31A

        Select Case m.Msg
            Case WM_NCPAINT
                WmNcpaint(m)
            Case WM_NCCALCSIZE
                WmNccalcsize(m)
            Case WM_THEMECHANGED
                UpdateStyles()
            Case Else
                MyBase.WndProc(m)
        End Select
    End Sub

    Private Sub WmNccalcsize(ByRef m As Message)
        MyBase.WndProc(m)

        If Not VisualStyleInformation.IsEnabledByUser Then Return

        Dim par As New NCCALCSIZE_PARAMS()
        Dim windowRect As RECT

        If m.WParam <> IntPtr.Zero Then
            par = CType(Marshal.PtrToStructure(m.LParam, GetType(NCCALCSIZE_PARAMS)), NCCALCSIZE_PARAMS)
            windowRect = par.rgrc0
        End If

        Dim clientRect = windowRect

        clientRect.Left += 1
        clientRect.Top += 1
        clientRect.Right -= 1
        clientRect.Bottom -= 1

        BorderRect = New RECT(clientRect.Left - windowRect.Left,
                              clientRect.Top - windowRect.Top,
                              windowRect.Right - clientRect.Right,
                              windowRect.Bottom - clientRect.Bottom)

        If m.WParam = IntPtr.Zero Then
            Marshal.StructureToPtr(clientRect, m.LParam, False)
        Else
            par.rgrc0 = clientRect
            Marshal.StructureToPtr(par, m.LParam, False)
        End If

        Const WVR_HREDRAW = &H100
        Const WVR_VREDRAW = &H200
        Const WVR_REDRAW = (WVR_HREDRAW Or WVR_VREDRAW)

        m.Result = New IntPtr(WVR_REDRAW)
    End Sub

    Private Sub WmNcpaint(ByRef m As Message)
        MyBase.WndProc(m)

        If Not VisualStyleInformation.IsEnabledByUser Then Return

        Dim r As RECT
        GetWindowRect(Handle, r)

        r.Right -= r.Left
        r.Bottom -= r.Top
        r.Top = 0
        r.Left = 0

        r.Left += BorderRect.Left
        r.Top += BorderRect.Top
        r.Right -= BorderRect.Right
        r.Bottom -= BorderRect.Bottom

        Dim hDC = GetWindowDC(Handle)
        ExcludeClipRect(hDC, r.Left, r.Top, r.Right, r.Bottom)

        Using g = Graphics.FromHdc(hDC)
            g.Clear(Color.CadetBlue)
        End Using

        ReleaseDC(Handle, hDC)
        m.Result = IntPtr.Zero
    End Sub

    <DllImport("user32.dll")>
    Public Shared Function GetWindowRect(hWnd As IntPtr, ByRef lpRect As RECT) As Boolean
    End Function

    <DllImport("user32.dll")>
    Public Shared Function GetWindowDC(hWnd As IntPtr) As IntPtr
    End Function

    <DllImport("user32.dll")>
    Public Shared Function ReleaseDC(hWnd As IntPtr, hDC As IntPtr) As Integer
    End Function

    <DllImport("gdi32.dll")>
    Public Shared Function ExcludeClipRect(hdc As IntPtr, nLeftRect As Integer, nTopRect As Integer, nRightRect As Integer, nBottomRect As Integer) As Integer
    End Function

    <StructLayout(LayoutKind.Sequential)>
    Public Structure NCCALCSIZE_PARAMS
        Public rgrc0, rgrc1, rgrc2 As RECT
        Public lppos As IntPtr
    End Structure

    <StructLayout(LayoutKind.Sequential)>
    Public Structure RECT
        Public Left As Integer
        Public Top As Integer
        Public Right As Integer
        Public Bottom As Integer

        Public Sub New(left As Integer, top As Integer, right As Integer, bottom As Integer)
            Me.Left = left
            Me.Top = top
            Me.Right = right
            Me.Bottom = bottom
        End Sub
    End Structure
End Class

字符串

xzabzqsa

xzabzqsa4#

我想这有点太晚了,但尽管如此。
您可以始终使用P/Invoke并使用UXTheme API继承RichEdit,这样您就可以根据需要禁用/启用它。
我认为CodeProject有一个使用UXTheme/Visual Styles API的Richedit控件
Visual Styles UXTheme API may become obsolete or deprecated as Windows 8 is rolling out

ddarikpa

ddarikpa5#

[另一个黑客(VB.NET)]创建一个标签并添加代码:

Label backcolor = System.Drawing.Color.Transparent 
Label.BorderStyle = BorderStyle.FixedSingle
myRichTextBox.BringToFront
Label.Width=  myRichTextbox.Width + 4
Label.Height = myRichTextbox.Height + 4 
Label.left = myRichTextBox.left -2
Label.Top = myRichTextboxTop -2

字符串
希望能帮到文森佐

kqhtkvqz

kqhtkvqz6#

摆脱3D边框的最简单方法是设置另一个:

richTextBox.BorderStyle = BorderStyle.FixedSingle;

字符串
FixedSingle-BorderStyle是最接近FlatStyle的,例如按钮

相关问题