快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-22
X_TRANSPARENT | ExtendedWndStyle.WS_EX_NOACTIVATE。在c#中通过重载CreateParams属性设置ExStyle来实现。

用User32Dll.GetDC方法得到窗口的DC

用GDI32Dll.CreateCompatibleDC构建一个内存DC

用GDI32Dll.GdipCreateHBITMAPFromBitmap创建与设备无关的GDI的图片并为该图片分配内存,在c#中可 以用Bitmap的实例方法GetHbitmap(Color.FromArgb(0))来实现

通过GDI32Dll.SelectObject把 GDI图片放到GDI32Dll.CreateCompatibleDC创建出的内存中

当然也可以通过 GDI32Dll.GdipCreateFromHDC获取Graphics对象,在c#中可以用Graphics.FromHdcInternal在上面画些 字了,圆圈什么,或者再加张图片,当然你也可以在图片上直接画。

创建BLENDFUNCTION,利用 AlphaBlend来控制位图的透明度

用User32Dll.UpdateLayeredWindow来更新显示

上面的步 骤就可以得到一个透明的背景画面,然后在上面放个实际有控件的窗体,把窗体样式调成无样式,把背 景设置成透明就OK了,这样的话就会有两个窗体,看起来比较蠢,却经常被使用的。当然你还要注意的 是拖动一个窗体的时候得使另外的窗体也移动,隐藏的时候两个都隐藏,关闭的时候当然两个都关闭了 。

创建不规则窗体还有其他的方法如路径法,还有用层的话可以用自绘控件不过难 度大些,现在最简单的不规则窗口自然是WPF 了^-^。

在WPF中实际也是一样的,win32控件就是 上面所说的最上面的那个显示控件,当WPF在移动的时候我们就让win32控件也跟着移动,除了最基本的 移动以外,我们还要处理TAB健的切换,以及一些助记键和快捷键等一些消息。听起来是不是很麻烦,不 过没有关系,WPF中有个类HwndHost已经帮我们封装好了,我们只需要继承该类,然后重载 BuildWindowCore函数,返回我们创建控件的HandleRef就可以了 。

http://msdn.microsoft.com/en-us/library/ms752055.aspx

除了以上链接中微软的那种 做法,对于Winform的控件呢?自然是更简单了(其中UserControl1 为Winform控件继承自UserControl )

protected override HandleRef BuildWindowCore(HandleRef hwndParent)
{
UserControl1 userControl = new UserControl1();
userControl.Height =  hostHeight;
userControl.Width = hostWidth;
User32Dll.SetParent (userControl.Handle, hwndParent.Handle);

return new HandleRef(userControl,  userControl.Handle);
}

你也可以重载HwndHost中的WndProc来获取消息,重载 DestroyWindowCore来销毁窗体以及一些非托管的东西。

三.Transform

WPF不可以对非WPF 控件进行Transform操作,但是对于我们自定义的控件仍然可以曝露消息进行一些Transform 操作, Transform 一般来说就是Matrix的实现,对于Matrix我们先来做道题:

已知圆心O(0,0) ,在坐 标轴上有一点P( x , y ), 逆时针旋转OP a度,使得P点到P1(x1,y1),用x,y表示p1点的坐标。

解:显然P1 O等于 PO,作 X轴上任意一点M,假设我们的角MOP为b度,又已知角 P1OP为a度。

那么得

x1 = PO * COS(a+b)

y1=  PO * SIN(a+b)

展开得

x1 = PO * COS(a) * COS(b) – PO * SIN(a) * SIN(b)

y1 = PO * SIN(a)* COS (b) + PO * COS(a) * SIN(b)

因为

x = PO * COS(b)

y = PO * SIN(b)

代 入上式得

x1 = x * COS(a) – y*SIN(a)

y1 = y*COS(a) + x*SIN(a)

如果你 对三角函数忘的够彻底的话请看

http://zh.wikipedia.org/w/index.php?title=三角函数 &variant=zh-cn

用矩阵表示移动前的点

x1[1*x ,0*y]

y1[0*x ,1*y]

移动后转变成了

x           y

x1 [COS(a) ,  –SIN(a)]

y1 [COS(a) ,    SIN(a)]

当然我们可能还有偏移量,比如向正方向竖移2个单位,向正单位横移1 个单位,也就是做了个仿射变换

x

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号