diff -r 4816d766a08a -r f345bda72bc4 Symbian3/PDK/Source/GUID-E9191C31-4D09-4C95-85E4-4282ADEE1D82.dita --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/PDK/Source/GUID-E9191C31-4D09-4C95-85E4-4282ADEE1D82.dita Tue Mar 30 11:56:28 2010 +0100 @@ -0,0 +1,138 @@ + + + + + +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 + +
\ No newline at end of file