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

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 閱讀(1742) 評論(1)  編輯 收藏 引用

評論

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

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


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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>
            亚洲国产老妈| 中文av一区特黄| 久久久久久999| 午夜精品久久久久久久久| 国产丝袜美腿一区二区三区| 久久久久久久综合色一本| 午夜精品福利在线| 伊人久久成人| 亚洲国内精品| 国产精品二区在线观看| 欧美一级久久久久久久大片| 欧美在线关看| 亚洲人成亚洲人成在线观看图片| 亚洲国产日韩欧美在线图片 | 久久精品国产一区二区三区免费看 | 国产亚洲综合精品| 免费成人毛片| 欧美日韩一级黄| 久久久中精品2020中文| 免费国产一区二区| 亚洲男女自偷自拍图片另类| 久久国产精品免费一区| 亚洲精品久久视频| 亚洲一区www| 亚洲高清不卡一区| 中国成人黄色视屏| 在线观看亚洲一区| 亚洲女女女同性video| 亚洲国产精品美女| 亚洲欧美一级二级三级| 亚洲狼人综合| 久久久久久久成人| 亚洲自拍偷拍网址| 免费日本视频一区| 久久精品色图| 国产精品jvid在线观看蜜臀| 久久―日本道色综合久久| 欧美日韩视频专区在线播放 | 欧美一区二区私人影院日本 | 国产日韩精品在线播放| 亚洲国产精品第一区二区三区| 国产精品网站在线播放| 亚洲国产日韩一级| 雨宫琴音一区二区在线| 亚洲欧美中文在线视频| 这里只有精品丝袜| 蜜臀91精品一区二区三区| 久久国产精品电影| 国产精品高潮呻吟视频| 日韩天堂在线观看| 亚洲理伦在线| 免费不卡视频| 欧美激情第9页| 国语自产精品视频在线看抢先版结局 | 欧美一区2区三区4区公司二百| 一区二区三区免费看| 久久亚洲春色中文字幕| 看片网站欧美日韩| 影音先锋久久| 久久国产婷婷国产香蕉| 欧美亚洲综合网| 国产精品一区一区| 亚洲砖区区免费| 欧美中文日韩| 国产婷婷97碰碰久久人人蜜臀| 亚洲一区二区三区免费视频| 亚洲一区二区四区| 欧美日韩高清不卡| 亚洲乱码一区二区| 中文日韩在线视频| 欧美视频四区| 亚洲欧美国产日韩中文字幕| 欧美一二三视频| 好吊日精品视频| 久久综合五月| 亚洲国产精品美女| av成人手机在线| 欧美日韩亚洲一区二区三区在线观看| 亚洲裸体在线观看| 亚洲欧美日韩精品久久奇米色影视| 欧美三区在线| 欧美一区二区黄色| 欧美成人tv| 一本色道久久88精品综合| 欧美亚日韩国产aⅴ精品中极品| 一本久道久久综合婷婷鲸鱼 | 激情亚洲网站| 麻豆亚洲精品| 一区二区欧美日韩| 久久精品首页| 亚洲精品久久久久久久久久久| 欧美三级韩国三级日本三斤| 亚洲欧美日韩精品久久| 欧美暴力喷水在线| 亚洲免费小视频| 国语自产偷拍精品视频偷| 欧美电影在线| 欧美一区二区黄色| 亚洲精品黄色| 久久亚洲捆绑美女| 亚洲视频免费看| 国内久久精品| 国产精品久久久久久久app| 久久精品电影| 国产亚洲精品美女| 欧美本精品男人aⅴ天堂| 欧美一区二区三区视频在线观看 | 一区二区三区 在线观看视| 国产精品免费观看视频| 久久久久久一区二区| 亚洲美女视频在线观看| 久久精品国产第一区二区三区| 亚洲美女淫视频| 狠狠网亚洲精品| 国产精品激情电影| 久久免费国产| 羞羞视频在线观看欧美| 亚洲精品一区二区网址| 嫩草影视亚洲| 久久国产黑丝| 亚洲女同精品视频| 99精品久久免费看蜜臀剧情介绍| 国产午夜久久| 国产精品推荐精品| 欧美视频1区| 欧美护士18xxxxhd| 麻豆成人综合网| 久久福利视频导航| 午夜精品视频一区| 中文精品视频一区二区在线观看| 亚洲高清av| 亚洲成人在线视频播放| 欧美一二三视频| 亚洲欧美日韩国产精品| 亚洲视频一二| 亚洲免费av片| 日韩视频―中文字幕| 亚洲国产另类精品专区| 一区二区在线观看视频在线观看| 国产欧美日韩一区二区三区| 欧美亚州一区二区三区| 欧美精品一二三| 欧美精品一区二区三| 葵司免费一区二区三区四区五区| 久久丁香综合五月国产三级网站| 亚洲欧美日韩天堂一区二区| 亚洲欧美激情一区| 午夜精品影院| 午夜亚洲精品| 欧美一区三区二区在线观看| 欧美一级精品大片| 欧美在线免费一级片| 欧美在线综合视频| 久久精品99| 免费在线一区二区| 欧美国产日本韩| 欧美日韩喷水| 国产精品综合色区在线观看| 国产欧美一区二区三区在线看蜜臀| 国产精品v亚洲精品v日韩精品| 国产精品亚洲精品| 一区二区在线观看视频在线观看| 一区二区三区在线观看国产| 亚洲黄色在线视频| 亚洲免费影视第一页| 香蕉久久夜色精品| 美女91精品| 亚洲日韩第九十九页| 亚洲一区二区三区免费在线观看| 欧美一级在线播放| 久热精品视频在线观看| 欧美日韩精品高清| 国产一区二区三区奇米久涩 | 国产欧美日韩精品丝袜高跟鞋| 狠狠色综合色区| 日韩视频在线一区| 久久www成人_看片免费不卡| 美女久久网站| 在线中文字幕日韩| 久久精品国语| 欧美啪啪成人vr| 国产免费观看久久黄| 亚洲日本在线观看| 久久国产一区二区| 日韩亚洲在线观看| 久久这里只有精品视频首页| 欧美婷婷六月丁香综合色| 国内成+人亚洲| 一区二区日韩免费看| 久久亚洲精品一区二区| 亚洲美女在线国产| 久久久久久一区二区| 国产精品福利网| 亚洲理论在线观看| 久久久五月天| 在线一区免费观看| 欧美日本韩国| 亚洲高清久久网| 久久久青草青青国产亚洲免观| 亚洲精品国产拍免费91在线|