2011-01-08 2 views
2

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

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

+0

Без использования MDI я не могу придумать, как это сделать. За исключением некоторых серьезных взломов winforms. У меня есть идея, но мне придется подождать до завтра, чтобы получить доступ к компьютеру с помощью Visual Studios. – giodamelio

+0

спасибо, я подожду до завтрашнего дня – subanki

+0

Im gonna download now, так что может быть около позднего вечера. – giodamelio

ответ

2

Я немного упростил код и подключил большинство событий к одному методу. Больше нет формы-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 

Сообщите мне, если это сработает для вас.

+0

Итак, как мне получить прозрачный цвет границы? Можете ли вы загрузить рабочий образец кода где-нибудь? – subanki

+0

Я пробовал ваш метод, единственная проблема в том, что когда я изменяю непрозрачность основной формы, дочерняя форма также меняет ее непрозрачность. – subanki

+0

Извините ... неправильно понял qeustion (не знаю, как, но я сделал). Я испортил код, отправленный giodamelio, и я думаю, что у меня это получилось. Проверьте мой обновленный ответ. – Peter

2

Вы должны это проверить. Это в C#, но вы можете попытаться получить помощь в переводе. Extending Form with Non-Client Area Painting. Это намного выше моей головы, и, поскольку вы новичок, это может быть довольно сложно.

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

Главная форма

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.

+0

Ницца, спасибо. У меня также было что-то подобное. Я пробовал ваш код, он работает хорошо. проблема только с фокусом, когда я нажимаю на фоновой форме, она появляется поверх основной формы ... любым способом поставить ее всегда в фоновом режиме основной формы, используя topmost = true? Также, если возможно, вы можете сказать, как это сделать в WPF. Я не очень люблю это. Я только что начал vb.net вчера: P – subanki

+0

Это та самая проблема, с которой я столкнулся и не мог понять. Но его поздняя и программирующая часть моего мозга отключилась около часа назад: |. Я дам ему еще одну трещину утром. – giodamelio

+0

ok, Еще раз спасибо – subanki

Смежные вопросы