NHibernate可视化设计插件——Mindscape.NHibernateModelDesigner

小编向来盼望NHibernate能够援救像EF一样帮忙可视化操作,明天去网上搜了眨眼之间间,发现有二个插件,类似EF的可视化功效。

前段时间花38元从网上买了一对北通的USB游戏手柄,那样周末与夜间的赏月时光就足以玩玩孩儿时的SFC与街机模拟游戏了。图片 1

下载地址:Mindscape.NHibernateModelDesigner_crack.vsix

 

下载后,运行Mindscape.NHibernateModelDesigner_crack.vsix,实行设置,安装到位之后,在新建项指标时候,就会意识多了之类模版:

某日在有个别网站上玩一个Flash游戏时,突然想到,假设也能接纳手柄来玩Flash游戏,那该多爽图片 2
。但可惜的是,近期的Flash都以不帮忙对娱乐手柄进行编制程序,那不免是Flash中的贰个不满。。

 图片 3图片 4图片 5图片 6图片 7图片 8

虽说Flash中不支持对游乐手柄实行编制程序,但大家得以换种方式,做三个增派程序(外挂?图片 9
),将手柄中的操作事件转换为Flash中可承受的键盘与鼠标操作事件,那样不就可以动用游戏手柄来玩Flash游戏了吧?!于是,上网查了有关材质,但却发现只有C++方面包车型地铁案例,而C#3个也找不,那不打紧,本人入手,丰衣足食图片 10

用过EF的意中人应该很熟练,那一个界面就跟EF的可视化界面至极相似了。

 

开辟服务器财富管理器,然后连接受Northwind数据库

 

 图片 11

(注:类似那样的功效,网络已有现成的软件,是二个印尼人付出的,叫JoyToKey)

拖放之后,将会自动生成如下类

 

 图片 12

对游乐手柄进行操作,大约有二种办法:选用系统API只怕利用DirectInput操作游戏手柄设备。(可能还有任何措施,但自小编的文化范围有限,其余格局就不得而知了)

咱俩来看下那几个转变的类的源码

动用系统API是一种最简单易行的法子,因为系统已帮大家封装好了全部细节,我们只要在先后中定时得到游戏手柄设备的动静就能够了(轮循)。

图片 13图片 14

 

using System;
using System.Collections.Generic;
using NHibernate.Cfg;
using NHibernate.Validator.Constraints;

namespace Shop.Domain
{
  [System.CodeDom.Compiler.GeneratedCode("NHibernateModelGenerator", "1.0.0.0")]
  public partial class Customer
  {
    [NotNull]
    [Length(Max=5)]
    public virtual string CustomerId { get; set; }
    [NotNull]
    [Length(Max=40)]
    public virtual string CompanyName { get; set; }
    [Length(Max=30)]
    public virtual string ContactName { get; set; }
    [Length(Max=30)]
    public virtual string ContactTitle { get; set; }
    [Length(Max=60)]
    public virtual string Address { get; set; }
    [Length(Max=15)]
    public virtual string City { get; set; }
    [Length(Max=15)]
    public virtual string Region { get; set; }
    [Length(Max=10)]
    public virtual string PostalCode { get; set; }
    [Length(Max=15)]
    public virtual string Country { get; set; }
    [Length(Max=24)]
    public virtual string Phone { get; set; }
    [Length(Max=24)]
    public virtual string Fax { get; set; }

    private IList<Order> _orders = new List<Order>();

    public virtual IList<Order> Orders
    {
      get { return _orders; }
      set { _orders = value; }
    }

    static partial void CustomizeMappingDocument(System.Xml.Linq.XDocument mappingDocument);

    internal static System.Xml.Linq.XDocument MappingXml
    {
      get
      {
        var mappingDocument = System.Xml.Linq.XDocument.Parse(@"<?xml version='1.0' encoding='utf-8' ?>
<hibernate-mapping xmlns='urn:nhibernate-mapping-2.2'
                   assembly='" + typeof(Customer).Assembly.GetName().Name + @"'
                   namespace='Shop.Domain'
                   >
  <class name='Customer'
         table='`Customers`'
         >
    <id name='CustomerId'
        column='`CustomerID`'
        >
      <generator class='identity'>
      </generator>
    </id>
    <property name='CompanyName'
              column='`CompanyName`'
              />
    <property name='ContactName'
              column='`ContactName`'
              />
    <property name='ContactTitle'
              column='`ContactTitle`'
              />
    <property name='Address'
              column='`Address`'
              />
    <property name='City'
              column='`City`'
              />
    <property name='Region'
              column='`Region`'
              />
    <property name='PostalCode'
              column='`PostalCode`'
              />
    <property name='Country'
              column='`Country`'
              />
    <property name='Phone'
              column='`Phone`'
              />
    <property name='Fax'
              column='`Fax`'
              />
    <bag name='Orders'
          inverse='false'
          >
      <key column='`CustomerID`' />
      <one-to-many class='Order' />
    </bag>
  </class>
</hibernate-mapping>");
        CustomizeMappingDocument(mappingDocument);
        return mappingDocument;
      }
    }
  }
}

操作游戏手柄(杆)的API有以下多少个

View Code

函数名称 函数说明
joyGetNumDevs 获取当前系统支持的游戏设备数量
joyGetDevCaps 查询获取指定的游戏杆设备以确定其性能
joySetCapture 向系统申请捕获某个游戏设备并定时将该设备的状态值通过消息发送到某个窗口
joyReleaseCapture 释放对某个游戏设备的捕获
joyGetPos 获取游戏设备的坐标位置和按钮状态
joyGetPosEx 获取游戏设备的坐标位置和按钮状态
joyGetThreshold 查询指定的游戏杆设备的当前移动阈值
joySetThreshold 设置指定的游戏杆设备的移动阈值

本条类当中含有了变动的model类和xml映射文件

 

 图片 15图片 16图片 17图片 18

里面,依据调用差异的办法又可分为三种方式。

 那里本身只是简单的介绍存在这么叁个插件,那些差件自动生成了我们要求的映射类和配备文件,以及数据库配置文件,以及NHibenate帮助类,有了那个东西,大家就足以很有利的开始展览支付了,只要Ctrl+C,Ctrl+V。具体的运用办法,大家可以去参考上一篇:Hibernate学习笔记—使用
NHibernate构建多个ASP.NET
MVC应用程序

1)被动形式:

    
调用joySetCapture方法,向系统报名对有个别游戏手柄的捕捉,假诺成功申请,系统将会定时将此玩耍手柄的意况音讯通过音讯格局通报到大家的某些窗口上。

2)主动格局:

    
正是依照大家同心合力的内需,按需调用joyGetPos或joyGetPosEx方法查询得到有个别游戏手柄的当前状态。

 

而在本篇中,我们要上课的只是“被动格局”。

 

joySetCapture方法的C#概念原型如下:

        /// <summary>
        /// 向系统申请捕获某个游戏杆并定时将该设备的状态值通过消息发送到某个窗口
        /// </summary>
        /// <param name="hWnd">窗口句柄</param>
        /// <param name="uJoyID">指定游戏杆(0-15),它可以是JOYSTICKID1或JOYSTICKID2</param>
        /// <param name="uPeriod">每隔给定的轮询间隔就给应用程序发送有关游戏杆的信息。这个参数是以毫妙为单位的轮询频率。</param>
        /// <param name="fChanged">是否允许程序当操纵杆移动一定的距离后才接受消息</param>
        /// <returns></returns>
        [DllImport("winmm.dll")]
        public static extern int joySetCapture(IntPtr hWnd, int uJoyID, int uPeriod, bool fChanged);

当大家调用此模式向系统报名捕获有个别游戏手柄后,假如成功,则赶回JOYEWrangler兰德冠道_NOE卡宴RO哈弗(值为0),不然再次来到别的值的话代表申请破产。并且在不再必要捕获游戏手柄时要记得调用joyReleaseCapture方法释放捕捉。

 

若是申请成功,系统将会定时(依照uPeriod的值决定时间的尺寸)将游乐手柄的处境以音讯包格局发送到hWnd对应的窗口界面。所以大家务必要在先后中拍卖相应的音信(如重写WndProc方法开展处理)。

再者依据差别的uJoyID值,系统一发布送的音信号又会有所不一致,如对于JOYSTICKID1系统将会分别发送以下消息包:

消息号 说明
MM_JOY1MOVE 当手柄的位置已变动或按了某些按钮时,将会发送此消息包。
MM_JOY1BUTTONDOWN 当手柄的A,B,C,D四个按钮中的一个或多个正被按下时,将会发送此消息包。
MM_JOY1BUTTONUP 当手柄的A,B,C,D四个按钮中的一个或多个正被弹起时,将会发送此消息包。

 

而对此JOYSTICKID2
体系发生的音讯包分别为MM_JOY2MOVE、MM_JOY2BUTTONDOWN、MM_JOY2BUTTONUP!

并且要注意!不管你有没有按游戏手柄上的按钮,系统也会定时发送MM_JOYXMOVE消息!!

 

怎么判断按了什么样键?

在消息包中,游戏手柄的场地音讯(按钮状态)分别存款和储蓄在新闻包中的WParam与LParam参数。

1)WParam参数:

对于游戏手柄来说WParam存款和储蓄的是了前后左右多个方向键之外的保有按钮中当前被按下的按钮值,它的值是四个复合值。如它的值为JOY_BUTTON1
| JOY_BUTTON2时,就标志按下的按键是1号和2号按钮。

注意:对于MM_JOYXBUTTONDOWN与MM_JOYXBUTTONUP八个新闻,用于判断的按钮值是分化于MM_JOYXMOVE的按钮值!!

 

2)LParam参数:

此参数存储的是娱乐手柄的坐标参数,并且此参数的高13个人存款和储蓄的是Y坐标值,低1多少人存款和储蓄的是X坐标值。

而对此游戏手柄来说,判断上下左右八个趋势键有没有被按下正是经过此参数实行判定的。如若当四个方向键都没有被按下时,表示方今游玩手柄处于中央坐标中!也正是X,Y坐标都是在宗旨点地点上,而当某个方向键被按下时,X,Y坐标将依据所按的键向对应方向偏移。如当按了向右键,则X坐标向右偏移,Y坐标保持在主导点地方,而只要按了右、上五个方向键同时按下,则X坐标向右偏移,Y坐标向上偏移。所以我们得以依照LParam参数取得X,Y坐标的值,然后再依据其宗旨点来判断。参考代码如下:

       /// <summary>
        /// 获取X,Y轴的状态
        /// </summary>
        /// <param name="lParam"></param>
        /// <param name="buttons"></param>
        private void GetXYButtonsStateFromLParam(int lParam, ref JoystickButtons buttons)
        {
            //处理X,Y轴
            int x = lParam & 0x0000FFFF;                //低16位存储X轴坐标
            int y = (int)((lParam & 0xFFFF0000) >> 16); //高16位存储Y轴坐标(不直接移位是为避免0xFFFFFF时的情况)
            int m = 0x7EFF;                             //中心点的值
            if (x > m)
            {
                buttons |= JoystickButtons.Right;
            }
            else if (x < m)
            {
                buttons |= JoystickButtons.Left;
            }
            if (y > m)
            {
                buttons |= JoystickButtons.Down;
            }
            else if (y < m)
            {
                buttons |= JoystickButtons.UP;
            }
        }

 

好了,对娱乐手柄的“被动形式”编制程序就讲解完结了,剩下的便是要怎么利用游玩手柄来落到实处模拟键盘或鼠标的操作了……

PS:假使各位有趣味的可考虑一下怎么落实游戏手柄的“主动形式”编制程序开发。

 

演示代码下载:

/Files/kingthy/JoyKeys.rar