Windows 8,没有标题栏的表单,覆盖边框颜色

时间:2014-05-26 18:51:57

标签: c# vb.net winforms forms themes

我创建了一个表单,并通过将ControlBox属性设置为false并将Text属性设置为“”来禁用标题栏。 FormBorderStyle属性是大小的。 这是表单的设计者代码:

'
'frmParameters
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.BackColor = System.Drawing.Color.DeepSkyBlue
Me.ClientSize = New System.Drawing.Size(284, 261)
Me.ControlBox = False
Me.Name = "frmParameters"

表单创建为MDI-Child。下图显示了结果(表单处于活动状态):

enter image description here

如您所见,表单采用深灰色边框颜色。这与我的应用程序的主题不太匹配。 我相信这种颜色是由当前的Windows主题设置的。当表单处于非活动状态时,边框颜色为浅蓝色。 有没有办法覆盖这些颜色设置?我自己无法真正绘制边框,因为它位于客户区之外,我不想将Borderstyle设置为任何固定状态,因为表单应该仍然相当大。

VB.NET和C#中的答案都非常受欢迎。

这是在Windows 8.1中运行的。它是一个WinForms应用程序。

解决方法1
由于非激活颜色非常适合我的主题,我尝试禁用MDI应用程序中子表单的激活。 我通过创建一个大小为1,1的ghostform然后处理主窗体的MDIChildActivated事件来实现这一点:

Private Sub frmMain_MdiChildActivate(sender As Object, e As EventArgs) Handles MyBase.MdiChildActivate
    frmGhost.Activate()
End Sub

这会阻止其他表单处于活动状态,但这是一个相当肮脏的黑客攻击。有没有更好的办法?设置Selectable样式不会阻止它。

2 个答案:

答案 0 :(得分:0)

谷歌搜索显示更改表格边框颜色非常困难。

我能为您提供的最好的是:

  Private Sub Form1_Activated(sender As Object, e As EventArgs) Handles Me.Activated
    Me.FormBorderStyle = Windows.Forms.FormBorderStyle.Sizable
  End Sub

  Private Sub Form1_LostFocus(sender As Object, e As EventArgs) Handles Me.LostFocus
    Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
  End Sub

边框仅在表单处于活动状态时显示。

答案 1 :(得分:0)

我现在所做的是使用无边框形式并手动添加调整大小功能。

Custom Resize Handle in Border-less Form C#

我不会重复整个调整大小的代码,只需查看链接。

然后我将表单的填充设置为每侧5,并通过覆盖OnPaint自行绘制边框。这足以满足我的需求。

重要的步骤是将表单的DoubleBufferedResizeRedraw属性设置为True,以便在重写OnPaint时获得良好的重新绘制。