Browse Source

Merge pull request #90 from kekekeks/master

Added EmbeddedWindowImpl for embedding and designer support
pull/94/head
Steven Kirk 11 years ago
parent
commit
397acf0d4e
  1. 64
      src/Windows/Perspex.Win32/Embedding/EmbeddedWindowImpl.cs
  2. 3
      src/Windows/Perspex.Win32/Interop/UnmanagedMethods.cs
  3. 5
      src/Windows/Perspex.Win32/Perspex.Win32.csproj
  4. 20
      src/Windows/Perspex.Win32/Win32Platform.cs
  5. 14
      src/Windows/Perspex.Win32/packages.config

64
src/Windows/Perspex.Win32/Embedding/EmbeddedWindowImpl.cs

@ -0,0 +1,64 @@
namespace Perspex.Win32
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Interop;
using Perspex.Win32.Interop;
public class EmbeddedWindowImpl : WindowImpl
{
private static readonly System.Windows.Forms.UserControl WinFormsControl = new System.Windows.Forms.UserControl();
public HwndHost Host { get; set; }
private class FakeHost : HwndHost
{
private readonly IntPtr hWnd;
public FakeHost(IntPtr hWnd)
{
this.hWnd = hWnd;
}
protected override HandleRef BuildWindowCore(HandleRef hwndParent)
{
UnmanagedMethods.SetParent(this.hWnd, hwndParent.Handle);
return new HandleRef(this, this.hWnd);
}
protected override void DestroyWindowCore(HandleRef hwnd)
{
}
}
public IntPtr Handle { get; private set; }
public HwndHost CreateWpfHost()
{
return new FakeHost(this.Handle);
}
protected override IntPtr CreateWindowOverride(ushort atom)
{
var hWnd = UnmanagedMethods.CreateWindowEx(
0,
atom,
null,
(int)UnmanagedMethods.WindowStyles.WS_CHILD,
UnmanagedMethods.CW_USEDEFAULT,
UnmanagedMethods.CW_USEDEFAULT,
UnmanagedMethods.CW_USEDEFAULT,
UnmanagedMethods.CW_USEDEFAULT,
WinFormsControl.Handle,
IntPtr.Zero,
IntPtr.Zero,
IntPtr.Zero);
this.Handle = hWnd;
return hWnd;
}
}
}

3
src/Windows/Perspex.Win32/Interop/UnmanagedMethods.cs

@ -597,7 +597,8 @@ namespace Perspex.Win32.Interop
[DllImport("user32.dll")]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, SetWindowPosFlags uFlags);
[DllImport("user32.dll")]
public static extern bool SetParent(IntPtr hWnd, IntPtr hWndNewParent);
[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, ShowWindowCommand nCmdShow);

5
src/Windows/Perspex.Win32/Perspex.Win32.csproj

@ -34,6 +34,8 @@
<DocumentationFile>bin\Release\Perspex.Win32.XML</DocumentationFile>
</PropertyGroup>
<ItemGroup>
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
<Reference Include="Splat, Version=1.6.2.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll</HintPath>
<Private>True</Private>
@ -42,6 +44,7 @@
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xaml" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
@ -59,6 +62,7 @@
<Reference Include="System.Reactive.PlatformServices">
<HintPath>..\..\..\packages\Rx-PlatformServices.2.2.5\lib\net45\System.Reactive.PlatformServices.dll</HintPath>
</Reference>
<Reference Include="WindowsBase" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\..\Shared\SharedAssemblyInfo.cs">
@ -73,6 +77,7 @@
<Compile Include="WindowImpl.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Win32Platform.cs" />
<Compile Include="Embedding\EmbeddedWindowImpl.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />

20
src/Windows/Perspex.Win32/Win32Platform.cs

@ -48,12 +48,10 @@ namespace Perspex.Win32
get { return TimeSpan.FromMilliseconds(UnmanagedMethods.GetDoubleClickTime()); }
}
public static void Initialize()
private static void InitializeInternal()
{
var locator = Locator.CurrentMutable;
locator.Register(() => new PopupImpl(), typeof(IPopupImpl));
locator.Register(() => new WindowImpl(), typeof(IWindowImpl));
locator.Register(() => WindowsKeyboardDevice.Instance, typeof(IKeyboardDevice));
locator.Register(() => WindowsMouseDevice.Instance, typeof(IMouseDevice));
locator.Register(() => instance, typeof(IPlatformSettings));
@ -61,6 +59,22 @@ namespace Perspex.Win32
locator.RegisterConstant(new AssetLoader(), typeof(IAssetLoader));
}
public static void Initialize()
{
var locator = Locator.CurrentMutable;
locator.Register(() => new PopupImpl(), typeof(IPopupImpl));
locator.Register(() => new WindowImpl(), typeof(IWindowImpl));
InitializeInternal();
}
public static void InitializeEmbedded()
{
var locator = Locator.CurrentMutable;
locator.Register(() => new EmbeddedWindowImpl(), typeof(IPopupImpl));
locator.Register(() => new EmbeddedWindowImpl(), typeof(IWindowImpl));
InitializeInternal();
}
public bool HasMessages()
{
UnmanagedMethods.MSG msg;

14
src/Windows/Perspex.Win32/packages.config

@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Rx-Core" version="2.2.5" targetFramework="net45" />
<package id="Rx-Interfaces" version="2.2.5" targetFramework="net45" />
<package id="Rx-Linq" version="2.2.5" targetFramework="net45" />
<package id="Rx-Main" version="2.2.5" targetFramework="net45" />
<package id="Rx-PlatformServices" version="2.2.5" targetFramework="net45" />
<package id="Splat" version="1.6.2" targetFramework="net45" />
<package id="StyleCop.Analyzers" version="1.0.0-beta008" targetFramework="net45" developmentDependency="true" />
<package id="Rx-Core" version="2.2.5" targetFramework="net45" userInstalled="true" />
<package id="Rx-Interfaces" version="2.2.5" targetFramework="net45" userInstalled="true" />
<package id="Rx-Linq" version="2.2.5" targetFramework="net45" userInstalled="true" />
<package id="Rx-Main" version="2.2.5" targetFramework="net45" userInstalled="true" />
<package id="Rx-PlatformServices" version="2.2.5" targetFramework="net45" userInstalled="true" />
<package id="Splat" version="1.6.2" targetFramework="net45" userInstalled="true" />
<package id="StyleCop.Analyzers" version="1.0.0-beta008" targetFramework="net45" developmentDependency="true" userInstalled="true" />
</packages>
Loading…
Cancel
Save