青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Coding for Gestures and Flicks on Tablet PC running Vista

LINK: http://www.therobotgeek.net/articles/gestureblocks.aspx

For this article, I wanted to demonstrate how to access gestures and flicks using C# code. I'll talk about accessing flicks using the tablet API and accessing gestures using the N-Trig native libraries. Surprisingly I couldn't find much out there that goes into any kind of depth in coding for either of these topics. So it seemed like a good opportunity to present some examples. I've included code for a C# game that uses the gestures for control. I hope you find it fun and useful.

Even though they are called "flicks", a flick is really a single touch gesture and an N-Trig gesture is a double touch gesture.  All the examples run on Windows Vista Ultimate 32bit. Windows Vista will only detect up to two fingers on the touch surface. However, Windows 7 promises to allow more than two finger detection. I'll have to try that next. HP is already shipping hardware that is multi-touch enabled on their TouchSmart PCs.  The Dell Latitude XT and XT2 tablet PCs are also using the N-Trig hardware for multi-touch.


Code to Detect If Running on a Tablet PC

I found some simple code to determine if your app is running on a tablet PC. It is a native call to GetSystemMetrics which is in User32.dll and you pass in SM_TABLETPC. I've included this code in the Flicks class.  You may want your app to auto-detect if it's running on a tablet to determine which features to enable.

 

        [DllImport("User32.dll", CharSet = CharSet.Auto)]

        public static extern int GetSystemMetrics(int nIndex);

 

        public static bool IsTabletPC()

        {

            int nResult = GetSystemMetrics(SM_TABLETPC);

            if (nResult != 0)

                return true;

 

            return false;

        }

 


Accessing Flicks (Single Touch Gestures) or UniGesture

If you've never heard of flicks before, they are single touch gestures that are triggered based on the speed of the touch across the tablet surface.  You can find more detail here.  It currently gives you eight directions that can be programmed at the OS level for use by applications.

I used the tabflicks.h file that I found in the folder - "C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include" This header file is included with the Windows SDK. It contains all the flick structures and macro definitions needed to access flicks. I created a  class library project called FlickLib that contains the C# structures, DllImports and code to store and process the data. I also wrote a test WinForm application that shows the usage of the library.

   97 

   98         /// <summary>

   99         /// Override the WndProc method to capture the tablet flick messages

  100         /// </summary>

  101         /// <param name="msg"></param>

  102         protected override void WndProc(ref Message msg)

  103         {

  104             try

  105             {

  106                 if (msg.Msg == Flicks.WM_TABLET_FLICK)

  107                 {

  108                     Flick flick = Flicks.ProcessMessage(msg);

  109                     if (flick != null)

  110                     {

  111                         this.txtOutput.Text = string.Format("Point=({0},{1}) {2}\r\n",

  112                                                 flick.Point.X,

  113                                                 flick.Point.Y,

  114                                                 flick.Data.Direction);

  115 

  116                         // Set to zero to tell WndProc that message has been handled

  117                         msg.Result = IntPtr.Zero;

  118                     }

  119                 }

  120 

  121                 base.WndProc(ref msg);

  122             }

  123             catch (Exception ex)

  124             {

  125                 this.txtOutput.Text += string.Format("{0}\r\n", ex.Message);

  126             }

  127         }

  128 

I override the WndProc method of the WinForm to gain access to the WM_TABLET_FLICK messages sent to the window. The flick data is encoded in the WParam and the LParam of the windows message. I discovered that even though the params are IntPtr type, they are not actually pointers but are the real integer values to be used. I kept getting an Access Violation exception when I was trying to marshal the IntPtr to a structure. The solution was non-obvious. I couldn't find that documented anywhere. But it works correctly now so this is my contribution to the web for anyone trying to solve the same problem.

It is important to note that on line # 117, I set msg.Result = IntPtr.Zero.  This tells the base.WndProc method that the message has been handled so ignore it.  This is important because the underlying pen flicks can be assigned to actions such as copy and paste.  If the message is not flagged as handled, the app will attempt to perform the action.

WinForm Flicks Test C# source code WinFlickTest.zip

Accessing Double Touch Gestures or DuoGestures

The N-Trig hardware on the HP TouchSmart tablet provides the ability to detect two (or more) touches on the surface. This allows the tablet to respond on two finger gestures. You can see the current DuoGestures in use from N-Trig here.

I've created a class library project called GestureLib which wraps the native libraries from N-Trig so that they can be called using C#. Obviously this will only run on tablets that have the N-Trig hardware. Currently there is the HP TouchSmart tx2 and the Dell Latitude XT & XT2 laptops. I'll be testing and updating code for the HP TouchSmart IQ505 panel that uses the NextWindow hardware. If someone has any other tablets, touch panels and/or UMPC devices, I'd be happy to work together to create a version for that as well.

 

        private Gestures _myGestures = new Gestures();

        private int NTR_WM_GESTURE = 0;

 

        /// <summary>

        /// Override OnLoad method to Connect to N-Trig hardware and

        /// Register which gestures you want to receive messages for and

        /// Register to receive the Window messages in this WinForm

        /// </summary>

        /// <param name="eventArgs"></param>

        protected override void OnLoad(EventArgs eventArgs)

        {

            try

            {

                bool bIsConnected = this._myGestures.Connect();

                if (bIsConnected == true)

                {

                    this.txtOutput.Text += "Connected to DuoSense\r\n";

 

                    TNtrGestures regGestures = new TNtrGestures();

                    regGestures.ReceiveRotate = true;

                    regGestures.UseUserRotateSettings = true;

                    regGestures.ReceiveFingersDoubleTap = true;

                    regGestures.UseUserFingersDoubleTapSettings = true;

                    regGestures.ReceiveZoom = true;

                    regGestures.UseUserZoomSettings = true;

                    regGestures.ReceiveScroll = true;

                    regGestures.UseUserScrollSettings = true;

 

                    bool bRegister = this._myGestures.RegisterGestures(this.Handle, regGestures);

                    if (bRegister == true)

                    {

                        this.NTR_WM_GESTURE = Gestures.RegisterGestureWinMessage();

                        if (this.NTR_WM_GESTURE != 0)

                            this.txtOutput.Text += string.Format("NTR_WM_GESTURE = {0}\r\n", this.NTR_WM_GESTURE);

                    }

                }

                else

                    this.txtOutput.Text = "Error connecting to DuoSense\r\n";

            }

            catch (Exception ex)

            {

                this.txtOutput.Text += string.Format("{0}\r\n", ex.Message);

            }

        }

 

        /// <summary>

        /// Override OnClosing method to ensure that we Disconnect from N-Trig hardware

        /// </summary>

        /// <param name="cancelEventArgs"></param>

        protected override void OnClosing(CancelEventArgs cancelEventArgs)

        {

            this._myGestures.Disconnect();

 

            base.OnClosing(cancelEventArgs);

        }

 

Once you look at the code you will note that you have to connect to the N-Trig hardware at the start of the app.  I put that call in the OnLoad method.  Once you have a handle to the hardware, then you will use that throughout the lifetime of the app.  It is stored in the Gestures class.  With the handle, you will register which gesture messages you want the window to receive.  Once registered, you will start to see NTR_WM_GESTURE message showing up in the WndProc method.  I created a ProcessMessage method in the Gestures class that will determine which gesutre type it is and extract the data for the particular gesture.

One thing to note is if you look at the DllImports for the NtrigISV.dll native library you will see that there is name mangling with the method calls. I had to use Dependency Walker to determine the actual names of the methods. So be warned that when N-Trig releases a new version of their DLL that this code will probably break.

N-Trig Gestures WinForm Test source code WinGestureTest.zip

Problems with Marshalling Data from C++ to C#

I had an issue where I was only getting the Zoom messages.  My friend, Ben Gavin, helped me solve the problem.  It had to do with marshalling the data into the struct.  The original C++ struct looks like this:

 

typedef struct _TNtrGestures

{  

    bool ReceiveZoom;

    bool UseUserZoomSettings;

    bool ReceiveScroll;

    bool UseUserScrollSettings;

    bool ReceiveFingersDoubleTap;

    bool UseUserFingersDoubleTapSettings;

    bool ReceiveRotate;

    bool UseUserRotateSettings;

} TNtrGestures;

 

For my original port, I just did a LayoutKind.Sequential and set everything as a bool like below.

    [StructLayout(LayoutKind.Sequential)]

    public struct TNtrGestures

    {

        public bool ReceiveZoom;

        public bool UseUserZoomSettings;

        public bool ReceiveScroll;

        public bool UseUserScrollSettings;

        public bool ReceiveFingersDoubleTap;

        public bool UseUserFingersDoubleTapSettings;

        public bool ReceiveRotate;

        public bool UseUserRotateSettings;

    }

Trouble is that bool in C++ is one byte where as a bool in C# is an Int32 or four bytes. Now if the C++ struct was labeled with a BOOL, then it would have been four bytes. So the new declaration of the struct in C# looks like this:

    [StructLayout(LayoutKind.Explicit)]

    public struct TNtrGestures

    {

        [FieldOffset(0)]public bool ReceiveZoom;

        [FieldOffset(1)]public bool UseUserZoomSettings;

        [FieldOffset(2)]public bool ReceiveScroll;

        [FieldOffset(3)]public bool UseUserScrollSettings;

        [FieldOffset(4)]public bool ReceiveFingersDoubleTap;

        [FieldOffset(5)]public bool UseUserFingersDoubleTapSettings;

        [FieldOffset(6)]public bool ReceiveRotate;

        [FieldOffset(7)]public bool UseUserRotateSettings;

    }

Once I used the FieldOffsetAttribute to set each bool to one byte each, the Rotate messages started to work correctly. Thanks Ben...


WPF Gestures Example Code

 

                WindowInteropHelper winHelper = new WindowInteropHelper(this);

                HwndSource hwnd = HwndSource.FromHwnd(winHelper.Handle);

                hwnd.AddHook(new HwndSourceHook(this.MessageProc));

 

Using the same GestureLib class library, I also created an app that shows how to capture the gestures using a WPF application.  That was an interesting exercise because I had never gotten a Windows handle from a WPF app.  I discovered the WinInteropHelper class that gets the underlying Windows handle. I also had to hook the MessageProc handler to get the messages.  The WndProc method is not available to override in WPF.

WPF Gestures Test source code WpfGestureTest.zip

Gesture Blocks - C# Game using Gestures and Flicks

Just creating test apps is boring and I wanted to create a game example that uses the flicks and gestures for control. I chose to build a simple game that shows off some of the possibilities for touch control. I call the game Gesture Blocks. It will give you a good starting point on using gestures in games. Watch the video to see the gestures in action.

Gesture Blocks Game source code WinGestureBlocks.zip

Conclusion

I hope the code I provided was useful and helpful. I will try to update the examples as issues are resolved. I'm also going to work on some other game examples that continue to show what can be done with gestures. The next project will be to load Windows 7 onto the tablet and write some code for more than DuoGestures.


posted on 2009-05-19 17:52 zmj 閱讀(1735) 評論(1)  編輯 收藏 引用

評論

# re: Coding for Gestures and Flicks on Tablet PC running Vista 2011-01-12 22:52 rena_yang

你好,我是前面問你問題的人,能不能發(fā)到我郵箱呢,謝謝。48388266@qq.com  回復(fù)  更多評論   


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久精品国产亚洲5555| 欧美日韩国产成人在线免费| 久久久99国产精品免费| 亚洲午夜精品| 亚洲一区二区三区精品在线| aa日韩免费精品视频一| 亚洲免费精品| 在线视频一区二区| 午夜精品视频一区| 香蕉av777xxx色综合一区| 免费视频久久| 日韩一级裸体免费视频| 亚洲国产天堂久久国产91| 欧美sm视频| 日韩午夜av在线| 亚洲小说春色综合另类电影| 国产精品视频xxx| 国产精品亚洲一区| 精品二区视频| 亚洲美洲欧洲综合国产一区| 亚洲免费视频成人| 久久蜜桃资源一区二区老牛 | 狠狠色丁香婷综合久久| 狠狠色香婷婷久久亚洲精品| 亚洲精品一区二区三区在线观看| 一本大道久久精品懂色aⅴ| 亚洲一区二区视频在线| 久久免费精品视频| 亚洲精品中文字幕女同| 午夜精品免费视频| 欧美风情在线| 很黄很黄激情成人| 亚洲欧美另类国产| 亚洲国内自拍| 久久激情五月丁香伊人| 欧美日韩成人网| 亚洲第一二三四五区| 亚洲一区二区三区视频播放| 老司机精品导航| 亚洲一区欧美| 欧美三级午夜理伦三级中视频| 亚洲大片免费看| 久久精品综合网| 亚洲欧美在线免费| 国产精品久久久久久久久久妞妞 | 亚洲女同在线| 欧美日韩中文| 日韩亚洲欧美一区| 美女网站久久| 欧美在现视频| 国产亚洲高清视频| 午夜国产欧美理论在线播放| 亚洲精品乱码视频| 欧美成人激情在线| 亚洲国产精品第一区二区三区| 久久激情视频久久| 亚洲影院免费观看| 国产精品久久久久久亚洲调教| 99热精品在线| 亚洲精一区二区三区| 欧美激情2020午夜免费观看| 欧美高清在线视频观看不卡| 欧美在线国产精品| 夜夜爽夜夜爽精品视频| 午夜精品美女久久久久av福利| 亚洲精品视频在线观看网站| 欧美国产日韩精品| av成人老司机| 在线亚洲伦理| 国产麻豆精品theporn| 欧美综合77777色婷婷| 久久国产精品第一页| 国语自产偷拍精品视频偷 | 亚洲影视综合| 国产美女一区| 久久综合九色综合网站| 久久国产乱子精品免费女| 极品尤物久久久av免费看| 久久久噜噜噜久久| 美日韩在线观看| 日韩视频欧美视频| 亚洲一区二区三区免费视频| 国产欧美精品一区二区色综合| 久久精品91久久久久久再现| 久久久天天操| 亚洲午夜激情网站| 久久久久久久激情视频| 亚洲最新色图| 久久精品国产精品亚洲| 亚洲精品国产精品国产自| 一区二区欧美在线观看| 国内外成人免费激情在线视频网站| 欧美激情视频网站| 国产精品wwwwww| 蜜桃久久av| 麻豆freexxxx性91精品| 欧美a级在线| 欧美一级视频免费在线观看| 久久久亚洲高清| 亚洲一区二区不卡免费| 久久9热精品视频| 夜夜夜精品看看| 欧美在线一区二区三区| 亚洲免费观看在线观看| 亚洲一区三区视频在线观看| 永久免费毛片在线播放不卡| 99国产精品久久| 伊人男人综合视频网| 国产精品99久久久久久久久| 亚洲动漫精品| 午夜在线视频观看日韩17c| 亚洲国产精品一区二区久| 一二三区精品福利视频| 亚洲国产高清高潮精品美女| 亚洲欧美久久| 亚洲婷婷综合久久一本伊一区| 久久一二三国产| 久久久av网站| 国产精品国产一区二区| 亚洲欧洲日产国产网站| 在线观看精品| 欧美在线视频a| 欧美国产91| 99国产精品久久久久老师| 久久精品在这里| 午夜亚洲福利| 欧美日韩一级视频| 亚洲精品久久久久久一区二区| 在线观看日韩欧美| 亚洲欧美电影在线观看| 亚洲最新视频在线| 男人的天堂亚洲| 乱中年女人伦av一区二区| 国产无一区二区| 性欧美18~19sex高清播放| 亚洲午夜日本在线观看| 欧美三级欧美一级| 一区二区三区日韩精品| 亚洲一区图片| 国产精品久久久久久妇女6080| 夜夜嗨av一区二区三区中文字幕| 一区二区三区日韩| 国产精品久久久久久福利一牛影视 | 国产精品日韩精品欧美在线| 日韩视频在线观看免费| 99亚洲精品| 欧美日本一区二区高清播放视频| 欧美77777| 亚洲区欧美区| 欧美日本高清视频| 一区二区三区导航| 欧美一区二区视频在线| 国产亚洲精品激情久久| 久久亚洲影音av资源网| 亚洲成色777777在线观看影院| 亚洲精品视频一区二区三区| 蜜桃av一区二区三区| 欧美激情精品久久久久久久变态 | 欧美在线观看一区二区| 国产一区成人| 女人色偷偷aa久久天堂| 999亚洲国产精| 久久99伊人| 亚洲欧洲三级电影| 国产精品久久久久999| 欧美在线free| 欧美激情乱人伦| 亚洲专区一区二区三区| 国产视频一区在线观看| 免费人成精品欧美精品| 一区二区三区毛片| 久久综合国产精品| 99精品国产热久久91蜜凸| 国产精品高精视频免费| 久久这里只有| 亚洲中午字幕| 亚洲激情专区| 久久久精品免费视频| 亚洲最黄网站| 激情偷拍久久| 国产精品理论片在线观看| 久久久久久久久久久久久女国产乱 | 一本久久a久久免费精品不卡| 欧美亚洲免费电影| 亚洲国产精品一区二区三区| 欧美午夜片在线观看| 久久九九热免费视频| 99国产一区| 你懂的视频一区二区| 午夜欧美精品| 99精品热视频| 伊人激情综合| 国产伦精品一区二区三| 欧美激情视频一区二区三区不卡| 亚洲一区二区三区视频| 91久久精品一区| 欧美成人一区二区三区片免费| 欧美主播一区二区三区美女 久久精品人| 91久久国产精品91久久性色| 国产欧美精品一区aⅴ影院|