Holy cow, I wrote a book!
One customer was confused by the two list view hit-test messages
What is the difference between the two?
The LVM_HITTEST message tries to find the item the
point is over.
The LVM_INSERTMARKHITTEST message tries to find the item the
point is next to.
For example, suppose you have two 32×32 items,
item zero at (0, 0) and
item one at (0, 32).
You use LVM_HITTEST when you the user is dragging something
and you want to see what the item is going to be dropped on.
For example, your program might ask the user to drag an icon
representing a trouble report and drop it onto the icon representing
the department the report should be assigned to.
You use LVM_INSERTMARKHITTEST
when the user is dragging something and you want to see what the item
is going to be dropped between.
For example, your program might show a list of customers, and the user
can drag a new customer into the list or rearrange the customers
by dragging an existing one.
The LVM_INSERTMARKHITTEST message tells you where the
dropped item should go.
The shell uses both of these hit-test messages when you drop a
file into an Explorer window.
It uses the
Explorer uses LVM_HITTEST to determine whether you're
dropping the file onto an item in the folder (hit-test reports
or whether you're dropping the file into the folder itself
(hit-test reports nowhere).
Furthermore, if you're dropping into the folder and
Auto-Arrange is enabled, then Explorer uses the
LVM_INSERTMARKHITTEST to determine where to place the item
after it is dropped.