void GestureHandler::handleRotate(HWND hWnd, GESTUREINFO gi) { double radians = 0; double radian_change = 0; double degree_change = 0; if (gi.dwFlags & GF_BEGIN) { m_arguments = gi.ullArguments; radians = GID_ROTATE_ANGLE_FROM_ARGUMENT(m_arguments); m_initial_degrees = radians * (180 / M_PI); if (m_initial_degrees < 0) m_initial_degrees = 360 + m_initial_degrees; m_rect->changeColor(m_initial_degrees, 0); //InvalidateRect(hWnd, NULL, TRUE); invalidate(hWnd, TRUE); } else { int temp_total = 0; radian_change = GID_ROTATE_ANGLE_FROM_ARGUMENT(gi.ullArguments); degree_change = radian_change * (180 / M_PI); temp_total = (int) (m_initial_degrees + degree_change); if (temp_total < 0) temp_total = 360 + temp_total; temp_total = temp_total % 360; m_rect->changeColor(temp_total, degree_change); //InvalidateRect(hWnd, NULL, TRUE); invalidate(hWnd, FALSE); } }
PRBool nsWinGesture::ProcessGestureMessage(HWND hWnd, WPARAM wParam, LPARAM lParam, nsSimpleGestureEvent& evt) { GESTUREINFO gi; ZeroMemory(&gi,sizeof(GESTUREINFO)); gi.cbSize = sizeof(GESTUREINFO); BOOL result = GetGestureInfo((HGESTUREINFO)lParam, &gi); if (!result) return PR_FALSE; // The coordinates of this event nsPointWin coord; coord = gi.ptsLocation; coord.ScreenToClient(hWnd); evt.refPoint.x = coord.x; evt.refPoint.y = coord.y; // Multiple gesture can occur at the same time so gesture state // info can't be shared. switch(gi.dwID) { case GID_BEGIN: case GID_END: // These should always fall through to DefWndProc return PR_FALSE; break; case GID_ZOOM: { if (gi.dwFlags & GF_BEGIN) { // Send a zoom start event // The low 32 bits are the distance in pixels. mZoomIntermediate = (float)gi.ullArguments; evt.message = NS_SIMPLE_GESTURE_MAGNIFY_START; evt.delta = 0.0; } else { // Send a zoom intermediate/end event, the delta is the change // in touch points. evt.message = NS_SIMPLE_GESTURE_MAGNIFY_UPDATE; // (positive for a "zoom in") evt.delta = -1.0 * (mZoomIntermediate - (float)gi.ullArguments); mZoomIntermediate = (float)gi.ullArguments; } } break; case GID_ROTATE: { // Send a rotate start event double radians = 0.0; // On GF_BEGIN, ullArguments contains the absolute rotation at the // start of the gesture. In later events it contains the offset from // the start angle. if (gi.ullArguments != 0) radians = GID_ROTATE_ANGLE_FROM_ARGUMENT(gi.ullArguments); double degrees = -1 * radians * (180/M_PI); if (gi.dwFlags & GF_BEGIN) { // At some point we should pass the initial angle in // along with delta. It's useful. degrees = mRotateIntermediate = 0.0; } evt.direction = 0; evt.delta = degrees - mRotateIntermediate; mRotateIntermediate = degrees; if (evt.delta > 0) evt.direction = nsIDOMSimpleGestureEvent::ROTATION_COUNTERCLOCKWISE; else if (evt.delta < 0) evt.direction = nsIDOMSimpleGestureEvent::ROTATION_CLOCKWISE; if (gi.dwFlags & GF_BEGIN) evt.message = NS_SIMPLE_GESTURE_ROTATE_START; else if (gi.dwFlags & GF_END) evt.message = NS_SIMPLE_GESTURE_ROTATE; else evt.message = NS_SIMPLE_GESTURE_ROTATE_UPDATE; } break; case GID_TWOFINGERTAP: { // Normally maps to "restore" from whatever you may have recently changed. A simple // double click. evt.message = NS_SIMPLE_GESTURE_TAP; } break; case GID_PRESSANDTAP: { // Two finger right click. Defaults to right click if it falls through. evt.message = NS_SIMPLE_GESTURE_PRESSTAP; } break; } return PR_TRUE; }