内容很多,我这里主要采用引用的形式说明:
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 程序的开发与测试呢? 答案当然是可以的。
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);