C# 如何使RichTextBox看起来平淡?

C# 如何使RichTextBox看起来平淡?,c#,winforms,richtextbox,themes,uxtheme,C#,Winforms,Richtextbox,Themes,Uxtheme,我正在开发一个WinForms SmartClient应用程序,它使用了很多RichTextBox控件——出于各种原因,有些控件取代了常规TextBox。不幸的是,RichTextBox绘制的是丑陋的Win95 3D边框,而不是主题化的XP或Vista样式的边框 有人知道将主题边框应用于RichTextBox的方法吗?为此,我不介意对它们进行子类化 谢谢 当年,我必须用一个面板来解决这个问题,其中文本框是其中的一个组件,并将DockPadding设置为3或4像素。然后我会将面板的样式设置为单个像

我正在开发一个WinForms SmartClient应用程序,它使用了很多RichTextBox控件——出于各种原因,有些控件取代了常规TextBox。不幸的是,RichTextBox绘制的是丑陋的Win95 3D边框,而不是主题化的XP或Vista样式的边框

有人知道将主题边框应用于RichTextBox的方法吗?为此,我不介意对它们进行子类化


谢谢

当年,我必须用一个面板来解决这个问题,其中文本框是其中的一个组件,并将DockPadding设置为3或4像素。然后我会将面板的样式设置为单个像素


我总是觉得这很烦人

这确实是一个黑客行为,但你可以做的一件事是在页面上放置一个面板控件。为其指定FixedSingle的BorderStyle(默认情况下为None)

将RichTextBox放入面板,并将BorderStyle设置为“无”。然后将RichTextBox的Dock属性设置为Fill


这将为您提供一个具有平坦边框的RichTextBox。

我想这已经有点晚了,但无论如何

您可以始终使用p/Invoke,并使用UXTheme API对RichEdit进行子类化,这样您就可以根据需要禁用/启用它

我认为CodeProject有一个richedit控件,它使用了UXTheme/visualstylesapi


这里是VB.NET代码,它用-1膨胀非客户区,然后用带刻度的蓝色填充非客户区。可以使用SharpDevelop 4.4将其转换为C#。我从本文中获得了代码:

导入System.Runtime.InteropServices
导入System.Windows.Forms
导入System.Windows.Forms.VisualStyles
导入系统。绘图
导入系统。诊断
公共类文本框
继承RichTextBox
私有BorderRect作为RECT
次新
如果VisualStyleInformation.IsEnabledByUser,则
BorderStyle=边框样式。无
如果结束
端接头
受保护的覆盖子WndProc(ByRef m作为消息)
常数WM_NCPAINT=&H85
常量WM_NCCALCSIZE=&H83
常数WM_THEMECHANGED=&H31A
选择Case m.Msg
案例WM_NCPAINT
WmNcpaint(米)
案例WM_NCCALCSIZE
WmNccalcsize(m)
案例WM_themechaned
UpdateStyles()
其他情况
MyBase.WndProc(m)
结束选择
端接头
专用子WmNccalcsize(ByRef m作为消息)
MyBase.WndProc(m)
如果不是VisualStyleInformation.IsEnabledByUser,则返回
作为新的NCCACLSIEZEPARAMS()
将windowRect变暗为RECT
如果m.WParam IntPtr.Zero,则
PAR= CType(McSal.PrtoStand(M.LPARAM,GetType(NcCalcsiZeZPARAMS)),NCCALCSIZEZ-PARAMS)
Windows Realt= PAR.RGRC0
如果结束
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)
如果m.WParam=IntPtr.Zero,则
Marshal.StructureToPtr(clientRect,m.LParam,False)
其他的
Pr.RGRC0= clitReCt
Marshal.StructureToPtr(par,m.LParam,False)
如果结束
常数WVR_HREDRAW=&H100
Const WVR_VREDRAW=&H200
常量WVR_REDRAW=(WVR_HREDRAW或WVR_VREDRAW)
m、 结果=新IntPtr(WVR_重新绘制)
端接头
专用子WmNcpaint(ByRef m作为消息)
MyBase.WndProc(m)
如果不是VisualStyleInformation.IsEnabledByUser,则返回
dimras RECT
GetWindowRect(句柄,r)
r、 右-=右左
r、 底部-=右侧顶部
r、 Top=0
r、 左=0
r、 左+=边界矩形。左
r、 Top+=BorderRect.Top
r、 右-=边界矩形。右
r、 底部-=边界矩形底部
Dim hDC=GetWindowDC(手柄)
ExcludeClipRect(hDC,右左,右上,右右下)
使用g=Graphics.FromHdc(hDC)
g、 清晰(颜色:CadetBlue)
终端使用
释放DC(手柄,hDC)
m、 结果=IntPtr.Zero
端接头
作为布尔值的公共共享函数GetWindowRect(hWnd作为IntPtr,ByRef lpRect作为RECT)
端函数
公共共享函数GetWindowDC(hWnd作为IntPtr)作为IntPtr
端函数
公共共享函数ReleaseDC(hWnd作为IntPtr,hDC作为IntPtr)作为整数
端函数
公共共享函数ExcludeClipRect(hdc作为IntPtr,nLeftRect作为Integer,nTopRect作为Integer,nRightRect作为Integer,nBottomRect作为Integer)作为Integer
端函数
公共结构NCCALCSIZE_参数
公共rgrc0、rgrc1、rgrc2作为RECT
公共lppos作为IntPtr
端部结构
公共结构
公共左整数
作为整数的公共Top
作为整数的公权
公共底部为整数
Public Sub New(左为整数,上为整数,右为整数,下为整数)
左=左
Me.Top=Top
我,对
我的屁股
端接头
端部结构
末级

摆脱3D边框的最简单方法是设置另一个:

richTextBox.BorderStyle = BorderStyle.FixedSingle;

FixedSingle
-边框样式最接近按钮的
FlatStyle
,这真的很烦人,必须有更好的方法,因为这不能给出真正的文本框主题。我有时想知道他们为什么不制作一个称为“文本框”的边框样式DI遵循了这个建议,只是我使用了一个分组框+1.
richTextBox.BorderStyle = BorderStyle.FixedSingle;