我正在开发一个带有自定义标题栏的应用程序。表单设计要求它可以调整大小。请记住它有一个自定义标题栏,使用常规路径删除自定义窗体中的标题栏是行不通的。似乎Windows 10 API正在逼迫一个小的白色" chunk"保留在标题栏上方的屏幕顶部。
我的问题是:有没有人遇到过此问题,您是否知道修复或解决方法以便我们可以在Windows 10中使表单看起来正确?
这是我目前的代码:
Dim testform As New Form
testform.Width = 350
testform.Height = 100
testform.FormBorderStyle = FormBorderStyle.Sizable
testform.ControlBox = False
testform.Text = String.Empty
testform.Show()
我们测试了API问题,因为另一个支持论坛的建议似乎已经用尽了帮助。我编译了现有的代码并在Windows 7机器上运行了可执行文件。在Windows 7计算机上,表单正确打开,ClientRectangle顶部和表单之间有0个空格。
答案 0 :(得分:0)
TheB有最好的答案,我不得不稍微修改它来处理我的编码。谢谢你的帮助,先生!
因此,在更改此代码以使用动态创建的控件时,需要进行一些更改。以下是我如何使用它:
创建一个专门命名为:SubclassHWND.vb 的新类 (从Microsoft)收集
Public Class SubclassHWND
Inherits NativeWindow
Public Const WM_NCHITTEST = &H84
Public Const BorderSize As Integer = 10
Public frm As Form = Nothing
Public Sub setFrm(ByVal sender As Form)
frm = sender
End Sub
Protected Overloads Overrides Sub WndProc(ByRef m As Message)
if m.Msg = WM_NCHITTEST Then
Dim x As Integer = m.LParam.ToInt32 And &HFFFF
Dim y As Integer = (m.LParam.ToInt32 >> 16) And &HFFFF
Dim p As Point = New Point(x, y)
If frm.Bounds.Contains(p) Then
Dim top As Boolean = Math.Abs(frm.Bounds.Y - y) < BorderSize
Dim bottom As Boolean = Math.Abs(frm.Bounds.Bottom - y) < BorderSize
Dim left As Boolean = Math.Abs(frm.Bounds.X - x) < BorderSize
Dim right As Boolean = Math.Abs(frm.Bounds.Right - x) < BorderSize
If top And left Then
m.Result = NCHITTEST.HTTOPLEFT
ElseIf top And right Then
m.Result = NCHITTEST.HTTOPRIGHT
ElseIf bottom And left Then
m.Result = NCHITTEST.HTBOTTOMLEFT
ElseIf bottom And right Then
m.Result = NCHITTEST.HTBOTTOMRIGHT
ElseIf top Then
m.Result = NCHITTEST.HTTOP
ElseIf bottom Then
m.Result = NCHITTEST.HTBOTTOM
ElseIf left Then
m.Result = NCHITTEST.HTLEFT
ElseIf right Then
m.Result = NCHITTEST.HTRIGHT
Else
m.Result = NCHITTEST.HTCAPTION
End If
Exit Sub
End If
End If
Debug.WriteLine(m.ToString())
MyBase.WndProc(m)
End Sub
End Class
Public Enum NCHITTEST
HTBOTTOM = 15
HTBOTTOMLEFT = 16
HTBOTTOMRIGHT = 17
HTCAPTION = 2
HTLEFT = 10
HTRIGHT = 11
HTTOP = 12
HTTOPLEFT = 13
HTTOPRIGHT = 14
End Enum
这基本上与@TheB为我的修复程序提供的完全相同的代码进行了一些更改。我们继续创建了一个新的Public frm
变量。我们在下一组代码中设置了这个,以便我们可以引用WndProc
评估将覆盖的动态表单。
在表单生成代码中,我们添加了这些行来创建在Windows 10中没有标题栏API的可调整大小的窗口:
newForm.FormBorderStyle = FormBorderStyle.FixedToolWindow
newForm.ControlBox = False
newForm.Text = String.Empty
Dim s As SubclassHWND = New SubclassHWND()
s.setFrm(newForm)
s.AssignHandle(newForm.Handle)
现在,项目中每个动态创建的表单都使用我们在SubclassHWND.vb
中指定的覆盖!感谢大家和他们所有宝贵的意见。