BeginPanningFeedback 函数
必须针对窗口进行调用才能为边界反馈使用 UpdatePanningFeedback 方法。
语法
BOOL WINAPI BeginPanningFeedback( __in HWND hwnd );
参数
-
hwnd [in]
-
将具有边界反馈的窗口的句柄。
返回值
指示该函数是否成功。
评论
当用户到达可平移区域的末端时,平移反馈将导致正进行操作的窗口出现一个视觉提示。如果用户尝试将窗口拖到可平移区域之外,则该窗口也可以向用户提供反馈。
示例
case WM_GESTURE: // Get all the vertial scroll bar information si.cbSize = sizeof (si); si.fMask = SIF_ALL; GetScrollInfo (hWnd, SB_VERT, &si); yPos = si.nPos; ZeroMemory(&gi, sizeof(GESTUREINFO)); gi.cbSize = sizeof(GESTUREINFO); bResult = GetGestureInfo((HGESTUREINFO)lParam, &gi); if (bResult){ // now interpret the gesture switch (gi.dwID){ case GID_BEGIN: lastY = gi.ptsLocation.y; CloseGestureInfoHandle((HGESTUREINFO)lParam); break; // A CUSTOM PAN HANDLER // COMMENT THIS CASE OUT TO ENABLE DEFAULT HANDLER BEHAVIOR case GID_PAN: si.nPos -= (gi.ptsLocation.y - lastY) / scale; si.fMask = SIF_POS; SetScrollInfo (hWnd, SB_VERT, &si, TRUE); GetScrollInfo (hWnd, SB_VERT, &si); yOverpan -= lastY - gi.ptsLocation.y; lastY = gi.ptsLocation.y; if (gi.dwFlags & GF_BEGIN){ BeginPanningFeedback(hWnd); yOverpan = 0; } else if (gi.dwFlags & GF_END) { EndPanningFeedback(hWnd, TRUE); yOverpan = 0; } if (si.nPos == si.nMin || si.nPos >= (si.nMax - si.nPage)){ // we reached the bottom / top, pan UpdatePanningFeedback(hWnd, 0, yOverpan, gi.dwFlags & GF_INERTIA); } ScrollWindow(hWnd, 0, yChar * (yPos - si.nPos), NULL, NULL); UpdateWindow (hWnd); return DefWindowProc(hWnd, message, lParam, wParam); case GID_ZOOM: // Add Zoom handler return DefWindowProc(hWnd, message, lParam, wParam); default: // You have encountered an unknown gesture return DefWindowProc(hWnd, message, lParam, wParam); } }else{ DWORD dwErr = GetLastError(); if (dwErr > 0){ // something is wrong // 87 indicates that you are probably using a bad // value for the gi.cbSize } } return DefWindowProc (hWnd, message, wParam, lParam);
UpdatePanningFeedback 函数
当用户平移超过边界时,触发窗口位置的重新定位。
语法
BOOL WINAPI UpdatePanningFeedback( __in HWND hwnd, __in LONG lTotalOverpanOffsetX, __in LONG lTotalOverpanOffsetY, __in BOOL fInInertia );
参数
-
hwnd [in]
-
将具有边界反馈的窗口的句柄。
lTotalOverpanOffsetX [in]
-
指示平移超过可平移区域的水平末端的距离。
lTotalOverpanOffsetY [in]
-
指示平移超过可平移区域的垂直末端的距离。
fInInertia [in]
-
指示边界反馈是否合并了延时的标志。
返回值
如果函数成功,则返回值为非零值。
如果函数失败,则返回值为零。若要获取扩展的错误信息,请使用GetLastError 函数。
评论
当用户到达可平移区域的末端时,平移反馈将导致正进行操作的窗口出现一个视觉提示。如果用户尝试将窗口拖到可平移区域之外,则该窗口也可以向用户提供反馈。
注意 当处理作为延时而非手指移动的结果的移动时,fInInertia 参数应为 TRUE。
若要计算平移过量的值,则采用平移过量的虚拟大小,然后将其转换成屏幕坐标。
示例
case WM_GESTURE: // Get all the vertial scroll bar information si.cbSize = sizeof (si); si.fMask = SIF_ALL; GetScrollInfo (hWnd, SB_VERT, &si); yPos = si.nPos; ZeroMemory(&gi, sizeof(GESTUREINFO)); gi.cbSize = sizeof(GESTUREINFO); bResult = GetGestureInfo((HGESTUREINFO)lParam, &gi); if (bResult){ // now interpret the gesture switch (gi.dwID){ case GID_BEGIN: lastY = gi.ptsLocation.y; CloseGestureInfoHandle((HGESTUREINFO)lParam); break; // A CUSTOM PAN HANDLER // COMMENT THIS CASE OUT TO ENABLE DEFAULT HANDLER BEHAVIOR case GID_PAN: si.nPos -= (gi.ptsLocation.y - lastY) / scale; si.fMask = SIF_POS; SetScrollInfo (hWnd, SB_VERT, &si, TRUE); GetScrollInfo (hWnd, SB_VERT, &si); yOverpan -= lastY - gi.ptsLocation.y; lastY = gi.ptsLocation.y; if (gi.dwFlags & GF_BEGIN){ BeginPanningFeedback(hWnd); yOverpan = 0; } else if (gi.dwFlags & GF_END) { EndPanningFeedback(hWnd, TRUE); yOverpan = 0; } if (si.nPos == si.nMin || si.nPos >= (si.nMax - si.nPage)){ // we reached the bottom / top, pan UpdatePanningFeedback(hWnd, 0, yOverpan, gi.dwFlags & GF_INERTIA); } ScrollWindow(hWnd, 0, yChar * (yPos - si.nPos), NULL, NULL); UpdateWindow (hWnd); return DefWindowProc(hWnd, message, lParam, wParam); case GID_ZOOM: // Add Zoom handler return DefWindowProc(hWnd, message, lParam, wParam); default: // You have encountered an unknown gesture return DefWindowProc(hWnd, message, lParam, wParam); } }else{ DWORD dwErr = GetLastError(); if (dwErr > 0){ // something is wrong // 87 indicates that you are probably using a bad // value for the gi.cbSize } } return DefWindowProc (hWnd, message, wParam, lParam);
EndPanningFeedback 函数
初始化窗口位置信息以进行窗口平移。
语法
BOOL WINAPI EndPanningFeedback( __in HWND hwnd, BOOL fAnimateBack );
参数
-
hwnd [in]
-
要结束边界反馈的窗口的句柄。
fAnimateBack
-
指示窗口定位重置是否应采用平滑的动画。
返回值
指示该函数是否成功。成功则返回 TRUE;否则返回 FALSE。
评论
当用户到达可平移区域的末端时,平移反馈将导致正进行操作的窗口出现一个视觉提示。如果用户尝试将窗口拖到可平移区域之外,则该窗口也可以向用户提供反馈。
注意 如果 fAnimateBack 设置为 TRUE,则窗口将具有平滑的动画转换。如果 fAnimateBack 设置为 FALSE,则窗口将立即“跳回”。如果需要立即还原初始窗口位置,则将 fAnimateBack 设置为 False。
示例
case WM_GESTURE: // Get all the vertial scroll bar information si.cbSize = sizeof (si); si.fMask = SIF_ALL; GetScrollInfo (hWnd, SB_VERT, &si); yPos = si.nPos; ZeroMemory(&gi, sizeof(GESTUREINFO)); gi.cbSize = sizeof(GESTUREINFO); bResult = GetGestureInfo((HGESTUREINFO)lParam, &gi); if (bResult){ // now interpret the gesture switch (gi.dwID){ case GID_BEGIN: lastY = gi.ptsLocation.y; CloseGestureInfoHandle((HGESTUREINFO)lParam); break; // A CUSTOM PAN HANDLER // COMMENT THIS CASE OUT TO ENABLE DEFAULT HANDLER BEHAVIOR case GID_PAN: si.nPos -= (gi.ptsLocation.y - lastY) / scale; si.fMask = SIF_POS; SetScrollInfo (hWnd, SB_VERT, &si, TRUE); GetScrollInfo (hWnd, SB_VERT, &si); yOverpan -= lastY - gi.ptsLocation.y; lastY = gi.ptsLocation.y; if (gi.dwFlags & GF_BEGIN){ BeginPanningFeedback(hWnd); yOverpan = 0; } else if (gi.dwFlags & GF_END) { EndPanningFeedback(hWnd, TRUE); yOverpan = 0; } if (si.nPos == si.nMin || si.nPos >= (si.nMax - si.nPage)){ // we reached the bottom / top, pan UpdatePanningFeedback(hWnd, 0, yOverpan, gi.dwFlags & GF_INERTIA); } ScrollWindow(hWnd, 0, yChar * (yPos - si.nPos), NULL, NULL); UpdateWindow (hWnd); return DefWindowProc(hWnd, message, lParam, wParam); case GID_ZOOM: // Add Zoom handler return DefWindowProc(hWnd, message, lParam, wParam); default: // You have encountered an unknown gesture return DefWindowProc(hWnd, message, lParam, wParam); } }else{ DWORD dwErr = GetLastError(); if (dwErr > 0){ // something is wrong // 87 indicates that you are probably using a bad // value for the gi.cbSize } } return DefWindowProc (hWnd, message, wParam, lParam);
以上通过MSDN整理收集,非常权威的指导资料,希望对大家有帮助,感谢微软。