2009/05/20

Programming with Windows 7 Multitouch & Gesture 續

軟體與硬體需求

當然要有硬體與作業系統及 SDK:
A multi-touch monitor
A PC or NB installed Windows 7
Installed Windows 7 SDK
Visual Studio(我用的是 Visual Studio 2008)

環境設定

設定Win7 SDK的路徑, 包含include與library都要設定:
Header :Declared in Winuser.h; include Windows.h.
Library:Include User32.lib

接下來請參考前一篇的資料結構,因為微軟的開發模式都差不多,在寫 Multitouch 與寫 Mouse 的方式很像,就是收 Message, 定義自己得 event handler, 底下就列出相關的 Message:


WM_GESTURE Message

Passes information about a gesture.

Parameters

wParam


Provides information identifying the gesture command and gesture-specific argument values. This information is retrieved by calling GetGestureInfo.

lParam

Provides information identifying the gesture command and gesture-specific argument values. This information is retrieved by calling GetGestureInfo.

Return Value

If an application processes this message, it should return 0.

If the application does not process the message, it must call DefWindowProc. Not doing so will cause the application to leak memory because the touch input handle will not be closed and associated process memory will not be freed.

WM_GESTURENOTIFY Message

Indicates that a gesture message is about to be received.

Parameters

wParam


Unused.

lParam

A pointer to a GESTURENOTIFYSTRUCT.

Return Value

If an application processes this message, it should return 0.

Remarks

When the WM_GESTURENOTIFY message is received, the application can use SetGestureConfig to specify the gestures to receive.

Examples

switch (message)
{
case WM_GESTURENOTIFY:
{
GESTURECONFIG gc = {0,GC_ALLGESTURES,0};
BOOL bResult = SetGestureConfig(hWnd,0,1,&gc,sizeof(GESTURECONFIG));

if(!bResult)
{
// an error
}
}

break

GESTUREINFO Structure

Stores information about a gesture.
Syntax

typedef struct _GESTUREINFO {
UINT cbSize;
DWORD dwFlags;
DWORD dwID;
HWND hwndTarget;
POINTS ptsLocation;
DWORD dwInstanceID;
DWORD dwSequenceID;
ULONGLONG ullArguments;
UINT cbExtraArgs;

} GESTUREINFO, *PGESTUREINFO;

Members

cbSize

The size of the structure, in bytes. The caller must set this to sizeof(GESTUREINFO).

dwFlags

The state of the gesture. For additional information, see Remarks.

dwID

The identifier of the gesture command.

hwndTarget

A handle to the window that is targeted by this gesture.

ptsLocation

A POINTS structure containing the coordinates associated with the gesture. These coordinates are always relative to the origin of the screen.

dwInstanceID

An internally used identifier for the structure.

dwSequenceID

An internally used identifier for the sequence.

ullArguments

An unsigned long long that contains the arguments for gestures that fit into 8 bytes.

cbExtraArgs

The size, in bytes, of extra arguments that accompany this gesture.

Remarks

The GESTUREINFO structure is retrieved by passing the handle to the gesture information structure to the GetGestureInfo function.

The following flags indicate the various states of the gestures and are stored in dwFlags.
Name Value Description
GF_BEGIN 0x00000001 Indicates a gesture is starting
GF_INERTIA 0x00000002 Indicates a gesture has triggered inertia
GF_END 0x00000004 Indicates a gesture has finished

Note Most applications should ignore the GID_BEGIN and GID_END messages and pass them to DefWindowProc. These messages are used by the default gesture handler and application behaviour is undefined when the GID_BEGIN and GID_END messages are consumed by a third party application.

The following table indicates the various identifiers for gestures.


Name Value Description
GID_BEGIN 1 Indicates a gesture is starting.
GID_END 2 Indicates a gesture is ending.
GID_ZOOM 3 Indicates the zoom gesture.
GID_PAN 4 Indicates the pan gesture.
GID_ROTATE 5 Indicates the rotation gesture.
GID_TWOFINGERTAP 6 Indicates the two-finger tap gesture.
GID_ROLLOVER 7 Indicates the rollover gesture.
Examples

GESTUREINFO gestureInfo = {0};

gestureInfo.cbSize = sizeof(gestureInfo);

BOOL bResult = GetGestureInfo((HGESTUREINFO)lParam, &gestureInfo);


dwCommand dwArguments ptsLocation
Pan Distance between contacts Current center of gesture
Zoom Distance between contacts Current center of gesture
Rotate Absolute angle on rotate start, delta on updates Current center of gesture
Two-finger tap NA Current center of gesture

GESTURENOTIFYSTRUCT Structure

When transmitted with WM_GESTURENOTIFY messages, passes information about a gesture.

Syntax

typedef struct tagGESTURENOTIFYSTRUCT {
UINT cbSize;
DWORD dwFlags;
HWND hwndTarget;
POINTS ptsLocation;
DWORD dwInstanceID;

} GESTURENOTIFYSTRUCT, *PGESTURENOTIFYSTRUCT;

Members

cbSize

The size of the structure.

dwFlags

Reserved for future use.

hwndTarget

The target window for the gesture notification.

ptsLocation

The location of the gesture.

dwInstanceID

A specific gesture instance with gesture messages starting with GID_START and ending with GID_END.

GESTURECONFIG Structure

Gets and sets the configuration for enabling gesture messages and the type of this configuration.

Syntax

typedef struct _GESTURECONFIG {
DWORD dwID;
DWORD dwWant;
DWORD dwBlock;

} GESTURECONFIG, *PGESTURECONFIG;

Members

dwID

The identifier for the type of configuration that will have messages enabled or disabled. For more information, see Remarks.

dwWant

The messages to enable.

dwBlock

The messages to disable.

Remarks

When you pass this structure, the dwID member contains information for a set of gestures. This determines what the other flags will mean. If you set flags for pan messages, they will be different from those flags that are set for rotation messages.

The following table indicates the various identifiers for gestures that are supported by the dwID member of the GESTURECONFIG structure. Note that setting dwID to 0 indicates that global gesture configuration flags are set.

GetGestureInfo Function

Retrieves a gesture information structure given a handle to the gesture information.

Syntax

BOOL WINAPI GetGestureInfo(

__in HGESTUREINFO hGestureInfo,

__out PGESTUREINFO pGestureInfo

);

Parameters

hGestureInfo [in]

The gesture information handle.

pGestureInfo [out]

A pointer to the gesture information structure.

Return Value

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, use the GetLastError function.

Examples

GESTUREINFO gestureInfo = {0};

gestureInfo.cbSize = sizeof(gestureInfo);

BOOL bResult = GetGestureInfo((HGESTUREINFO)lParam, &gestureInfo);

SetGestureConfig Function

Configures the messages that are sent from a window for multitouch gestures.

Syntax

BOOL WINAPI SetGestureConfig(
__in HWND hwnd,
__in DWORD dwReserved,
__in UINT cIDs,
__in PGESTURECONFIG pGestureConfig,
__in UINT cbSize
);

Parameters

hwnd [in]

A handle to the window to set the gesture configuration on.

dwReserved [in]

This value is reserved and must be set to 0.

cIDs [in]

A count of the gesture configuration structures that are being passed.

pGestureConfig [in]

An array of gesture configuration structures that specify the gesture configuration.

cbSize [in]

The size of the array of gesture configuration structures.

Return Value

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, use the GetLastError function.

0 意見: