Como faço para dar o RichTextBox uma aparência plana?
-
22-08-2019 - |
Pergunta
Eu estou trabalhando em um aplicativo WinForms SmartClient, que usa um monte de controles RichTextBox - alguns no lugar do TextBox regular para várias razões. Infelizmente o RichTextBox desenha a fronteira feio Win95 3D em vez da beira do estilo temático XP ou Vista.
Alguém sabe de uma maneira de aplicar o limite temático para o RichTextBox? Eu não me importo subclasse-los para esse fim.
Obrigado!
Solução
Este é realmente um truque, mas uma coisa que você pode fazer é soltar um controle Panel na página. Dê-lhe um BorderStyle de FixedSingle (será None por padrão).
Deixe o seu RichTextBox no painel e definir o BorderStyle para nenhum. Em seguida, defina a propriedade Dock do RichTextBox para preencher.
Isto lhe dará um RichTextBox com uma borda plana.
Outras dicas
De volta ao dia que eu tinha que resolver isso com um painel onde a caixa de texto é um componente dentro e teve set DockPadding a 3 ou 4 pixels. Eu tinha então o estilo que o painel a um único pixel.
Eu sempre achei isso realmente irritante!
Eu acho que isso é um pouco tarde demais, mas mesmo assim.
Você sempre pode usar P / Invoke e subclasse seu RichEdit com UXTheme API de que maneira você pode ativar / desativar-lo como quiser.
Eu acho CodeProject tinha um controle richedit que usou UXTheme / Styles Visual API
Estilos visuais UXTheme API pode tornar-se obsoleto ou depreciado como Windows 8 está lançando
Aqui está o código VB.NET, ele infla a área não cliente com -1 e, em seguida, preenche a área não cliente com o azul caded. Ele pode ser convertido em C # utilizando SharpDevelop 4,4. I derivado do código deste artigo:
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
A maneira mais fácil de se livrar do 3D-fronteira é para definir uma outra:
richTextBox.BorderStyle = BorderStyle.FixedSingle;
O FixedSingle
-BorderStyle é o mais próximo ao FlatStyle
de exemplo Botão