没有标题栏问题和Windows 10

时间:2015-09-09 01:21:35

标签: vb.net winapi

我正在开发一个带有自定义标题栏的应用程序。表单设计要求它可以调整大小。请记住它有一个自定义标题栏,使用常规路径删除自定义窗体中的标题栏是行不通的。似乎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个空格。

1 个答案:

答案 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中指定的覆盖!感谢大家和他们所有宝贵的意见。