您的位置:首页 > 其它

WPF调用winform(基于GDI)的控件和WPF窗体无边框的处理

2015-04-27 10:46 288 查看

WPF调用winform(基于GDI)的控件和WPF窗体无边框的处理

这是我在做流媒体播放器的时候遇到的问题,WPF不能调用基于GDI的控件让我很是头疼,市面上也仅仅只有一个VCL播放内核可以让WPF调用,其它的内核(例如:迅雷影音的内核 Aplayer)就不行了?经过一天的查询和测试让我成功的调用了播放内核 Aplayer,请看下面代码和解释。

1、创建一个 WPF 项目

2、添加引用:

① 程序集添加:WindowsFromsIntegration

② 程序集添加:System.Windows.Forms

③ 浏览添加你要使用的第三方控件(基于GDI)

3、在xaml前台页面中加入以下代码:

xmlns:winform="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
//注:以上用来在此窗体中创建一个winform的环境,个人理解(让WPF拥有一个 Winform 环境,为后续加载 GDI 控件做准备,这是关键)
xmlns:APlayer3Lib="clr-namespace:APlayer3Lib;assembly=Interop.APlayer3Lib"
xmlns:ap="clr-namespace:AxAPlayer3Lib;assembly=AxInterop.APlayer3Lib"
//注:以上是aplayer3 第三方控件声明
WindowStyle="None"
//注:去掉窗体标题,但不会去掉窗体边框(边框的问题下面会说到)

<winform:WindowsFormsHost >
<ap:AxPlayer x:Name="Aplayer3"/>
</winform:WindowsFormsHost>

//注:此处就是将aplayer控件放入拥有winform的环境中 (跳过不能加载 GDI 控件的限制,间接加载 APlayer)


4、如果使用wpf(基于DX渲染)自带的窗体透明属性,那么aplayer(基于 GDI 渲染)将不能绘制于窗体布局内,但是可以听到声音以及控制。

如何既能去掉边框也能让aplayer控件显示在窗体中呢?

只能使用 win32api 了,用它来给窗体去掉边框。

首先,现在给窗体创建一个 loaded 的事件,然后键入以下代码:

/// <summary>
/// 设置窗体的样式
/// </summary>
/// <param name="handle">操作窗体的句柄</param>
/// <param name="oldStyle">进行设置窗体的样式类型.</param>
/// <param name="newStyle">新样式</param>
[DllImport("User32.dll", CallingConvention = CallingConvention.Winapi)]
public static extern void SetWindowLong(IntPtr handle, int oldStyle, long newStyle);

private void Window_Loaded(object sender, RoutedEventArgs e)
{
try
{
IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper(this).Handle;
SetWindowLong(hwnd, -16, 369164288);
//这个地方在项目里面编译的话会出现异常,不用管它继续即可
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐