WPF初体验

前段时间无聊装了个VS2010RC, 然后试着建个了WPF的工程, 体验了一番.

刚开始没觉得这东西比WinForms方便在哪, 只是觉得它是一套跟Win32/MFC/WinForms完全不同的的东西. Win32/MFC/WinForms只要了解了消息循环机制, 理解起来就比较容易, 可WPF冒似没这套东西. 而且, HWND已经不存在于控件上了, 这是一个令人很不习惯的地方. 要知道不论什么UI库, 要想跟DirectX一起使用的话, 必须有一个HWND来指定绘制区域.

那么问题就来了: 怎么用WPF做一个DX的编辑工具?

最早看到过的方式是WPF提供的D3DImage类. 这个类的作用就是把BackBuffer拷贝过来, 然后再用WPF那一套东西来显示. 这样的好处就是可以跟WPF的排版/Alpha融合什么的无缝结合, 但是, 由于中间多了一个拷贝, 会影响一部分效率. 再者, D3D9在XP和Vista上的处理方式不一样. 还有一个更麻烦的事: WPF是基于D3D9的, 这就意味着GL/DX10/DX11就不能直接利用这种方式来整合.

所以呢, 还是要通过HWND的传统方式来. 因为绘制区域的半透明/变形之类的特性, 对于一个工具来说, 完全没有必要. WPF推出时, 也考虑到了向后兼容. 在WPF中显示Win32控件, 可以使用HwndHost, 而对于WinForms, 可以使用WindowsFormsHost. WinForms本质上也是HWND机制, 所以就不细说了, 有兴趣的可以看我之前写的文章. 这里主要说说HwndHost.

HwndHost是一个抽象类, 我们需要实现它. 使用起来很简单. 在BuildWindowCore里创建一个Win32子窗口, 并把这个窗口的HWND做为DX初始化的参数. 如果需要改变大小, 还需要实现OnRenderSizeChanged. 注意WPF的size是跟DPI设定有关系的, 需要一个缩放值. 如果还需要进行消息处理, 可以实现基类的WndProc. 那么, 还剩下一个问题: Render()在哪调用呢?

这个问题呢, 我也没找到一个完美的方式. 一种思路是在WndProc里, 这样的话, 只有在有WM消息触发时才会渲染, 就像UE3那个查看器一样, 鼠标不动, 它就不更新. 另一种思路是在HostWindow的调用端设置一个Timer, 通过固定间隔的触发来进行渲染. 这种方式可能会引起帧率无法自适应的问题, 但一般情况下是可以接受的. 最完美的方式就是找到WPF的主循环, 问题是WPF有这东西么? 有待研究.

WPF的优势是什么? 控件多样性不如WinForms, 与C++的交互便利性不如MFC, 为什么还要使用它呢? 目前来说, 最吸引人的地方就是DataBinding. 通过DataBinding, 可以直接把控件的某一个属性与对象的属性进行绑定, 不用写一堆的OnButtonClicked之类的事件响应函数, 也不用写一堆界面初始化函数. 另外, WPF把界面的布局放入了XAML里, 让代码变得更干净, 再也不用对着一堆button1, button2什么的骂娘了.

学习资料, 推荐两本电子书(ebookee上有):

Applications = Code + Markup By Charles Petzold.chm

Sams.Windows.Presentation.Foundation.Unleashed.Dec.2006.pdf

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • WPF工具开发: 第三库选择

    逍遥剑客
  • Nebula3嵌入WPF

    逍遥剑客
  • Nebula3学习笔记(5): IO系统

    逍遥剑客
  • 云计算,边缘计算和雾计算:了解每个计算的实际应用

    您的运营是建立在您自己的一般云基础设施,还是选择使用雾和边缘计算等更专业的工具,这些都取决于您的业务需求和抱负。

    静一
  • “红芯”:红装虽然穿在身,我心依然是谷歌芯

    十几年前的“汉芯造假门”事件让中国科技领域蒙上巨大耻辱,而今天,刚融资2.5亿元C轮融资并在官网号称“打破美国垄断,中国首个自主创新智能浏览器内核”的红芯浏览器...

    金融民工小曾
  • ​cobaltstrike使用笔记

    关于工具使用,我想说的是,工具使用很简单,难的是在实战中的灵活使用,高手的渗透一般不局限于某种工具,重要的是思维。

    用户5878089
  • 李理:自动梯度求解 反向传播算法的另外一种视角

    用户1737318
  • 云计算是过去式了,接下来是边缘计算的时代?

    很多营销人员现在已经习惯于云计算带来的优势,但是新的技术发展趋势正在逐步出现,可能会破坏云计算,或者从根本上重新确定云计算如何在边缘运营,新的技术趋势是边缘计算...

    SDNLAB
  • 代码桥接分类器:一种低开销或负开销防御(cs ML)

    在本文中,我们提出了代码桥接分类器(CBC),一种使卷积神经网络(CNN)抵御对抗攻击而不会增加甚至降低整体模型的计算复杂性的框架。 更具体而言,我们提出了一种...

    RockNPeng
  • 腾讯推出高性能计算平台Angel,数联医信与上饶市政府共同布局智慧医疗 | 大数据24小时

    数据猿导读 腾讯加速布局人工智能,推出第三代高性能计算平台Angel;基于大数据的教育科技公司“聚智未来”新三板募资8000万元;金融科技公司“海峰科技”获30...

    数据猿

扫码关注云+社区

领取腾讯云代金券