>I haven't gotten the blessing from the users yet, though.
If you dont', just throw this in the headers:
nWhere = 0
this.Parent.Parent.GridHitTest(MCOL(MWINDOW(), 3), MROW(MWINDOW(), 3), @nWhere)
IF INLIST(nWhere, 2, 13)
RETURN
ENDIF
Doesn't help much for movable though. In that case, you'll want to use one of the other techniques mentioned.
Users can sort my grids by both clicking on the header (it sorts, and then sorts ascending or descending for all sub sequent clicks), and right clicking for a context menu like you say, but mine shows them "Sort Asecnding" and "Sort Descending" and putting a check mark by the correct one if the column is already sorted.