diff -r ae94777fff8f -r 59758314f811 Symbian3/PDK/Source/GUID-E9191C31-4D09-4C95-85E4-4282ADEE1D82.dita --- a/Symbian3/PDK/Source/GUID-E9191C31-4D09-4C95-85E4-4282ADEE1D82.dita Fri Jun 11 12:39:03 2010 +0100 +++ b/Symbian3/PDK/Source/GUID-E9191C31-4D09-4C95-85E4-4282ADEE1D82.dita Fri Jun 11 15:24:34 2010 +0100 @@ -1,138 +1,137 @@ - - - - - -Handling -pointer events in custom controlsThe Symbian platform passes touch events to applications by calling CCoeControl::HandlePointerEventL(). -The application that receives these events is the one that owns the window. -

While this method has been available since S60 3.0, it previously has been -an optional method. If you have derived a custom control from CCoeControl, -then you must implement the CCoeControl::HandlePointerEventL() method. -Otherwise, your application cannot react to the touch events passed to it.

-

You have to implement at least CCoeControl::HandlePointerEventL() into -your own custom UI components. If you have a container control that owns other -controls, you have to remember to call the base class implementation of CCoeControl::HandlePointerEventL() before -your additional code as illustrated below:

-void CMyContainerControl::HandlePointerEventL() - { - // Remember to call base class implementation - CCoeControl::HandlePointerEventL(); - - // Your additional code here - // ... - } -

The following figure illustrates changes in the code. Items marked with -a black frame indicate usage of features in earlier editions, and items marked -with a red frame are new features.

- -<parmname>CCoeControl::HandlePointerEventL()</parmname> usage - - -

To handle pointer events in your custom control:

-
    -
  1. In your custom -control header file, include the CCoeControl::HandlePointerEventL() method.

    public: // from CCoeControl - void HandlePointerEventL(const TPointerEvent& aPointerEvent);
  2. -
  3. In your custom -control, implement the CCoeControl::HandlePointerEventL() method.

    void CMyControl::HandlePointerEventL(const TPointerEvent& aPointerEvent) - { - switch( aPointerEvent.iType ) - { - case TPointerEvent::EButton1Up: - { - // Is the pointer position on this component? - if (Rect().Contains(aPointerEvent.iPosition)) - { - SetFocus(ETrue); - // Tell container control that this is focused control - CMyContainerControl* parent = static_cast<CMyContainerControl*>(Parent()); - parent->SetLastFocusedControl(this); - } - break; - } - default: - { - break; - } - } - }

    By default, the Symbian platform only passes EButton1Down and EButton1Up events -to CCoeControl::HandlePointerEventL(). To enable drag -events, see Enabling -additional touch events for your application.

  4. -
  5. In your custom -container control header file, include the CCoeControl::HandlePointerEventL() method.

    void HandlePointerEventL(const TPointerEvent& aPointerEvent);
  6. -
  7. In your custom -container control, implement the CCoeControl::HandlePointerEventL() method.

    void CMyContainerControl::HandlePointerEventL(const TPointerEvent& aPointerEvent) - { - // Check if touch is enabled or not - if( !AknLayoutUtils::PenEnabled() ) - { - return; - } - - // Remove last focus - if (iLastFocusedControl) - { - iLastFocusedControl->SetFocus(EFalse); - } - - // Call base class method, that forwards pointer event the right child - // component - CCoeControl::HandlePointerEventL(aPointerEvent); - - // Check all button up cases again - if (aPointerEvent.iType == TPointerEvent::EButton1Up) - { - // Find which control was focused / received pointer event - CCoeControlArray::TCursor cursor = Components().Begin(); - CCoeControl* ctrl = NULL; - TInt counter = 0; - while ((ctrl = cursor.Control<CCoeControl>()) != NULL) - { - if (ctrl->Rect().Contains(aPointerEvent.iPosition)) - { - // Set focused index for the scroll bar - iFocusedIndex = counter; - break; - } - cursor.Next(); - counter++; - } - } - - // Do drawing - UpdateScrollBarFrameL(); - DrawNow(); - }

    For information on the AknLayoutUtils::PenEnabled() method, -see Checking for touch -support at runtime.

  8. -
- -
-Related information -Enabling -additional touch events for your application -Providing -tactile feedback -Handling -key events in your application - + + + + + +Handling +pointer events in custom controlsThe Symbian platform passes touch events to applications by calling CCoeControl::HandlePointerEventL(). +The application that receives these events is the one that owns the window. +

While this method has been available since S60 3.0, it previously has been +an optional method. If you have derived a custom control from CCoeControl, +then you must implement the CCoeControl::HandlePointerEventL() method. +Otherwise, your application cannot react to the touch events passed to it.

+

You have to implement at least CCoeControl::HandlePointerEventL() into +your own custom UI components. If you have a container control that owns other +controls, you have to remember to call the base class implementation of CCoeControl::HandlePointerEventL() before +your additional code as illustrated below:

+void CMyContainerControl::HandlePointerEventL() + { + // Remember to call base class implementation + CCoeControl::HandlePointerEventL(); + + // Your additional code here + // ... + } +

The following figure illustrates changes in the code. Items marked with +a black frame indicate usage of features in earlier editions, and items marked +with a red frame are new features.

+ +<parmname>CCoeControl::HandlePointerEventL()</parmname> usage + + +

To handle pointer events in your custom control:

+
    +
  1. In your custom +control header file, include the CCoeControl::HandlePointerEventL() method.

    public: // from CCoeControl + void HandlePointerEventL(const TPointerEvent& aPointerEvent);
  2. +
  3. In your custom +control, implement the CCoeControl::HandlePointerEventL() method.

    void CMyControl::HandlePointerEventL(const TPointerEvent& aPointerEvent) + { + switch( aPointerEvent.iType ) + { + case TPointerEvent::EButton1Up: + { + // Is the pointer position on this component? + if (Rect().Contains(aPointerEvent.iPosition)) + { + SetFocus(ETrue); + // Tell container control that this is focused control + CMyContainerControl* parent = static_cast<CMyContainerControl*>(Parent()); + parent->SetLastFocusedControl(this); + } + break; + } + default: + { + break; + } + } + }

    By default, the Symbian platform only passes EButton1Down and EButton1Up events +to CCoeControl::HandlePointerEventL(). To enable drag +events, see Enabling +additional touch events for your application.

  4. +
  5. In your custom +container control header file, include the CCoeControl::HandlePointerEventL() method.

    void HandlePointerEventL(const TPointerEvent& aPointerEvent);
  6. +
  7. In your custom +container control, implement the CCoeControl::HandlePointerEventL() method.

    void CMyContainerControl::HandlePointerEventL(const TPointerEvent& aPointerEvent) + { + // Check if touch is enabled or not + if( !AknLayoutUtils::PenEnabled() ) + { + return; + } + + // Remove last focus + if (iLastFocusedControl) + { + iLastFocusedControl->SetFocus(EFalse); + } + + // Call base class method, that forwards pointer event the right child + // component + CCoeControl::HandlePointerEventL(aPointerEvent); + + // Check all button up cases again + if (aPointerEvent.iType == TPointerEvent::EButton1Up) + { + // Find which control was focused / received pointer event + CCoeControlArray::TCursor cursor = Components().Begin(); + CCoeControl* ctrl = NULL; + TInt counter = 0; + while ((ctrl = cursor.Control<CCoeControl>()) != NULL) + { + if (ctrl->Rect().Contains(aPointerEvent.iPosition)) + { + // Set focused index for the scroll bar + iFocusedIndex = counter; + break; + } + cursor.Next(); + counter++; + } + } + + // Do drawing + UpdateScrollBarFrameL(); + DrawNow(); + }

    For information on the AknLayoutUtils::PenEnabled() method, +see Checking for touch +support at runtime.

  8. +
+
    +
  • Features introduced:

      +
    • Optional TPointerEvent::EDrag() for receiving +events indicating that a mobile device user is dragging it across the screen.

      For +more information on this and other touch event options, see Enabling additional touch events for your application.

    • +
    • Optional MTouchFeedback observer for sending a +vibration when a mobile device user touches a control with the feedback interface.

      For +more information on tactile feedback, see Tactile +feedback.

    • +
  • +
+
+Related information +Enabling +additional touch events for your application +Providing +tactile feedback +Handling +key events in your application +
\ No newline at end of file