VB.NET 如何去掉 GroupBox 控件的边框?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VB.NET 如何去掉 GroupBox 控件的边框?相关的知识,希望对你有一定的参考价值。

VB.NET 能否象 VB6 那样 去掉 GroupBox 控件的边框?

工程里面添加一个类,命名为myGroupBox,代码如下:
Imports System.ComponentModel
Imports System.Drawing.Drawing2D
Public Class myGroupBox
Inherits GroupBox
Public Sub New()
MyBase.BackColor = Color.Transparent
End Sub
<Browsable(False)> _
Public Overrides Property BackColor() As Color
Get
Return MyBase.BackColor
End Get
Set(value As Color)
MyBase.BackColor = value
End Set
End Property
Private m_backColor As Color = Color.Transparent
Public Property ActualBackColor() As Color
Get
Return Me.m_backColor
End Get
Set(value As Color)
Me.m_backColor = value
End Set
End Property
Protected Overrides Sub OnPaint(e As PaintEventArgs)
Dim tSize As Size = TextRenderer.MeasureText(Me.Text, Me.Font)
Dim borderRect As Rectangle = e.ClipRectangle
borderRect.Y += tSize.Height / 2
borderRect.Height -= tSize.Height / 2
Dim gPath As GraphicsPath = CreatePath(0, borderRect.Y, CSng(Me.Width - 1), borderRect.Height - 1, 5, True, _
True, True, True)
e.Graphics.FillPath(New SolidBrush(ActualBackColor), gPath)
e.Graphics.DrawPath(New Pen(Me.BackColor), gPath)
borderRect.X += 6
borderRect.Y -= 7
e.Graphics.DrawString(Me.Text, Me.Font, New SolidBrush(Me.ForeColor), borderRect)
End Sub
Public Function CreatePath(x As Single, y As Single, width As Single, height As Single, radius As Single, _
RoundTopLeft As Boolean, RoundTopRight As Boolean, RoundBottomRight As Boolean, RoundBottomLeft As Boolean) As GraphicsPath
Dim xw As Single = x + width
Dim yh As Single = y + height
Dim xwr As Single = xw - radius
Dim yhr As Single = yh - radius
Dim xr As Single = x + radius
Dim yr As Single = y + radius
Dim r2 As Single = radius * 2
Dim xwr2 As Single = xw - r2
Dim yhr2 As Single = yh - r2
Dim p As New GraphicsPath()
p.StartFigure()
'Top Left Corner
If RoundTopLeft Then
p.AddArc(x, y, r2, r2, 180, 90)
Else
p.AddLine(x, yr, x, y)
p.AddLine(x, y, xr, y)
End If
'Top Edge
p.AddLine(xr, y, xwr, y)
'Top Right Corner
If RoundTopRight Then
p.AddArc(xwr2, y, r2, r2, 270, 90)
Else
p.AddLine(xwr, y, xw, y)
p.AddLine(xw, y, xw, yr)
End If
'Right Edge
p.AddLine(xw, yr, xw, yhr)
'Bottom Right Corner
If RoundBottomRight Then
p.AddArc(xwr2, yhr2, r2, r2, 0, 90)
Else
p.AddLine(xw, yhr, xw, yh)
p.AddLine(xw, yh, xwr, yh)
End If
'Bottom Edge
p.AddLine(xwr, yh, xr, yh)
'Bottom Left Corner
If RoundBottomLeft Then
p.AddArc(x, yhr2, r2, r2, 90, 90)
Else
p.AddLine(xr, yh, x, yh)
p.AddLine(x, yh, x, yhr)
End If
'Left Edge
p.AddLine(x, yhr, x, yr)
p.CloseFigure()
Return p
End Function
End Class

工具栏会出现一个myGroupBox控件,放入窗体,你会发现边框没了。
参考技术A 把背景色设置为透明,不就行了么?不就融入背景了追问

可是有个框在那儿啊。

追答

你把vb6的效果,通过截图给我看看。我感觉你真的是转牛角尖了。。没必要的。。我印象当中vb6的控件奇丑无比。.net的比它好多了。

参考技术B 去掉干嘛?追问

不想要哪框,以便让它融入背景。

追答

那用panel行不行?

追问

也许是我还摸不到位,好像不行。

如何在 VB.Net 中正确地从内存中删除控件? [复制]

【中文标题】如何在 VB.Net 中正确地从内存中删除控件? [复制]【英文标题】:How to properly remove a control from memory, in VB.Net? [duplicate] 【发布时间】:2017-05-09 03:34:19 【问题描述】:

比较简单的问题。

我有一个面板,上面有一些文本框,都是动态创建的。 用户填写一些文本框,然后继续关闭面板。

现在在代码中我使用该行;

Me.Pnl_Main.Controls.Clear()

这工作正常,面板内容被“删除”。

问题是,当文本框为相同目的重新创建时,它们仍然包含它们之前的值。

不幸的是,大多数 UI 都是这样创建的,这不可避免地会导致内存泄漏。

所以我的问题是,有没有合适的方法从内存中完全删除控件?还是我需要运行一个例程来将所有文本值设置为 Nothing?

提前致谢。

【问题讨论】:

我认为问题是在执行.Clear() 后,对您创建的文本框的引用仍然存在于某处。我认为您没有内存泄漏问题,因为您总是使用相同的文本框实例(这就是您看到以前文本的原因)。当然,文本框是在表单之外引用的,比泄漏是可能的。您能否展示如何创建文本框并将它们添加到面板的代码 Me.Pnl_Main.Controls.Clear() 之后,您可以将 textbox 变量设置为空。 文本框实际上是我制作的用户控件的一部分(这样可以在动态创建大量控件时节省时间)。 Public PG1 As New ConditionReportPage1 Me.pnl_main.controls.add(PG1) 如果文本框是 UserControl 的一部分,那么您无需担心内存泄漏。当 UserControl 将被释放时,文本框也将被释放。 【参考方案1】:

只要代码的某些部分包含对控件的引用,它们就不会从内存中清除。您必须删除对这些控件的所有引用,例如

 Me.Pnl_Main.Controls = Nothing

只要这些控件没有在其他任何地方被引用,它们就可以从内存中删除,但您实际上并不能控制它们何时最终从内存中删除。这是由垃圾收集器完成的,它通常会在内存开始变满时自动运行。

【讨论】:

这实际上什么也没做。在 VB.NET 中将事物设置为 Nothing 是没有意义的。原始问题中的代码是正确的,Bob 应该调用Clear。他缺少的部分是他需要首先遍历集合中的每个控件并调用其Dispose 成员函数。完成后,他可以致电Clear 清空集合。 查看此问题及其链接的问题:***.com/questions/1969705/…【参考方案2】:

处理一个对象与内存没有特别的关系。已处置的对象可以更快地从内存中删除,但 .NET 会在它准备就绪时回收内存。分配新内存比重新分配现有内存要便宜得多,所以大部分时间都是这样做的。

【讨论】:

这是真的,也不是。调用 Dispose 与垃圾收集器毫无关系;它释放非托管内存,而垃圾收集器处理托管内存。因此调用 Dispose 对防止内存泄漏至关重要。如果一个类型实现了 IDisposable,你必须调用它的 Dispose 方法,否则你会泄漏。 Control 类更加特殊(更多详细信息请参见副本)。您绝对必须为从其父控件中动态删除的每个控件调用 Dispose 方法。使答案正确的方法是将“disposed”替换为“unreferenced”。

以上是关于VB.NET 如何去掉 GroupBox 控件的边框?的主要内容,如果未能解决你的问题,请参考以下文章

Panel控件的使用

vb.net vs2005里面的如何把DateTimePicker控件里面的显示的时间去掉,也就是我只要显示年/月/日

Qt中去掉QGroupBox的边框

如何应用VB.NET MonthCalendar控件

QT中如何改变GroupBox控件内部的某一类控件?

VB.Net / VB 如何隐藏 WebBrowser 控件 中之滚动