Привет!
1) в обработчике LBUTTONDOWN запоминаются текущие координаты, SetCapture(hwnd).
2) в обработчике LBUTTONUP проверяется GetCapture()==hwnd, тогда ReleaseCapture().
3) в обработчике MOUSEMOVE проверяется GetCapture()==hwnd, тогда:
— GetWindowRect(hwnd...)
— ScreenToClient(GetParent(hwnd)...) -> получаешь координаты новой точки
— окно сдвигается на координаты новой точки минус запомненные координаты (т.к. координаты мыши — клиентские)
— текущие координаты изменяюся на текующие (более текущие)..
Кароче это я пытался из winAPI-шной своей проги что-то описать..

Странно, да? Может ты забыл про это самое преобразование в экранные координаты?