Event XbpWindow():wheel Foundation

Mouse wheel is activated.

Syntax
:wheel := {| aPos, aWheel, self | ... }
:wheel( <aPos>, <aWheel> ) --> self
xbeM_Wheel (1048599)
Parameters
<aPos>
<aPos> is an array containing two elements {nX, nY} that specify the current position of the mouse pointer. By default, the coordinates are relative to the lower left corner of the Xbase Part receiving the message.
<aWheel>
<aWheel> is an array with five elements {nKeyMask, nDistance, nLines, nOffset, nLinesToScroll}.
The first element (nKeyMask) is a numeric value indicating special keys pressed while the user rotates the mouse wheel. The value of this element is either 0 (no special key is pressed) or the result of one or more of the following #define constants listed in XBP.CH.
Constants for key states
Constant Description
XBP_MK_LBUTTON Left mouse button is pressed
XBP_MK_MBUTTON Middle mouse button is pressed
XBP_MK_RBUTTON Right mouse button is pressed
XBP_MK_CONTROL Ctrl key is pressed
XBP_MK_SHIFT Shift key is pressed
The second element (nDistance) indicates the distance the wheel is rotated, expressed in multiples or divisions of 120. The value is positive when the wheel is rotated up and negative when it is rotated down. Each multiple of 120 represents one "notch" on the mouse wheel, and typically corresponds to one line to be scrolled in the window. Note that higher resolution pointing devices and trackpads generate a larger number of xbeM_Wheel events with smaller values in the nDistance array element. These values directly correspond to the rotation distance reported by the hardware (driver), and are intended primarily for implementing custom scrolling behavior.
The third array element (nLines) specifies the number of lines to be scrolled. This is a computed value which takes into account previous mouse wheel operations, causing fractional rotations to be accumulated towards the next full line. The nLines element is non-zero only if one or more lines must be scrolled. For example, a mouse wheel being spun upwards so that approximately 1/3 of a line is reported with each xbeM_Wheel event might have the following sequence of values in the third array element: 0, 0, 1, 0, ... The nLines element is intended for implementing line-wise scrolling which may be required when displaying lines of text, for example.
The fourth array element (nOffset) contains the scroll offset in pixels. This is a computed value which takes into account previous mouse wheel operations, causing fractional rotations to be accumulated towards the next pixel. The scroll offset is based on the height of the default GUI font (XBPSYSFNT_GUIDEFAULT, see XbpFont:create()); one "notch" on the mouse wheel is roughly equivalent to two times the height of this font. The nOffset element is intended for implementing pixel-wise scrolling required when displaying images, for example.
The fifth array element (nLinesToScroll) specifies the system's "lines to scroll" setting, which is a setting configurable in Control Panel. This setting specifies a factor which applications should respect when performing scrolling operations. nLinesToScroll either contains a value greater than zero (number of lines to scroll per virtual line), or -1 if the user has configured page-wise scrolling.
Return

This method returns the object executing the method (self).

Description

The xbeM_Wheel event is generated when the user rotates the mouse wheel. This event is always sent to the Xbase Part that has input focus, no matter whether or not the mouse pointer is located within or outside the area of the Xbase Part. All classes derived from XbpWindow that display data which can be vertically scrolled have a default behavior to process this event. This applies to the following classes:

Classes with default behavior for xbeM_Wheel
XbpBrowse
XbpCombobox (XBPCOMBO_DROPDOWNLIST)
XbpListbox
XbpMLE
XbpQuickBrowse
XbpSpinbutton
XbpTreeview
XbpScrollbar *)
  1. Also see XbpScrollbar:wheel

The information in the <aWheel> array can be used for computing how far the content of the window needs to be scrolled to reflect the distance and direction in which the user has spun the mouse wheel. The elements in <aWheel> can be used for implementing both line-wise and pixel-wise (or high-resolution) scrolling.

Implementing line-wise scrolling

If the Xbase Part uses line-wise scrolling, for example, because it displays lines of text, a scrolling operation must be performed for as many lines as reported in the nLines element of the <aWheel> array. The xbeM_Wheel events where this element is zero can be ignored.

... 
// Line-wise scrolling: perform scrolling for full lines, 
// ignore wheel events for partial lines 
aWheel := mp2 

nLines := aWheel[3] 

// Determine whether page-wise scrolling is configured and 
// apply user's "lines to scroll" setting (factor) 
IF aWheel[5] == -1 
   lScrollPage := .T. 
ELSE 
   lScrollPage := .F. 
   nLines *= aWheel[5] 
ENDIF 

DO WHILE nLines > 0 
   IF aWheel[3] > 0 
      IF lScrollPage 
         ::pageDown()   // Move view downwards by one page 
      ELSE 
         ::down()       // Move view downwards by one line 
      ENDIF 
   ELSE 
      IF lScrollPage 
         ::pageUp()     // Move view upwards by one page 
      ELSE 
         ::up()         // Move view upwards by one line 
      ENDIF 
   ENDIF 
   nLines-- 
ENDDO 
... 

If the Xbase Part supports pixel-wise scrolling, however, the view must be scrolled by as many pixels as specified in the nOffset element of the <aWheel> array. The xbeM_Wheel events where this element is zero can be ignored. Note that fast rotations of the mouse wheel can cause "jumps" in a scrolled view when applying the scroll offsets in one go. For a smooth scrolling experience, it is instead recommended to scroll using a limited/fixed increment. This is outlined in the following code snippet.

... 
#define SCROLL_UNIT 2 

// Pixel-wise scrolling: scroll view for a number of pixels, 
// ignore wheel events for partial rotation 
aWheel := mp2 

nOffset:= Abs( aWheel[4] ) 

// Determine whether page-wise scrolling is configured and 
// apply user's "lines to scroll" setting (factor). If 
// page-wise scrolling is configured, use the window height 
// as the scroll unit. 
IF aWheel[5] == -1 
   nUnits := ::currentSize()[2] 
ELSE 
   nUnits := Min( nOffset, SCROLL_UNIT ) 
   nOffset *= aWheel[5] 
ENDIF 

DO WHILE nOffset > 0 
   IF aWheel[3] > 0 
      ::scrollDown( nUnits ) 
   ELSE 
      ::scrollUp( nUnits ) 
   ENDIF 
   nOffset -= nUnits 
ENDDO 
... 

When the first element of <aWheel> is not equal to zero, the $ operator can be used to check which additional keys are pressed while the mouse wheel is rotated. For example:

nEvent := AppEvent( @mp1, @mp2, @oXbp ) 

IF nEvent == xbeM_Wheel 
   IF XBP_MK_SHIFT $ mp2[1] 
      // code for Shift key processing 
   ENDIF 
ENDIF 

The event xbeM_Wheel is not supported for ActiveX controls. If an ActiveX control supports similar functionality, the corresponding COM/ActiveX methods or interfaces must be used instead.

Feedback

If you see anything in the documentation that is not correct, does not match your experience with the particular feature or requires further clarification, please use this form to report a documentation issue.