Pregunta

Estoy trabajando en una aplicación Windows Forms SmartClient, que utiliza una gran cantidad de controles RichTextBox - algunos en lugar del cuadro de texto normal, por diversas razones. Desafortunadamente RichTextBox dibuja la frontera fea Win95 3D en lugar de la frontera del estilo con temas XP o Vista.

¿Alguien sabe de una manera de aplicar el borde temática a la RichTextBox? No me importa la subclasificación de ellos para este propósito.

Gracias!

¿Fue útil?

Solución

Esto es realmente un truco, pero una cosa que puede hacer es soltar un panel de control en la página. Darle un EstiloDeLosBordes de FixedSingle (será Ninguno de forma predeterminada.)

Caída de su RichTextBox en el panel y establecer el BorderStyle a ninguno. A continuación, establezca la propiedad Dock de RichTextBox para rellenar.

Esto le dará un RichTextBox con un borde plano.

Otros consejos

De vuelta en el día que tuvo que resolver esto con un panel en el que el cuadro de texto es un componente dentro y tenía DockPadding establece en 3 o 4 píxeles. Entonces estaría estilo que el panel a un solo píxel.

Siempre he encontrado que esto realmente molesto!

Creo que esto es un poco demasiado tarde, pero, no obstante.

Siempre se puede utilizar P / Invoke y su subclase RichEdit con UXTheme API de esa manera se puede activar / desactivar a tu gusto.

Creo CodeProject tenía un control richedit que se usa UXTheme / Visual Estilos API

estilos visuales UXTheme API puede llegar a ser obsoletos o en desuso como Windows 8 está desplegando

Aquí es código VB.NET, se infla el área no cliente con -1 y luego llena el área no cliente con azul caded. Se puede convertir a C # usando SharpDevelop 4.4. I derivado el código de este artículo:

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

La forma más fácil de deshacerse de la 3D-frontera es fijar otra:

richTextBox.BorderStyle = BorderStyle.FixedSingle;

El FixedSingle-BorderStyle es el más cercano a la FlatStyle de, por ejemplo Botón

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top