Comment puis-je donner RichTextBox un regard plat?
-
22-08-2019 - |
Question
Je travaille sur une application SmartClient WinForms, qui utilise beaucoup de contrôles RichTextBox - certains en place de la zone de texte régulière pour diverses raisons. Malheureusement, le RichTextBox dessine la frontière laide Win95 3D au lieu de la frontière sur le thème de style XP ou Vista.
Quelqu'un sait-il d'un moyen d'appliquer la frontière sur le thème de la RichTextBox? Je ne me dérange pas les sous-classement à cet effet.
Merci!
La solution
Ceci est vraiment un hack, mais une chose que vous pouvez faire est de déposer un contrôle Panel sur la page. Donnez-lui un BorderStyle FixedSingle (ce sera par défaut Aucun.)
Laissez tomber votre RichTextBox dans le panneau et définissez le BorderStyle sans pareil. Définissez ensuite la propriété Dock du RichTextBox à remplir.
Cela vous donnera un RichTextBox avec une bordure plate.
Autres conseils
De retour dans la journée que je devais résoudre ce avec un panneau où la zone de texte est un composant à l'intérieur et a DockPadding réglé sur 3 ou 4 pixels. Je puis le style que le panneau à un seul pixel.
J'ai toujours trouvé ce vraiment ennuyeux!
Je suppose que cela est un peu trop tard, mais quand même.
Vous pouvez toujours utiliser P / Invoke et sous-classe votre RichEdit avec l'API UXTheme cette façon, vous pouvez désactiver / activer comme vous le souhaitez.
Je pense que CodeProject avait un contrôle richedit qui a utilisé UXTheme / visuel API Styles
Styles visuels UXTheme API peuvent devenir obsolètes ou dépréciée que Windows 8 est le déploiement
Voici le code VB.NET, il gonfle la zone avec -1 et non client remplit alors la zone non-client avec le bleu CADED. Il peut être converti en C # en utilisant SharpDevelop 4.4. Je tirais le code de cet article:
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 meilleure façon de se débarrasser de la 3D-frontière est de définir un autre:
richTextBox.BorderStyle = BorderStyle.FixedSingle;
Le FixedSingle
-BorderStyle est le plus proche de la FlatStyle
de, par exemple Bouton