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); } }
相关文章推荐
- winform 利用 多线程 处理窗体假死,利用 Invoke BeginInvoke 处理子线程调用 UI 控件报错的问题
- 如何在多线程中调用winform窗体控件
- Winform"窗体加载闪烁处理、无边框窗体的移动" 之 配餐系统的开发
- 【WPF】Winform调用WPF窗体注意事项
- 如何在多线程中调用winform窗体控件
- Winform"窗体加载闪烁处理、无边框窗体的移动" 之 配餐系统的开发
- WPF 调用API修改窗体风格实现真正的无边框窗体
- WinForm一个窗体调用另一个窗体的控件和事件的方法
- c#中跨线程调用windows窗体控件 .我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题,下面我将详细的介绍。
- C# WinForm窗体控件GroupBox修改边框颜色控件
- WPF设置启动窗体以及WPF项目中调用winform的方法
- 遍历winform窗体上的所有控件(包括DevExpress.XtraEditors控件)且对其做相应的处理
- 转:如何在多线程中调用winform窗体控件
- 如何在多线程中调用winform窗体控件
- Winform调用WebKitBrowser,基于chrome内核WebKit的浏览器控件
- 【转】【WPF】 WPF 调用API修改窗体风格实现真正的无边框窗体
- 如何在多线程中调用winform窗体控件2――实例篇
- WinForm中一个窗体调用另一个窗体的控件和事件的方法(附带源码)
- winform继承窗体,无法修改父窗体控件问题处理笔记