现在的位置: 首页 > 综合 > 正文

多触摸学习

2018年04月09日 ⁄ 综合 ⁄ 共 13246字 ⁄ 字号 评论关闭

 

内容很多,我这里主要采用引用的形式说明:

1.程序引导篇:

 

基于Visual C++2010与windows SDK fo windows7开发Windows 7的多点触摸特性应用程序(1)

 

基于Visual C++2010与windows SDK fo windows7开发Windows 7的多点触摸特性应用程序(2)--手势识别应用

Build a Multitouch Gesture Application

 

2.调试篇

 

作为开发者对MT 应用程序进行测试的时候,当然需要MT 硬件设备的支持,否则我们无法判断程序是否能够正常运行。虽然现在市面上的MT 设备已经很多,但价格也都不菲。如果没有多点触控设备能否进行MT 程序的开发与测试呢?  答案当然是可以的。

 

Windows 7 安装多点触屏模拟器

 

 

3。手势学习

 

vs2010中学习, 直接将一些API函数,,结构体,宏定义等挖出来。

如:winbuser.h中

 

#if(WINVER >= 0x0601)

 

/*

 * Touch Input defines and functions

 */

 

/*

 * Touch input handle

 */

DECLARE_HANDLE(HTOUCHINPUT);

 

typedef struct tagTOUCHINPUT {

    LONG x;

    LONG y;

    HANDLE hSource;

    DWORD dwID;

    DWORD dwFlags;

    DWORD dwMask;

    DWORD dwTime;

    ULONG_PTR dwExtraInfo;

    DWORD cxContact;

    DWORD cyContact;

} TOUCHINPUT, *PTOUCHINPUT;

typedef TOUCHINPUT const * PCTOUCHINPUT;

 

 

/*

 * Conversion of touch input coordinates to pixels

 */

#define TOUCH_COORD_TO_PIXEL(l)         ((l) / 100)

 

/*

 * Touch input flag values (TOUCHINPUT.dwFlags)

 */

#define TOUCHEVENTF_MOVE            0x0001

#define TOUCHEVENTF_DOWN            0x0002

#define TOUCHEVENTF_UP              0x0004

#define TOUCHEVENTF_INRANGE         0x0008

#define TOUCHEVENTF_PRIMARY         0x0010

#define TOUCHEVENTF_NOCOALESCE      0x0020

#define TOUCHEVENTF_PEN             0x0040

#define TOUCHEVENTF_PALM            0x0080

 

/*

 * Touch input mask values (TOUCHINPUT.dwMask)

 */

#define TOUCHINPUTMASKF_TIMEFROMSYSTEM  0x0001  // the dwTime field contains a system generated value

#define TOUCHINPUTMASKF_EXTRAINFO       0x0002  // the dwExtraInfo field is valid

#define TOUCHINPUTMASKF_CONTACTAREA     0x0004  // the cxContact and cyContact fields are valid

 

WINUSERAPI

BOOL

WINAPI

GetTouchInputInfo(

    __in HTOUCHINPUT hTouchInput,               // input event handle; from touch message lParam

    __in UINT cInputs,                          // number of elements in the array

    __out_ecount(cInputs) PTOUCHINPUT pInputs,  // array of touch inputs

    __in int cbSize);                           // sizeof(TOUCHINPUT)

 

WINUSERAPI

BOOL

WINAPI

CloseTouchInputHandle(

    __in HTOUCHINPUT hTouchInput);                   // input event handle; from touch message lParam

 

 

/*

 * RegisterTouchWindow flag values

 */

#define TWF_FINETOUCH       (0x00000001)

#define TWF_WANTPALM        (0x00000002)

 

WINUSERAPI

BOOL

WINAPI

RegisterTouchWindow(

    __in HWND hwnd,

    __in ULONG ulFlags);

 

WINUSERAPI

BOOL

WINAPI

UnregisterTouchWindow(

    __in HWND hwnd);

 

WINUSERAPI

BOOL

WINAPI

IsTouchWindow(

    __in HWND hwnd,

    __out_opt PULONG pulFlags);

 

#endif /* WINVER >= 0x0601 */

 

 

#if(WINVER >= 0x0601)

 

/*

 * Gesture defines and functions

 */

 

/*

 * Gesture information handle

 */

DECLARE_HANDLE(HGESTUREINFO);

 

 

/*

 * Gesture flags - GESTUREINFO.dwFlags

 */

#define GF_BEGIN                        0x00000001

#define GF_INERTIA                      0x00000002

#define GF_END                          0x00000004

 

/*

 * Gesture IDs

 */

#define GID_BEGIN                       1

#define GID_END                         2

#define GID_ZOOM                        3

#define GID_PAN                         4

#define GID_ROTATE                      5

#define GID_TWOFINGERTAP                6

#define GID_PRESSANDTAP                 7

#define GID_ROLLOVER                    GID_PRESSANDTAP

 

/*

 * Gesture information structure

 *   - Pass the HGESTUREINFO received in the WM_GESTURE message lParam into the

 *     GetGestureInfo function to retrieve this information.

 *   - If cbExtraArgs is non-zero, pass the HGESTUREINFO received in the WM_GESTURE

 *     message lParam into the GetGestureExtraArgs function to retrieve extended

 *     argument information.

 */

typedef struct tagGESTUREINFO {

    UINT cbSize;                    // size, in bytes, of this structure (including variable length Args field)

    DWORD dwFlags;                  // see GF_* flags

    DWORD dwID;                     // gesture ID, see GID_* defines

    HWND hwndTarget;                // handle to window targeted by this gesture

    POINTS ptsLocation;             // current location of this gesture

    DWORD dwInstanceID;             // internally used

    DWORD dwSequenceID;             // internally used

    ULONGLONG ullArguments;         // arguments for gestures whose arguments fit in 8 BYTES

    UINT cbExtraArgs;               // size, in bytes, of extra arguments, if any, that accompany this gesture

} GESTUREINFO, *PGESTUREINFO;

typedef GESTUREINFO const * PCGESTUREINFO;

 

 

/*

 * Gesture notification structure

 *   - The WM_GESTURENOTIFY message lParam contains a pointer to this structure.

 *   - The WM_GESTURENOTIFY message notifies a window that gesture recognition is

 *     in progress and a gesture will be generated if one is recognized under the

 *     current gesture settings.

 */

typedef struct tagGESTURENOTIFYSTRUCT {

    UINT cbSize;                    // size, in bytes, of this structure

    DWORD dwFlags;                  // unused

    HWND hwndTarget;                // handle to window targeted by the gesture

    POINTS ptsLocation;             // starting location

    DWORD dwInstanceID;             // internally used

} GESTURENOTIFYSTRUCT, *PGESTURENOTIFYSTRUCT;

 

/*

 * Gesture argument helpers

 *   - Angle should be a double in the range of -2pi to +2pi

 *   - Argument should be an unsigned 16-bit value

 */

#define GID_ROTATE_ANGLE_TO_ARGUMENT(_arg_)     ((USHORT)((((_arg_) + 2.0 * 3.14159265) / (4.0 * 3.14159265)) * 65535.0))

#define GID_ROTATE_ANGLE_FROM_ARGUMENT(_arg_)   ((((double)(_arg_) / 65535.0) * 4.0 * 3.14159265) - 2.0 * 3.14159265)

 

/*

 * Gesture information retrieval

 *   - HGESTUREINFO is received by a window in the lParam of a WM_GESTURE message.

 */

WINUSERAPI

BOOL

WINAPI

GetGestureInfo(

    __in HGESTUREINFO hGestureInfo,

    __out PGESTUREINFO pGestureInfo);

 

/*

 * Gesture extra arguments retrieval

 *   - HGESTUREINFO is received by a window in the lParam of a WM_GESTURE message.

 *   - Size, in bytes, of the extra argument data is available in the cbExtraArgs

 *     field of the GESTUREINFO structure retrieved using the GetGestureInfo function.

 */

WINUSERAPI

BOOL

WINAPI

GetGestureExtraArgs(

    __in HGESTUREINFO hGestureInfo,

    __in UINT cbExtraArgs,

    __out_bcount(cbExtraArgs) PBYTE pExtraArgs);

 

/*

 * Gesture information handle management

 *   - If an application processes the WM_GESTURE message, then once it is done

 *     with the associated HGESTUREINFO, the application is responsible for

 *     closing the handle using this function. Failure to do so may result in

 *     process memory leaks.

 *   - If the message is instead passed to DefWindowProc, or is forwarded using

 *     one of the PostMessage or SendMessage class of API functions, the handle

 *     is transfered with the message and need not be closed by the application.

 */

WINUSERAPI

BOOL

WINAPI

CloseGestureInfoHandle(

    __in HGESTUREINFO hGestureInfo);

 

 

/*

 * Gesture configuration structure

 *   - Used in SetGestureConfig and GetGestureConfig

 *   - Note that any setting not included in either GESTURECONFIG.dwWant or

 *     GESTURECONFIG.dwBlock will use the parent window's preferences or

 *     system defaults.

 */

typedef struct tagGESTURECONFIG {

    DWORD dwID;                     // gesture ID

    DWORD dwWant;                   // settings related to gesture ID that are to be turned on

    DWORD dwBlock;                  // settings related to gesture ID that are to be turned off

} GESTURECONFIG, *PGESTURECONFIG;

 

/*

 * Gesture configuration flags - GESTURECONFIG.dwWant or GESTURECONFIG.dwBlock

 */

 

/*

 * Common gesture configuration flags - set GESTURECONFIG.dwID to zero

 */

#define GC_ALLGESTURES                              0x00000001

 

/*

 * Zoom gesture configuration flags - set GESTURECONFIG.dwID to GID_ZOOM

 */

#define GC_ZOOM                                     0x00000001

 

/*

 * Pan gesture configuration flags - set GESTURECONFIG.dwID to GID_PAN

 */

#define GC_PAN                                      0x00000001

#define GC_PAN_WITH_SINGLE_FINGER_VERTICALLY        0x00000002

#define GC_PAN_WITH_SINGLE_FINGER_HORIZONTALLY      0x00000004

#define GC_PAN_WITH_GUTTER                          0x00000008

#define GC_PAN_WITH_INERTIA                         0x00000010

 

/*

 * Rotate gesture configuration flags - set GESTURECONFIG.dwID to GID_ROTATE

 */

#define GC_ROTATE                                   0x00000001

 

/*

 * Two finger tap gesture configuration flags - set GESTURECONFIG.dwID to GID_TWOFINGERTAP

 */

#define GC_TWOFINGERTAP                             0x00000001

 

/*

 * PressAndTap gesture configuration flags - set GESTURECONFIG.dwID to GID_PRESSANDTAP

 */

#define GC_PRESSANDTAP                              0x00000001

#define GC_ROLLOVER                                 GC_PRESSANDTAP

 

#define GESTURECONFIGMAXCOUNT           256             // Maximum number of gestures that can be included

                                                        // in a single call to SetGestureConfig / GetGestureConfig

 

WINUSERAPI

BOOL

WINAPI

SetGestureConfig(

    __in HWND hwnd,                                     // window for which configuration is specified

    __in DWORD dwReserved,                              // reserved, must be 0

    __in UINT cIDs,                                     // count of GESTURECONFIG structures

    __in_ecount(cIDs) PGESTURECONFIG pGestureConfig,    // array of GESTURECONFIG structures, dwIDs will be processed in the

                                                        // order specified and repeated occurances will overwrite previous ones

    __in UINT cbSize);                                  // sizeof(GESTURECONFIG)

 

 

#define GCF_INCLUDE_ANCESTORS           0x00000001      // If specified, GetGestureConfig returns consolidated configuration

                                                        // for the specified window and it's parent window chain

 

WINUSERAPI

BOOL

WINAPI

GetGestureConfig(

    __in HWND hwnd,                                     // window for which configuration is required

    __in DWORD dwReserved,                              // reserved, must be 0

    __in DWORD dwFlags,                                 // see GCF_* flags

    __in PUINT pcIDs,                                   // *pcIDs contains the size, in number of GESTURECONFIG structures,

                                                        // of the buffer pointed to by pGestureConfig

    __inout_ecount(*pcIDs) PGESTURECONFIG pGestureConfig,

                                                        // pointer to buffer to receive the returned array of GESTURECONFIG structures

    __in UINT cbSize);                                  // sizeof(GESTURECONFIG)

 

 

 

#endif /* WINVER >= 0x0601 */

 

#if(WINVER >= 0x0601)

 

/*

 * GetSystemMetrics(SM_DIGITIZER) flag values

 */

#define NID_INTEGRATED_TOUCH  0x00000001

#define NID_EXTERNAL_TOUCH    0x00000002

#define NID_INTEGRATED_PEN    0x00000004

#define NID_EXTERNAL_PEN      0x00000008

#define NID_MULTI_INPUT       0x00000040

#define NID_READY             0x00000080

 

#endif /* WINVER >= 0x0601 */

 

 

 

cwnd类中有一些东东值得挖掘:

 

// for touch:

 

/// <summary>

/// Register/Unregister window Windows touch support</summary>

/// <returns> 

/// TRUE if succeeds; otherwise FALSE.</returns>

/// <param name="bRegister">TRUE - register Windows touch support; FALSE - otherwise.</param>

/// <param name="ulFlags">A set of bit flags that specify optional modifications. This field may contain 0 or one of the following values: TWF_FINETOUCH; TWF_WANTPALM</param>

BOOL RegisterTouchWindow(BOOL bRegister = TRUE, ULONG ulFlags = 0);

 

/// <summary>

/// Specifies whether CWnd has touch support</summary>

/// <returns> 

/// TRUE if CWnd has touch support; otherwise FALSE.</returns>

BOOL IsTouchWindow() const;

 

// gesture:

#if (WINVER >= 0x0601)

/// <summary>

/// Set gesture touch paramaters</summary>

/// <returns> 

/// TRUE if succeeds; otherwise FALSE.</returns>

/// <param name="pConfig">Pointer to CGestureConfig. Cannot be NULL.</param>

BOOL SetGestureConfig(CGestureConfig* pConfig);

 

/// <summary>

/// Get gesture touch paramaters</summary>

/// <returns> 

/// TRUE if succeeds; otherwise FALSE.</returns>

/// <param name="pConfig">Pointer to CGestureConfig. Cannot be NULL.</param>

BOOL GetGestureConfig(CGestureConfig* pConfig);

 

/// <summary>

/// Returns the current gesture information (PGESTUREINFO)</summary>

/// <returns> 

/// Pointer to the current gesture info.</returns>

const PGESTUREINFO GetCurrentGestureInfo() const

{

return m_pCurrentGestureInfo;

}

#endif

 

 

 

// for touch:

BOOL m_bIsTouchWindowRegistered;

/// <summary>

/// Process inputs from Windows touch</summary>

/// <returns> 

/// TRUE if application processes Windows touch inputs; otherwise FALSE.</returns>

/// <param name="nInputsCount">total number of Windows touch inputs.</param>

/// <param name="pInputs">array of TOUCHINPUT.</param>

virtual BOOL OnTouchInputs(UINT nInputsCount, PTOUCHINPUT pInputs);

 

/// <summary>

/// Process single input from Windows touch</summary>

/// <returns> 

/// TRUE if application processes Windows touch input; otherwise FALSE.</returns>

/// <param name="pt">point where screen has been tocuhed (in the client coordinates).</param>

/// <param name="nInputNumber">number of touch input.</param>

/// <param name="nInputsCount">total number of touch inputs.</param>

/// <param name="pInput">pointer to TOUCHINPUT structure.</param>

virtual BOOL OnTouchInput(CPoint pt, int nInputNumber, int nInputsCount, PTOUCHINPUT pInput);

 

/// <summary>

/// The methods is called when the system asks a window which system gestures it would like to receive</summary>

/// <returns> 

/// A value indicating which system gestures the window would like to receive (TABLET_* flags, see WM_TABLET_QUERYSYSTEMGESTURESTATUS message).</returns>

/// <param name="ptTouch">point where screen has been tocuhed (in the client coordinates).</param>

virtual ULONG GetGestureStatus(CPoint ptTouch);

 

// for gesture:

CPoint m_ptGestureFrom;

ULONGLONG m_ulGestureArg;

BOOL m_bGestureInited;

PGESTUREINFO m_pCurrentGestureInfo;

 

/// <summary>

/// The method is called upon gesture zoom event</summary>

/// <returns> 

/// TRUE if application processes this event; otherwise FALSE.</returns>

/// <param name="ptCenter">Zoom center point. In client coordinates</param>

/// <param name="lDelta">The distance from the center point. In pixels</param>

virtual BOOL OnGestureZoom(CPoint ptCenter, long lDelta);

 

/// <summary>

/// The method is called upon gesture pan event</summary>

/// <returns> 

/// TRUE if application processes this event; otherwise FALSE.</returns>

/// <param name="ptFrom">Pan starting point. In client coordinates</param>

/// <param name="ptTo">Pan current point. In client coordinates</param>

virtual BOOL OnGesturePan(CPoint ptFrom, CPoint ptTo);

 

/// <summary>

/// The method is called upon gesture rotate event</summary>

/// <returns> 

/// TRUE if application processes this event; otherwise FALSE.</returns>

/// <param name="ptCenter">Rotation center point. In client coordinates</param>

/// <param name="dblAngle">Rotation angle. In radians</param>

virtual BOOL OnGestureRotate(CPoint ptCenter, double dblAngle);

 

/// <summary>

/// The method is called upon gesture 2 finger tap event</summary>

/// <returns> 

/// TRUE if application processes this event; otherwise FALSE.</returns>

/// <param name="ptCenter">Center point between 2 fingers. In client coordinates</param>

virtual BOOL OnGestureTwoFingerTap(CPoint ptCenter);

 

/// <summary>

/// The method is called upon gesture press and tap event</summary>

/// <returns> 

/// TRUE if application processes this event; otherwise FALSE.</returns>

/// <param name="ptPress">"Pressed" point. In client coordinates</param>

/// <param name="lDelta">The distance from the "pressed" point. In pixels</param>

virtual BOOL OnGesturePressAndTap(CPoint ptPress, long lDelta);

抱歉!评论已关闭.