I am programing this with VB but the routines are almost the same in VC.
Sub PreSelect(x1 As Single, y1 As Single)
Dim objx, objy, objz As GLdouble
Dim winx#, winy#, winz#
Dim mMatrix(15) As GLdouble
Dim pMatrix(15) As GLdouble
Dim vMatrix(3) As GLint
Dim cdist As Single
Dim mindist As Single
Dim typesel As Integer
Dim numbsel As Long
Dim selwx As Double
Dim selwy As Double
mindist = 15
glGetDoublev glgModelViewMatrix, mMatrix(0)
glGetDoublev glgProjectionMatrix, pMatrix(0)
glGetIntegerv glgViewport, vMatrix(0)
For i = 1 To m_numbpnt
'm_pnt(i).psel = False
objx = m_pnt(i).v(1)
objy = m_pnt(i).v(2)
objz = m_pnt(i).v(3)
gluProject objx, objy, objz, mMatrix(0), pMatrix(0), vMatrix(0), winx#, winy#, winz#
winy# = Me.ScaleHeight - winy#
cdist = Sqr((x1 - winx#) ^ 2 + (y1 - winy#) ^ 2)
If cdist < mindist Then
numbsel = i
mindist = cdist
typesel = 1
selwx = winx#
selwy = winy#
End If
Next i
For i = 1 To m_numbtri
'm_tri(i).psel = False
objx = (m_pnt(m_tri(i).pnt(1)).v(1) + m_pnt(m_tri(i).pnt(2)).v(1) + m_pnt(m_tri(i).pnt(3)).v(1)) * 0.333333333333333
objy = (m_pnt(m_tri(i).pnt(1)).v(2) + m_pnt(m_tri(i).pnt(2)).v(2) + m_pnt(m_tri(i).pnt(3)).v(2)) * 0.333333333333333
objz = (m_pnt(m_tri(i).pnt(1)).v(3) + m_pnt(m_tri(i).pnt(2)).v(3) + m_pnt(m_tri(i).pnt(3)).v(3)) * 0.333333333333333
gluProject objx, objy, objz, mMatrix(0), pMatrix(0), vMatrix(0), winx#, winy#, winz#
winy# = Me.ScaleHeight - winy#
cdist = Sqr((x1 - winx#) ^ 2 + (y1 - winy#) ^ 2)
If cdist < mindist Then
numbsel = i
mindist = cdist
typesel = 2
selwx = winx#
selwy = winy#
End If
Next i
End Sub