property Grid.ItemFromPoint (X as OLE_XPOS_PIXELS, Y as OLE_YPOS_PIXELS, ColIndex as Long, HitTestInfo as HitTestInfoEnum) as HITEM
Retrieves the item given a point.

 TypeDescription 
   X as OLE_XPOS_PIXELS A single that specifies the current X location of the mouse pointer. The x values is always expressed in client coordinates.   
   Y as OLE_YPOS_PIXELS A single that specifies the current X location of the mouse pointer. The x values is always expressed in client coordinates.  
   ColIndex as Long A long expression that indicates on return the column where the point belongs.   
   HitTestInfo as HitTestInfoEnum A HitTestInfoEnum expression that determines on return the position of the cursor within the cell.  
   HITEM An item's handle where the point is.  

Use the ItemFromPoint property to get the item from the point specified by the {X,Y}. The X and Y coordinates are expressed in client coordinates, so a conversion must be done in case your coordinates are relative to the screen or to other window. If the X parameter is -1 and Y parameter is -1 the ItemFromPoint property determines the handle of the item from the cursor. Use the ColumnFromPoint property to get the column from point ( when the control's header is visible ). Use the SelectableItem property to specify the user can select an item. The WordFromPoint property determines the word from the cursor.

The following VB sample prints the cell's value from the cursor:

Private Sub Grid1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    ' Prints the cell over the cursor ( it doesn't include the inner cells )
    With Grid1
        Dim c As Long, hit As Long
        Dim h As HITEM
        h = .ItemFromPoint(-1, -1, c, hit)
        If Not (h = 0) Then
            Debug.Print .Items.CellCaption(h, c)
        End If
    End With
End Sub

The following VB sample prints the cell's value from the cursor ( the sample doesn't print the inner cells that are created using the SplitCell property of the Items object ) :

Private Sub Grid1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    ' Prints the cell over the cursor ( it doesn't include the inner cells )
    With Grid1
        Dim c As Long, hit As Long
        Dim h As HITEM
        h = .ItemFromPoint(-1, -1, c, hit)
        If Not (h = 0) Then
            Debug.Print .Items.CellValue(h, c)
        End If
    End With
End Sub

The following VB sample prints the cell's value from the cursor ( the sample prints the caption of the inner cells too ):

Private Sub Grid1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    ' Prints the cell over the cursor ( it includes the inner cells )
    With Grid1
        Dim c As Long, hit As Long
        Dim h As HITEM
        h = .ItemFromPoint(-1, -1, c, hit)
        If Not (h = 0) Or Not (c = 0) Then
            Debug.Print .Items.CellValue(h, c)
        End If
    End With
End Sub

The following VB sample displays the index of the icon being clicked, when the cell contains multiple icons:

Private Sub Grid1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim i As HITEM, h As HitTestInfoEnum, c As Long
    With Grid1
        i = .ItemFromPoint(-1, -1, c, h)
    End With
    If Not (i = 0) Or Not (c = 0) Then
        If exHTCellIcon = (h And exHTCellIcon) Then
            Debug.Print "The index of icon being clicked is: " & (h And &HFFFF0000) / 65536
        End If
    End If
End Sub

The following VB sample displays the cell's value from the cursor when hovering the inner controls ( exgrid ) too:

Private Function InsideItem(ByRef gObject As Object, ByRef c As Long, ByRef hit As HitTestInfoEnum) As Long
    Dim i As Long
    i = gObject.ItemFromPoint(-1, -1, c, hit)
    If (i <> 0) Then
        If (IsEmpty(gObject.Items.ItemObject(i))) Then
            InsideItem = i
            Exit Function
        End If
        Set gObject = gObject.Items.ItemObject(i)
        With gObject
            i = gObject.ItemFromPoint(-1, -1, c, hit)
            InsideItem = i
        End With
    End If
End Function

And the MouseMove/ItemOLEEvent should look such as:

Private Sub Grid1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim c As Long, hit As HitTestInfoEnum, i As Long
    Dim g As Object
    Set g = Grid1.Object
    i = InsideItem(g, c, hit)
    Debug.Print g.Items.CellValue(i, c)
End Sub

Private Sub Grid1_ItemOleEvent(ByVal Item As EXGRIDLibCtl.HITEM, ByVal Ev As EXGRIDLibCtl.IOleEvent)
    If (Ev.ID = -606) Then   ' Inside Mouse Move
        Dim c As Long, hit As HitTestInfoEnum, i As Long
        Dim g As Object
        Set g = Grid1.Object
        i = InsideItem(g, c, hit)
        Debug.Print g.Items.CellValue(i, c)
    End If
End Sub

The following C++ sample displays the cell's from the point:

void OnMouseMoveGrid1(short Button, short Shift, long X, long Y) 
{
	long c = 0, hit = 0;
	long h = m_grid.GetItemFromPoint( -1, -1, &c, &h );
	if ( ( h != 0 ) || ( c != 0 ) )
	{
		COleVariant vtItem( h ), vtColumn( c );
		CItems items = m_grid.GetItems();
		CString strOutput;
		strOutput.Format( "Cell: %s\n" , items.GetCellCaption( vtItem, vtColumn ) );
		OutputDebugString( strOutput );
	}
}

The following C++ sample displays the cell's from the point:

#include "Items.h"

static CString V2S( VARIANT* pv, LPCTSTR szDefault = _T("") )
{
	if ( pv )
	{
		if ( pv->vt == VT_ERROR )
			return szDefault;

		COleVariant vt;
		vt.ChangeType( VT_BSTR, pv );
		return V_BSTR( &vt );
	}
	return szDefault;
}

void OnMouseMoveGrid1(short Button, short Shift, long X, long Y) 
{
	long c = 0, hit = 0, hItem = m_grid.GetItemFromPoint( -1, -1, &c, &hit );
	if ( ( hItem != 0 ) || ( c != 0 ) )
	{
		CItems items = m_grid.GetItems();
		COleVariant vtItem( hItem ), vtColumn( c );
		CString strCaption = V2S( &items.GetCellValue( vtItem, vtColumn ) ), strOutput;
		strOutput.Format( "Cell: '%s', Hit = %08X\n", strCaption, hit );
		OutputDebugString( strOutput );
	}
}

The following VB.NET sample displays the cell's from the point:

Private Sub AxGrid1_MouseMoveEvent(ByVal sender As Object, ByVal e As AxEXGRIDLib._IGridEvents_MouseMoveEvent) Handles AxGrid1.MouseMoveEvent
    With AxGrid1
        Dim i As Integer, c As Integer, hit As EXGRIDLib.HitTestInfoEnum
        i = .get_ItemFromPoint(-1, -1, c, hit)
        If (Not (i = 0) Or Not (c = 0)) Then
            Debug.WriteLine("Cell: " & .Items.CellValue(i, c) & " Hit: " & hit.ToString())
        End If
    End With
End Sub

The following C# sample displays the cell's from the point:

private void axGrid1_MouseMoveEvent(object sender, AxEXGRIDLib._IGridEvents_MouseMoveEvent e)
{
	int c = 0;
	EXGRIDLib.HitTestInfoEnum hit;
	int i = axGrid1.get_ItemFromPoint( -1, -1, out c,out hit );
	if ( ( i != 0 ) || ( c != 0 ) )
	{
		object cap = axGrid1.Items.get_CellValue(i, c);
		string s = cap != null ? cap.ToString() : "";
		s = "Cell: " + s + ", Hit: " + hit.ToString();
		System.Diagnostics.Debug.WriteLine(s);
	}
}

The following VFP sample displays the cell's from the point:

*** ActiveX Control Event ***
LPARAMETERS button, shift, x, y

local c, hit
c = 0
hit = 0
with thisform.Grid1
	.Items.DefaultItem = .ItemFromPoint( -1, -1, @c, @hit )
	if ( .Items.DefaultItem <> 0 ) or ( c <> 0 )
		wait window nowait .Items.CellValue( 0, c ) + " " + Str( hit )
	endif
endwith

 

 


Send comments on this topic.
1999-2015 Exontrol.COM, Software. All rights reserved.