快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-22
1 [COS(a) ,  –SIN(a)]

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

z   [ 1         ,    2       ]

为了变化方便所以还加 了一列,这样的话上面的平移我们还可以这样得到

[1,0,0] * x1 [COS(a) , –SIN(a) ,0]

[0,1,0] * y1 [COS(a) ,   SIN(a) ,0]

[1,2,1] * z   [0         ,     0       ,1]

注意:矩阵的乘法中 A*B 不等于 B * A 。

http://zh.wikipedia.org/w/index.php?title=变换矩阵&variant=zh- cn#.E4.BB.BF.E5.B0.84.E5.8F.98.E6.8D.A2

http://zh.wikipedia.org/w/index.php?title=矩 阵&variant=zh-cn

从以上你是感觉Matrix就是一个点的变化么,把图像中的每个点都逆时针旋转下,图像就斜了,或许 你可以模拟出WPF中的RotateTransform、ScaleTransform、SkewTransform、TranslateTransform  这 些类的效果。

对于WPF中当前的Matrix可以这样得到 Matrix m = PresentationSource.FromVisual(this).CompositionTarget.TransformToDevice;

四.消息通知

知道了这些我们就可以把Matrix作为参数发送个win32自定义画图让其也一起旋转,变化.对于非 托管控件我们通常使用SendMessage来传递消息,这里用winform来做例子。

这里我们先来看下 http://hi.baidu.com/cyap/blog/item/9aebca0f5e4c612c6159f300.html这个网页对p\invoke中发送消息 的一些使用说明;其中我们还要注意SendMessage中的第四个参数如果传递的是int,struct,string,byte 类型就相对容易些;在Marshal中便有对应的函数读取 Marshal.PtrToStructure,Marshal.PtrToStringAuto处理,假如传递是类的话,先要序列化,转化成2进 制之后,因为从指针中并不能知道到这个指针所申请的空间大小,所以需要一个结构体来保存这个2进制 数据的指针,以及他的长度。

public struct CopyDataStruct
{
///  <summary>
/// 数据长度
/// </summary>
public int cbData;
/// <summary>
/// 数据首地址指针
/// </summary>
public  IntPtr lpData;
}

private void SendMessage()
{
System.Drawing.Drawing2D.Matrix matrix = new System.Drawing.Drawing2D.Matrix();

BinaryFormatter formatter = new BinaryFormatter();
byte[] datas;
using (System.IO.MemoryStream mStream = new System.IO.MemoryStream())
{
formatter.Serialize(mStream, matrix);
datas = mStream.ToArray();
}

int length = datas.Length;
IntPtr ptr = Marshal.AllocHGlobal(length);
Marshal.Copy(datas, 0, ptr, length);
CopyDataStruct data = new  CopyDataStruct();
data.cbData = length;
data.lpData = ptr;

SendMessage(hwndListBox, 700, 0, ref data);
Marshal.FreeHGlobal(ptr);
}

protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == 700)
{
CopyDataStruct data = new  CopyDataStruct();
data = (CopyDataStruct)m.GetLParam(data.GetType());
byte[]  datas = new byte[data.cbData];
Marshal.Copy(data.lpData, datas, 0,  data.cbData);

BinaryFormatter formatter = new BinaryFormatter();
using  (System.IO.MemoryStream mStream = new System.IO.MemoryStream(datas))
{
//得 到对象
object obj = formatter.Deserialize(mStream);
}
}
}

当然如果你感觉比较麻烦的话,也可以把这两个值分别放在WParam和LParam传送(这个 做法不推荐)。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号