Was noch wichtig wäre...


Ich möchte Ihr Augenmerk an dieser Stelle speziell auf einen Punkt lenken (der Rest der Programmlogik kann anhand der ausführlich kommentierten Demo nachvollzogen werden)

// return the message result explicitly, otherwise we would not
// receive DL_DRAGGING
SetWindowLong(hDlg, DWL_MSGRESULT, Integer(TRUE));
// message handled Result := True;

Wie der Kommentar schon sagt, ist es wichtig, dass wir dem System mitteilen, dass wir die "DL_BEGINDRAG"-Nachricht behandelt haben. Täten wir dies nicht, würde uns Windows keine "DL_DRAGGING"-Nachrichten schicken, weil es nicht weiß, ob der "Zieh"-Vorgang begonnen hat oder nicht. Und im Zweifelsfall bleibt Windows eben stumm. Sicher ist sicher.
Da ich auch hier wieder aus Bequemlichkeit zu einer Dialogressource gegriffen habe, erfolgt die Benachrichtigung durch den Aufruf der Funktion "SetWindowLong" mit dem Index-Parameter DWL_MSGRESULT. Das PSDK bemerkt dazu (frei übersetzt):

 PSDK 

Wird "SetWindowLong" mit dem Index DWL_MSGRESULT benutzt, um den Rückgabewert einer Dialog-Prozedur zu setzen, sollte danach auch noch zusätzlich true zurückgegeben werden, da sonst der übergebene Rückgabewert wieder überschrieben werden könnte.