首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使vb.net窗体的边框半透明

使vb.net窗体的边框半透明
EN

Stack Overflow用户
提问于 2011-01-08 13:38:31
回答 2查看 6.2K关注 0票数 2

有没有办法将vb.net表单嵌入到另一个vb.net表单中?我想做的是使Form-A半透明,Form-B作为嵌入的主表单。这样最终的应用程序就会有一个半透明的边框。另外,我不想使用MDI表单。

编辑:如何在不使用vb.net窗体的情况下使MDI窗体的边框半透明。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-12 23:17:30

我稍微简化了代码,并将大多数事件连接到一个方法中。不再有A表,只有B表。Form-B现在可以动态创建自己的Form-A,而不需要实际创建代码文件。我将边框大小移到了一个变量中,这样就很容易调整它了。

代码语言:javascript
复制
Imports System.Runtime.InteropServices

Public Class InnerForm
    Private borderSize As Integer = 10
    Private border As Form = New Form()

    Private Sub InnerForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        border.FormBorderStyle = Windows.Forms.FormBorderStyle.None
        border.ShowInTaskbar = False
        border.BackColor = Color.Blue
        border.Opacity = 0.5
        border.Enabled = False

        RefreshBorder()
    End Sub

Private Sub DrawRectangle()
    Dim p As New Drawing2D.GraphicsPath()
    p.StartFigure()
    p.AddArc(New Rectangle(0, 0, 40, 40), 180, 90)
    p.AddLine(40, 0, border.Width - 40, 0)
    p.AddArc(New Rectangle(border.Width - 40, 0, 40, 40), -90, 90)
    p.AddLine(border.Width, 40, border.Width, border.Height - 40)
    p.AddArc(New Rectangle(border.Width - 40, border.Height - 40, 40, 40), 0, 90)
    p.AddLine(border.Width - 40, border.Height, 40, border.Height)
    p.AddArc(New Rectangle(0, border.Height - 40, 40, 40), 90, 90)
    p.CloseFigure()
    border.Region = New Region(p)
End Sub

Private Sub RefreshBorder()
    border.Show()
    border.Size = New Size(Me.Width + borderSize * 2, Me.Height + borderSize * 2)
    border.Location = New Point(Me.Location.X - borderSize, Me.Location.Y - borderSize)
    DrawRectangle()
    SetWindowPos(border.Handle, Me.Handle, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOACTIVATE)

    Me.BringToFront()
End Sub


    Private Sub frmMAin_Refresh(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles Me.GotFocus, Me.Move, Me.Activated, Me.SizeChanged, MyBase.Shown

        'dont show when maximized or minimized, else show it'
        If Me.WindowState = FormWindowState.Maximized Or Me.WindowState = FormWindowState.Minimized Then
            border.Hide()
        Else
            RefreshBorder()
        End If
    End Sub

    <DllImport("user32.dll")> _
    Private Shared Function SetWindowPos(ByVal hWnd As IntPtr, ByVal hWndInsertAfter As IntPtr, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal uFlags As Integer) As Boolean
    End Function

    Public Const SWP_NOSIZE As Int32 = &H1
    Public Const SWP_NOMOVE As Int32 = &H2
    Public Const SWP_NOACTIVATE As Int32 = &H10
End Class

如果这对你有效,请告诉我。

票数 2
EN

Stack Overflow用户

发布于 2011-01-08 15:57:31

你应该看看这个。它是C#格式的,但您可以尝试获得翻译它的帮助。Extending Form with Non-Client Area Painting。这远远超出了我的理解,而且由于你是新手,这可能是相当棘手的。

首先,由于您没有指定,我假设您使用的是winforms,而不是WPf或Asp.net,我几乎没有使用这两种语言的经验。我有一个方法,它只是在处理一堆winforms属性。它在我的winxp,box上有点小故障,但它是有效的:)。下面是这两个表单的代码,我在代码中包含了该属性以简化操作。

主窗体

代码语言:javascript
复制
Public Class frmMAin
    Dim border As Form = New frmBackground()

    Private Sub frmMAin_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.GotFocus
        RefreshBorder()
    End Sub
    Private Sub frmMAin_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        RefreshBorder()
    End Sub

    Private Sub RefreshBorder()
        border.Show()


        border.Size = New Size(Me.Width + 20, Me.Height + 20)
        border.Location = New Point(Me.Location.X - 10, Me.Location.Y - 10)
    End Sub

    Private Sub frmMAin_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LostFocus
        border.Hide()
    End Sub

    Private Sub frmMAin_Move(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Move
        RefreshBorder()
    End Sub
End Class

背景窗体

代码语言:javascript
复制
Public Class frmBackground

    Private Sub frmBackground_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
        Me.ShowInTaskbar = False
        Me.BackColor = Color.Blue
        Me.Opacity = 0.5
    End Sub
End Class

结果是这样的。

这段代码仍然有一些关于焦点的问题,但主要是功能性的。还要记住,这并不是解决这个问题的最“优雅”的方法,使用一些系统dll很可能是一种更好的方法。你也可以试试WPF,因为我听说你比winforms对look有更多的控制。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4632550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档