更换为wpf
This commit is contained in:
60
SFMLRenderer/SFMLHwndHost.cs
Normal file
60
SFMLRenderer/SFMLHwndHost.cs
Normal file
@@ -0,0 +1,60 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Interop;
|
||||
using System.Windows.Media;
|
||||
|
||||
namespace SFMLRenderer
|
||||
{
|
||||
public class SFMLHwndHost : HwndHost
|
||||
{
|
||||
private HwndSource? _hwndSource;
|
||||
private SFML.Graphics.RenderWindow? _renderWindow;
|
||||
|
||||
public SFML.Graphics.RenderWindow? RenderWindow => _renderWindow;
|
||||
|
||||
public event EventHandler? RenderWindowBuilded;
|
||||
public event EventHandler? RenderWindowDestroying;
|
||||
|
||||
protected override HandleRef BuildWindowCore(HandleRef hwndParent)
|
||||
{
|
||||
var ps = new HwndSourceParameters(GetType().Name, (int)Width, (int)Height)
|
||||
{
|
||||
ParentWindow = hwndParent.Handle,
|
||||
WindowStyle = 0x40000000 | 0x10000000, // WS_CHILD | WS_VISIBLE
|
||||
HwndSourceHook = HwndMessageHook
|
||||
};
|
||||
_hwndSource = new HwndSource(ps);
|
||||
_renderWindow = new(_hwndSource.Handle);
|
||||
_renderWindow.SetActive(false);
|
||||
|
||||
RenderWindowBuilded?.Invoke(this, EventArgs.Empty);
|
||||
return new HandleRef(this, _hwndSource.Handle);
|
||||
}
|
||||
|
||||
protected override void DestroyWindowCore(HandleRef hwnd)
|
||||
{
|
||||
RenderWindowDestroying?.Invoke(this, EventArgs.Empty);
|
||||
|
||||
_renderWindow?.Close();
|
||||
var rw = _renderWindow;
|
||||
_renderWindow = null;
|
||||
rw?.Dispose();
|
||||
var hs = _hwndSource;
|
||||
_hwndSource = null;
|
||||
hs?.Dispose();
|
||||
}
|
||||
|
||||
private nint HwndMessageHook(nint hwnd, int msg, nint wParam, nint lParam, ref bool handled)
|
||||
{
|
||||
_renderWindow?.DispatchEvents();
|
||||
return nint.Zero;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user