61 lines
1.9 KiB
C#
61 lines
1.9 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|