C# 我如何给 RichTextBox 一个平面外观?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/700479/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How do I give the RichTextBox a flat look?
提问by grover
I'm working on a WinForms SmartClient application, which uses a lot of RichTextBox controls - some in place of the regular TextBox for various reasons. Unfortunately the RichTextBox draws the ugly Win95 3D border instead of the themed XP or Vista style border.
我正在开发一个 WinForms SmartClient 应用程序,它使用了很多 RichTextBox 控件 - 由于各种原因,一些控件代替了常规的 TextBox。不幸的是,RichTextBox 绘制了丑陋的 Win95 3D 边框,而不是 XP 或 Vista 风格的主题边框。
Does anyone know of a way to apply the themed border to the RichTextBox? I don't mind subclassing them for this purpose.
有谁知道将主题边框应用于 RichTextBox 的方法?我不介意为此目的对它们进行子类化。
Thanks!
谢谢!
采纳答案by Loathian
This is really a hack but one thing you can do is drop a Panel control onto the page. Give it a BorderStyle of FixedSingle (it will be None by default.)
这确实是一个技巧,但您可以做的一件事是将面板控件拖放到页面上。给它一个 FixedSingle 的 BorderStyle (默认情况下它将是 None 。)
Drop your RichTextBox into the panel and set the BorderStyle to none. Then set the Dock property of the RichTextBox to Fill.
将 RichTextBox 放入面板并将 BorderStyle 设置为 none。然后将 RichTextBox 的 Dock 属性设置为 Fill。
This will give you a RichTextBox with a flat border.
这将为您提供一个带有扁平边框的 RichTextBox。
回答by Simon_Weaver
Back in the day I had to solve this with a panel where the text box is a component inside and had DockPadding set to 3 or 4 pixels. I'd then style that panel to a single pixel.
回到那天,我不得不用一个面板来解决这个问题,其中文本框是内部的一个组件,并将 DockPadding 设置为 3 或 4 个像素。然后我将该面板的样式设置为单个像素。
I always found this really annoying!
我一直觉得这真的很烦人!
回答by OMG-1
I guess this is a little too late, but nonetheless.
我想这有点太晚了,但仍然如此。
You can always use P/Invoke and subclass your RichEdit with UXTheme API that way you can disable/enable it as you wish.
您始终可以使用 P/Invoke 并使用 UXTheme API 将 RichEdit 子类化,这样您就可以根据需要禁用/启用它。
I think CodeProject had an richedit control which used UXTheme/Visual Styles API
我认为 CodeProject 有一个使用 UXTheme/Visual Styles API 的 Richedit 控件
Visual Styles UXTheme API may become obsolete or deprecated as Windows 8 is rolling out
回答by stax76
Here is VB.NET code, it inflates the nonclient area with -1 and then fills the nonclient area with caded blue. It can be converted to C# using SharpDevelop 4.4. I derived the code from this article:
这是 VB.NET 代码,它用 -1 使非客户区膨胀,然后用蓝色填充非客户区。可以使用 SharpDevelop 4.4 将其转换为 C#。我从这篇文章中得到了代码:
http://www.codeproject.com/Articles/13723/Themed-RichTextBox-A-RichTextBox-with-XP-styled-bo
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
回答by Breeze
The easiest way to get rid of the 3D-border is to set another one:
摆脱 3D 边框的最简单方法是设置另一个:
richTextBox.BorderStyle = BorderStyle.FixedSingle;
The FixedSingle
-BorderStyle is the closest to the FlatStyle
of e.g. Button
该FixedSingle
-BorderStyle是最接近FlatStyle
如巴顿