сделать границу формы vb.net полупрозрачной - PullRequest
2 голосов
/ 08 января 2011

Есть ли способ встроить форму vb.net в другую форму vb.net. То, что я пытаюсь сделать, это сделать форму А полупрозрачной, а форму В - встроенной основной формой. Так что конечное приложение имеет полупрозрачную рамку вокруг него. Также я не хочу использовать форму MDI.

Редактировать: Как сделать границу формы vb.net полупрозрачной без использования формы MDI.

Ответы [ 2 ]

2 голосов
/ 12 января 2011

Я немного упростил код и подключил большинство событий к одному методу.Больше нет Формы-A, только Форма-B.Form-B теперь создает свою собственную Form-A на лету без необходимости создавать файл кода.Я переместил размер границы в переменную, чтобы его было легко настроить.

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 голосов
/ 08 января 2011

Вы должны это проверить.Это в C #, но вы можете попытаться получить помощь в переводе. Расширение формы с окраской не-клиентской области .Это намного выше моей головы, и, поскольку вы новичок, это может быть довольно сложно.

Прежде всего, поскольку вы не указали, я предполагаю, что вы используете winforms, а не WPf или Asp.net, обаиз которых у меня почти нет опыта работы с.У меня есть метод, который просто связывается с кучей свойств winforms.Это немного глючно на моем winxp, но все работает :).Вот код для этих двух форм, я включил это свойство в код для упрощения вещей.

Основная форма

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

Фоновая форма

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

И получается что-то вроде этого.alt text

Этот код все еще имеет некоторые проблемы с фокусом, но в основном он функционален.Также имейте в виду, что это не самый «элегантный» способ решения этой проблемы, скорее всего, есть лучший способ сделать это с некоторыми системными dll.Вы также можете попробовать WPF, так как я слышал, что у вас гораздо больше контроля над внешним видом, чем в winforms.

...