WPF自定义控件——使用Win32控件
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 )
你也可以重载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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |