WPF自定义控件——使用Win32控件

本文配套源码

虽然WPF很强大,但是有些东西win32做的已经很好,我们完全可以拿来主义。

一.如何创建一 个win32控件

1.首先定义一个WNDCLASSEX的类,参考 http://baike.baidu.com/view/1750396.html?tp=0_11

WNDCLASSEX wndClsEx = new  WNDCLASSEX();
wndClsEx.Init();//(uint)Marshal.SizeOf(this);得到类的大小
wndClsEx.style = WndClassType.CS_VREDRAW | WndClassType.CS_HREDRAW;//窗口的风格
wndClsEx.lpfnWndProc = new WndProcDelegate(User32Dll.DefWindowProc);//处理类的消息,这 里用的是默认处理
wndClsEx.cbClsExtra = 0;//指定紧跟在窗口类结构后的附加字节数
wndClsEx.cbWndExtra = 0;//如果一个应用程序在资源中用CLASS伪指令注册一个对话框类时,则必 须把这个成员设成DLGWINDOWEXTRA
wndClsEx.hInstance = Kernal32Dll.GetModuleHandle (null);//模块的句柄
wndClsEx.hIcon = IntPtr.Zero;//图标句柄
wndClsEx.hIconSm =  IntPtr.Zero;//和窗口类关联的小图标。如果该值为NULL。则把hCursor中的图标转换成大小合适的小 图标。
wndClsEx.hCursor = IntPtr.Zero;//光标句柄
wndClsEx.hbrBackground =  IntPtr.Zero;//背景画刷句柄
wndClsEx.lpszClassName = m_WndClsName;//定义自己的类名, 比如curry,或XXX
wndClsEx.lpszMenuName = null;//菜单名称

2.注册类,返回 值非0为成功

bool success = User32Dll.RegisterClassEx(ref wndClsEx) !=  0;
Debug.Assert(success, "RegisterWndClass failed.");

3.创建 窗口,参考http://baike.baidu.com/view/1080304.htm

IntPtr windowHandle =  User32Dll.CreateWindowEx(ExtendedWndStyle.WS_EX_LAYOUTRTL//扩展样式
, m_WndClsName  //刚才注册完的名称
, null     //窗体名称
, WndStyle.WS_VISIBLE |  WndStyle.WS_CHILD //子窗体
, this.Left //X坐标
, this.Top //Y 坐标
,  this.Width //宽度
, this.Height //高度
, this.Parent.Handle //父对象句柄
, IntPtr.Zero //上下文菜单句柄
, Kernal32Dll.GetModuleHandle(null)//实例句柄
, IntPtr.Zero//指向一个值的指针,该值传递给窗口 WM_CREATE消息
);
Debug.Assert(User32Dll.IsWindow(windowHandle), "CreateWindowEx  failed.");

如果你想参考其它窗口的样式的信息的话,可以用Spy++这个工具看


4.显示窗口

User32Dll.ShowWindow(windowHandle, (int) (this.Visible ? WindowShowStyle.Show : WindowShowStyle.Hide));

5.销毁窗口 ,注销类

User32Dll.DestroyWindow(windowHandle);
windowHandle =  IntPtr.Zero;

User32Dll.UnregisterClass(m_WndClsName,  Kernal32Dll.GetModuleHandle(null));

时间: 2025-01-31 05:42:34

WPF自定义控件——使用Win32控件的相关文章

WPF中引入WindowsForms控件的方法_C#教程

本文实例讲述了WPF中引入WindowsForms控件的方法.分享给大家供大家参考,具体如下: 环境: [1]WindowsXP with SP3 [2]VS2008 with SP1 正文: Step1:在现有工程中引入Windows Forms 鼠标右键[References]->选择[Add Reference]->[.NET]标签页 加入[WindowsFormsIntegration]和[System.Windows.Forms]两项 Step2:在XAML文件里加入 [S2-1]加

WPF中使用MediaElement控件来进行音视频播放

WPF中可以使用MediaElement控件来进行音视频播放,然后需要做个进度条啥的,但是MediaElement.Position(进度)和MediaElement.NaturalDuration居然都不是依赖属性,简直不能忍! 好吧,首先说说比较传统的做法(winform?) slider用来显示进度以及调整进度,tb1显示当前进度的时间值,tb2显示视频的时长. player_Loaded 事件中使用DispatcherTimer来定时获取当前视频的播放进度, player_MediaOp

Android自定义控件之组合控件学习笔记分享_Android

我们来讲一下自定义组合控件,相信大家也接触过自定义组合控件吧,话不多说,直接干(哈~哈~): 大家看到这个觉得这不是很简单的吗,这不就是写个布局文件就搞定嘛,没错,确实直接上布局就行,不过,我只是用这个简单的例子来讲一下自定义组合控件的用法. 首先看看,这一行行的条目看起来都长得差不多,只是图片和文字不一样,没错,就是看中这一点,我们可以把一个条目做成一个组合控件,做为一个整体,这样不管你有几个条目,就写几个组合控件就行了. 步骤: 1.先建立组合控件的布局 myView.xml <Relati

控件位置-c#如何让自定义控件中的控件随父控件变化而其位置按比例变化

问题描述 c#如何让自定义控件中的控件随父控件变化而其位置按比例变化 如图,如何让c随着b的变化而变化,b是自定义控件 解决方案 你可以通过dock和anchors控制它的自动位置,你所说的按比例,没明白,感觉你可能需要写代码,在resize事件中处理具体比例 解决方案二: 我做过一个类似的,就是在resize中计算相对应的比例然后缩放控件大小再计算对应位置重新放置控件. 解决方案三: 这个最简单的是用flowlayoutpanel和tablelayoutpanel去布局,子控件dock在里面就

CYQ.Data 支持WPF相关的数据控件绑定(2013-08-09)

事件的结果 经过多天的思考及忙碌的开发及测试,CYQ.Data 终于在UI上全面支持WPF,至此,CYQ.Data 已经可以方便支持wpf的开发,同时,框架仍保留最低.net framework2.0版本的支持. 支持WPF的起因: CYQ.Data 一直是基于2.0语法下支持开发的框架,在未直接支持WPF之前,对于控件列表的绑定,因为WPF竟然不支持DataTable,研究后发现需要从MDataTable.ToDataTable().DefaultView来转一次绑定:另外对于UI控件,也只能

winform-c#2010的wpf程序怎么设置控件不可见?

问题描述 c#2010的wpf程序怎么设置控件不可见? winform的控件可以通过设置visible的值实现是否可见,但wpf不存在visible属性. 解决方案 label1.Visibility = Visibility.Hidden;//设置为隐藏 解决方案二: 隐藏:控件名.Visibility=Visibility.Hidden 显示: 控件名.Visibility=Visibility.Visible

wpf中的用户控件库项目不能使用WindowsFormsHost??急!!!

问题描述 基于sharpdevelop框架的WPF开发,想在用户控件库项目中使用reportviewer控件,用了WindowsFormsHost,但是运行后不显示reportviewer.如果换成wpf窗体,就能显示reportviewer界面和数据.wpf中的用户控件库项目不能使用WindowsFormsHost吗? 解决方案 解决方案二:WindowsFormsHost是专门为window窗体设计的.放弃吧

WPF:DataTemplateSelector设置控件不同的样式

原文 WPF:DataTemplateSelector设置控件不同的样式 最近想实现这么个东西,一个ListBox, 里面的ListBoxItem可能是文本框.下拉框.日期选择控件等等. 很自然的想到了DataTemplateSelector,并且事先定义好各类DataTemplate以显示不同的控件. 先定义好各类资源     <Window.Resources>         <DataTemplate x:Key="textBox">          

Windows窗体控件如何给WPF窗体中的控件传递信息????????

问题描述 请问大家,我这里有两个工程,一个是WPF窗体工程,一个是Windows窗体控件.然后WPF窗体工程中加载了Windows窗体控件.现在我再在WPF窗体中加入两个TextBox控件,我希望鼠标在Windows窗体控件内移动鼠标的时候,Windows窗体控件的Mouse_Move事件触发,并且该事件中能够编写代码把鼠标当前位置的X,Y坐标分别显示在WPF窗体的TextBox控件内.请问,这如何实现呢? 解决方案 解决方案二:自己顶一下.望大家帮忙.解决方案三:PostMessage解决方案