Hallo Leute,
ich bin neu hier - und auch relativ neu bei VB.Net. Habe damit im November letzten Jahres angefangen (zuerst WinForms) und bin nun dabei, mein Projekt und Wissen zu erweitern und auf WPF umzustellen (alles in Eigenarbeit und nur mittels Büchern und Web-Recherche). Doch leider stoße ich nun auf ein Problem, bei dem mir einfach keine Web-Recherche mehr helfen kann. Vielleicht kann es ja einer hier.
Zur kurzen Übersicht: Ich schreibe für Freunde ein Programm, um Game-Statistiken zu verfolgen und sie möchten diese gerne auch im Stream anzeigen. Deshalb habe ich eine Oberfläche gestaltet, die der User benutzt und über diese werden auch alle Eingaben und Aktivitäten ausgeführt. Darüber hinaus gibt es zwei verschiedene Anzeige-Controls, die das Resultat anzeigen (je nach gewähltem Modus). Da diese aber auch im Stream über andere Dinge eingeblendet werden sollen, schreibe ich diese Controls in eine PNG-Datei, welche wiederum eingeblendet wird im Stream, sodass ich mit Transparenzen arbeiten kann.
Das kleine Anzeigefenster funktioniert tatsächlich auch komplett problemlos, hier der Code für die Bitmap:
zur kurzen Erläuterung:
Es wird das angezeigt Referenz-Panel mitgegeben und ein neues Panel erzeugt. Nun weise ich diesem Panel alle Werte zu (kopiere die Werte in das neue Panel) und erstelle den Pfad zur Abspeicherung.
Hiernach setze ich die Window-State auf Minimized, da ich nicht möchte, dass das kopierte Window angezeigt wird. Das Window wird in die Datei geschrieben und wieder geschlossen. Das funktioniert auch komplett problemlos. Die Datei enthält ein komplettes Abbild des Fensters.
Bei dem größeren Anzeigebild verfahre ich eigentlich genauso. Hier ist aber das Problem, dass ich in der PNG-Datei nur eine kleine Anzeige erhalte, wenn ich Window-State auf minimized setze, während ich das richtige Resultat erhalte, wenn ich window-state auf normal stehen habe. Ich weiß nicht, woran das liegt... und langsam komme ich ans Verzweifeln. Hier der Code des anderen Fensters (er ist noch nicht fertig, da ich alle weiteren Werte erst kopieren wollte, wenn das Exportieren einwandfrei funktioniert):
Vielleicht hat ja der eine oder andere, eine Ahnung, was das Problem ist oder wie man das besser lösen kann.
Mein Problem ist, dass ich es in einem Extra-Fenster machen muss (faktisch das Panel kopieren), da ich nicht das angezeigte Panel mit Transparenz haben kann und auch das andere Bild nicht bei jedem Update ne angezeigt haben möchte. Ich wäre für jede Hilfe, jeden Einwand und jede Unterstützung dankbar - vor allem, da ich noch nicht so lange dabei bin
ich bin neu hier - und auch relativ neu bei VB.Net. Habe damit im November letzten Jahres angefangen (zuerst WinForms) und bin nun dabei, mein Projekt und Wissen zu erweitern und auf WPF umzustellen (alles in Eigenarbeit und nur mittels Büchern und Web-Recherche). Doch leider stoße ich nun auf ein Problem, bei dem mir einfach keine Web-Recherche mehr helfen kann. Vielleicht kann es ja einer hier.
Zur kurzen Übersicht: Ich schreibe für Freunde ein Programm, um Game-Statistiken zu verfolgen und sie möchten diese gerne auch im Stream anzeigen. Deshalb habe ich eine Oberfläche gestaltet, die der User benutzt und über diese werden auch alle Eingaben und Aktivitäten ausgeführt. Darüber hinaus gibt es zwei verschiedene Anzeige-Controls, die das Resultat anzeigen (je nach gewähltem Modus). Da diese aber auch im Stream über andere Dinge eingeblendet werden sollen, schreibe ich diese Controls in eine PNG-Datei, welche wiederum eingeblendet wird im Stream, sodass ich mit Transparenzen arbeiten kann.
Das kleine Anzeigefenster funktioniert tatsächlich auch komplett problemlos, hier der Code für die Bitmap:
VB.NET-Quellcode
- Public Shared Sub CreateBitmap(ByVal reference As RankedPanel)
- Try
- Dim frmRankedBitmap As New RankedPanel()
- 'frmRankedBitmap.Measure(New Windows.Size(reference.ActualWidth, reference.ActualHeight))
- 'frmRankedBitmap.Arrange(New Rect(New Windows.Size(reference.ActualWidth, reference.ActualHeight)))
- 'frmRankedBitmap.UpdateLayout()
- Dim path = My.Settings.BitmapextractionPath
- 'frmRankedBitmap.Width = reference.Width
- 'frmRankedBitmap.Height = reference.Height
- If Not IO.Directory.Exists(path) Then IO.Directory.CreateDirectory(path)
- 'If Not IO.File.Exists(path) Then IO.File.Create(path)
- path += "/RankedOverlay.png"
- frmRankedBitmap.Margin = New Thickness(0, 0, 0, 0)
- frmRankedBitmap.OuttaBorder.BorderBrush = New BrushConverter().ConvertFromString("Transparent")
- frmRankedBitmap.OuttaBorder.Background = New BrushConverter().ConvertFromString("Transparent")
- frmRankedBitmap.Copyright.Content = reference.Copyright.Content
- frmRankedBitmap.LblWonHead.Content = reference.LblWonHead.Content
- frmRankedBitmap.LblLossHead.Content = reference.LblLossHead.Content
- frmRankedBitmap.LblRatioHead.Content = reference.LblRatioHead.Content
- frmRankedBitmap.Won.Content = reference.Won.Content
- frmRankedBitmap.Won.RenderSize = reference.Won.RenderSize
- frmRankedBitmap.Loss.Content = reference.Loss.Content
- frmRankedBitmap.Ratio.Content = reference.Ratio.Content
- frmRankedBitmap.Foreground = reference.Foreground
- frmRankedBitmap.FontFamily = reference.FontFamily
- frmRankedBitmap.ResizeMode = ResizeMode.NoResize
- frmRankedBitmap.WindowState = WindowState.Minimized
- frmRankedBitmap.Show()
- Dim DrawVis As DrawingVisual = New DrawingVisual()
- Dim rectangles As Rect = VisualTreeHelper.GetDescendantBounds(frmRankedBitmap)
- Dim drawContext As DrawingContext = DrawVis.RenderOpen()
- Using drawContext
- Dim conBrush As VisualBrush = New VisualBrush(frmRankedBitmap)
- drawContext.DrawRectangle(conBrush, Nothing, New Rect(rectangles.Size))
- End Using
- Dim renderBitmap As RenderTargetBitmap = New RenderTargetBitmap(10 * frmRankedBitmap.Width, 10 * frmRankedBitmap.Height, 10 * 120, 10 * 120, PixelFormats.Pbgra32)
- renderBitmap.Render(frmRankedBitmap)
- Dim encoder As PngBitmapEncoder = New PngBitmapEncoder()
- encoder.Frames.Add(BitmapFrame.Create(renderBitmap))
- Dim fS As New IO.FileStream(path, IO.FileMode.Create)
- encoder.Save(fS)
- fS.Dispose()
- fS = Nothing
- frmRankedBitmap.Close()
- 'Using fS As IO.FileStream = New IO.FileStream(path, IO.FileMode.Create)
- ' Dim wbitmap As WriteableBitmap = New WriteableBitmap(frmRankedBitmap.Width, frmRankedBitmap.Height, 300, 300, PixelFormats.Bgra32, BitmapPalettes.Halftone256Transparent)
- ' wbitmap.WritePixels()
- ' Dim encoder As PngBitmapEncoder = New PngBitmapEncoder()
- ' encoder.Frames.Add(BitmapFrame.Create())
- 'End Using
- Catch ex As Exception
- Dim err As New OK("Ranked Bitmap Creation Error", "An error has occured while trying to create a Bitmap-File. " & vbNewLine & ex.Message)
- End Try
- End sub
zur kurzen Erläuterung:
Es wird das angezeigt Referenz-Panel mitgegeben und ein neues Panel erzeugt. Nun weise ich diesem Panel alle Werte zu (kopiere die Werte in das neue Panel) und erstelle den Pfad zur Abspeicherung.
Hiernach setze ich die Window-State auf Minimized, da ich nicht möchte, dass das kopierte Window angezeigt wird. Das Window wird in die Datei geschrieben und wieder geschlossen. Das funktioniert auch komplett problemlos. Die Datei enthält ein komplettes Abbild des Fensters.
Bei dem größeren Anzeigebild verfahre ich eigentlich genauso. Hier ist aber das Problem, dass ich in der PNG-Datei nur eine kleine Anzeige erhalte, wenn ich Window-State auf minimized setze, während ich das richtige Resultat erhalte, wenn ich window-state auf normal stehen habe. Ich weiß nicht, woran das liegt... und langsam komme ich ans Verzweifeln. Hier der Code des anderen Fensters (er ist noch nicht fertig, da ich alle weiteren Werte erst kopieren wollte, wenn das Exportieren einwandfrei funktioniert):
VB.NET-Quellcode
- Public Shared Sub CreateBitmap(ByVal reference As EventPanel)
- Try
- Dim frmEventPanel As New EventPanel(True)
- frmEventPanel.Measure(New Windows.Size(reference.ActualWidth, reference.ActualHeight))
- frmEventPanel.Arrange(New Rect(New Windows.Size(reference.ActualWidth, reference.ActualHeight)))
- frmEventPanel.UpdateLayout()
- frmEventPanel.RenderSize = reference.RenderSize
- frmEventPanel.Width = reference.ActualWidth
- frmEventPanel.Height = reference.ActualHeight
- frmEventPanel.FontFamily = reference.FontFamily
- frmEventPanel.Foreground = reference.Foreground
- frmEventPanel.txBWH.RenderSize = reference.txBWH.RenderSize
- frmEventPanel.txBWH.Foreground = reference.Foreground
- Dim path = My.Settings.BitmapextractionPath
- If Not IO.Directory.Exists(path) Then IO.Directory.CreateDirectory(path)
- path += "/EventOverlay.png"
- frmEventPanel.Margin = New Thickness(0, 0, 0, 0)
- frmEventPanel.OuttaBorder.BorderBrush = New BrushConverter().ConvertFromString("Transparent")
- frmEventPanel.OuttaBorder.Background = New BrushConverter().ConvertFromString("Transparent")
- frmEventPanel.Copyright.Text = reference.Copyright.Text
- frmEventPanel.ResizeMode = ResizeMode.NoResize
- frmEventPanel.WindowState = WindowState.Minimized
- 'Headliner
- frmEventPanel.txBWH.Text = reference.txBWH.Text
- frmEventPanel.txBLH.Text = reference.txBLH.Text
- frmEventPanel.txBVH.Text = reference.txBVH.Text
- Console.WriteLine(frmEventPanel.txBVH.Text)
- 'For i As Integer = 1 To My.Settings.NumberOfRuns - 1
- ' 'TxBWin
- ' Dim cpytxB, txB As TextBlock
- ' cpytxB = frmEventPanel.FindName("txBW" & i)
- ' txB = reference.FindName("txBW" & i)
- ' cpytxB.Inlines.Clear()
- ' 'TxBLose
- ' Dim cpytxL, txL As TextBlock
- ' cpytxL = frmEventPanel.FindName("txBL" & i)
- ' txL = reference.FindName("txBL" & i)
- ' cpytxL.Inlines.Clear()
- ' 'TxBValue
- ' Dim cpytxV, txV As TextBlock
- ' cpytxV = frmEventPanel.FindName("txBV" & i)
- ' txV = reference.FindName("txBV" & i)
- ' cpytxV.Inlines.Clear()
- ' For k As Integer = 0 To txB.Inlines.Count - 1
- ' 'wins
- ' Dim s As String = XamlWriter.Save(txB.Inlines.ElementAt(k))
- ' Dim st As New MemoryStream(ASCIIEncoding.Default.GetBytes(s))
- ' cpytxB.Inlines.Add(XamlReader.Load(st))
- ' Next
- ' For k As Integer = 0 To txL.Inlines.Count - 1
- ' 'losses
- ' Dim s As String = XamlWriter.Save(txL.Inlines.ElementAt(k))
- ' Dim st As New MemoryStream(ASCIIEncoding.Default.GetBytes(s))
- ' cpytxL.Inlines.Add(XamlReader.Load(st))
- ' Next
- ' For k As Integer = 0 To txV.inlines.Count - 1
- ' Dim s As String = XamlWriter.Save(txV.Inlines.ElementAt(k))
- ' Dim st As New MemoryStream(ASCIIEncoding.Default.GetBytes(s))
- ' cpytxV.Inlines.Add(XamlReader.Load(st))
- ' Next
- 'Next
- Debug.WriteLine(frmEventPanel.IsLoaded)
- frmEventPanel.UpdateLayout()
- frmEventPanel.Show()
- frmEventPanel.UpdateLayout()
- Debug.WriteLine(frmEventPanel.IsLoaded)
- 'frmEventPanel.OuttaBorder.BorderBrush = New BrushConverter().ConvertFromString("Transparent")
- 'frmEventPanel.OuttaBorder.Background = New BrushConverter().ConvertFromString("Transparent")
- 'System.Threading.Thread.Sleep(10000)
- Dim DrawVis As DrawingVisual = New DrawingVisual()
- Dim rectangles As Rect = VisualTreeHelper.GetDescendantBounds(frmEventPanel)
- Dim drawContext As DrawingContext = DrawVis.RenderOpen()
- Using drawContext
- Dim conBrush As VisualBrush = New VisualBrush(frmEventPanel)
- drawContext.DrawRectangle(conBrush, Nothing, New Rect(rectangles.Size))
- End Using
- Dim renderBitmap As RenderTargetBitmap = New RenderTargetBitmap(10 * frmEventPanel.Width, 10 * frmEventPanel.Height, 10 * 120, 10 * 120, PixelFormats.Pbgra32)
- renderBitmap.Render(frmEventPanel)
- Dim encoder As PngBitmapEncoder = New PngBitmapEncoder()
- encoder.Frames.Add(BitmapFrame.Create(renderBitmap))
- Dim fs As New IO.FileStream(path, IO.FileMode.Create)
- encoder.Save(fs)
- Debug.WriteLine(frmEventPanel.IsLoaded)
- fs.Dispose()
- fs = Nothing
- ' System.Threading.Thread.Sleep(10000)
- frmEventPanel.Close()
- Catch ex As Exception
- Debug.WriteLine(ex.Message)
- Dim err As New OK("EventBitmapCreationError", "An error has occured while trying to create a Bitmap-File. " & vbNewLine & ex.Message)
- End Try
- End Sub
Vielleicht hat ja der eine oder andere, eine Ahnung, was das Problem ist oder wie man das besser lösen kann.
Mein Problem ist, dass ich es in einem Extra-Fenster machen muss (faktisch das Panel kopieren), da ich nicht das angezeigte Panel mit Transparenz haben kann und auch das andere Bild nicht bei jedem Update ne angezeigt haben möchte. Ich wäre für jede Hilfe, jeden Einwand und jede Unterstützung dankbar - vor allem, da ich noch nicht so lange dabei bin