多個視窗靠近至一定距離時自動吸附合併,拖動其中一個視窗,其他吸附視窗同步移動,彷彿合為一體。WinAmp、CDOK 等經典播放器皆採用此技術提升使用體驗。
定時器輪詢既浪費資源又延遲大。Windows 提供即時移動訊息:
WM_MOVING:移動中,lParam 指向 RECT,可即時修正位置。WM_WINDOWPOSCHANGING:lParam 指向 WINDOWPOS 結構,包含位置、大小、Z-order 等完整資訊,更適合多視窗協同。typedef struct tagWINDOWPOS {
HWND hwnd;
HWND hwndInsertAfter;
int x, y, cx, cy;
UINT flags;
} WINDOWPOS;
WM_WINDOWPOSCHANGING 中遍歷其他視窗,計算四邊距離。MAGNET_DISTANCE(如 10 像素),修正 WINDOWPOS.x/y 使其對齊,並記錄吸附關係。WM_MOVE 或直接 SetWindowPos)。進階版可參考 CDOK:無主從之分,任一視窗被拖動皆帶動群組,需引入「群組代表」或「相對偏移陣列」管理。