¿Cómo puedo dar RichTextBox una mirada plana?
-
22-08-2019 - |
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!
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
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