簡體   English   中英

如何在WPF應用程序的用戶控件中放置Win32浮動窗口?

[英]How can I position a Win32 floating window inside a user control in my WPF application?

使用派生自HwndHost的類和一些伏都HwndHost代碼:

protected override HandleRef BuildWindowCore(HandleRef hwndHost)
{
  CheckGuestValidity();
  var guestHwnd = new HandleRef(GuestHwnd, _guestHwnd);
  Win32.SetWindowStyle(guestHwnd.Handle, WindowStyles.WS_CHILD | Win32.GetWindowStyle(guestHwnd.Handle));
  WindowsFormsHost.EnableWindowsFormsInterop();
  System.Windows.Forms.Application.EnableVisualStyles();
  Win32.SetParent(guestHwnd.Handle, hwndHost.Handle);
  Win32.SetWindowStyle(_guestHwnd, Win32.GetWindowStyle(_guestHwnd) & ~WindowStyles.WS_CAPTION);
  return guestHwnd;
}

我已經設法從Delphi COM服務器獲得了一個其他的無父窗口(Windows主窗口除外),以采用我的WPF應用程序窗口作為父窗口。 問題是它位於WPF窗口最底部的所有其他用戶控件等下。 我想將其大小和位置設置為適合TabControl中選項卡上的矩形。 我該怎么辦? 我意識到這將需要一些調整大小和定位Win32 API調用的位置,甚至可能會包含一些低級別的Windows消息,但是我贊成。

首先,我找到了一個方便的小類,可以在坐標系之間進行轉換。 這是@ Lu55的答案,而不是公認的問題, 如何將WPF大小轉換為物理像素?

然后,我的WindowHostView XAML如下所示:

<Grid x:Name="WindowContainer" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="Coral" >
  <delphi:Win32WindowHost x:Name="Host" />
</Grid>

Win32WindowHost類是包含在我的問題中的代碼。

現在,我在WindowHostView有一個簡潔的小例程,以使來賓窗口適合主機的邊界。

private void PositionGuestWindow(IntPtr hWnd)
{
  var rect = WindowContainer.GetAbsoltutePlacement();
  var winLeft = Win32Calc.PointsToPixels(rect.Left, Win32Calc.Dimension.Width);
  var winTop = Win32Calc.PointsToPixels(rect.Top, Win32Calc.Dimension.Height);
  var winWidth = Win32Calc.PointsToPixels(rect.Width, Win32Calc.Dimension.Width);
  var winHeight = Win32Calc.PointsToPixels(this.ActualHeight - 20, Win32Calc.Dimension.Height);

  Win32Api.MoveWindow(Host.GuestHwnd, (int)winLeft, (int)winTop, (int)winWidth + 1, (int)winHeight, true);
}

Win32Api.MoveWindow很老了:

[DllImport("user32.dll", SetLastError = true)]
public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM