Win32: ограниченное движение дочерних окон

У меня например 9 дочерних окон. Теперь каждый из них я могу перемещать в любом направлении внутри родительского окна. Но я хочу, чтобы тот, что посередине, перемещался только влево, вправо, вверх и вниз (но не по диагонали !!!) и автоматически выравнивался по центру. Я не могу понять, как это реализовать. Любая помощь приветствуется. Даже в C/C++, Или на словах — просто объяснение.

ограниченное движение дочерних окон

Вот как я обрабатываю движение дочерних окон:

.elseif [iMsg] == WM_LBUTTONDOWN

invoke SetCapture, [hwnd]

invoke InvalidateRect, [hwnd], 0, TRUE

xor eax, eax
ret

.elseif [iMsg] == WM_LBUTTONUP

invoke ReleaseCapture

xor eax, eax
ret

.elseif [iMsg] == WM_MOUSEMOVE

.if [wParam] & MK_LBUTTON

movsx eax, word ptr [lParam]
mov [x], eax
movsx eax, word ptr [lParam+2]
mov [y], eax

invoke GetChildCenter, [hwnd], addr center_x, addr center_y

mov eax, [x]
sub eax, CELL_CENTER
add [center_x], eax

mov eax, [y]
sub eax, CELL_CENTER
add [center_y], eax

invoke MoveChildByCenter, [hwnd], [center_x], [center_y]

.endif

xor eax, eax
ret

MoveChildByCenter

MoveChildByCenter proc hwnd:HWND, x:dword, y:dword

sub [x], CELL_CENTER
sub [y], CELL_CENTER
invoke MoveWindow, [hwnd], [x], [y], CELL_WIDTH, CELL_HEIGHT, TRUE

ret

MoveChildByCenter endp

GetChildCenter (относительно родительского окна)

GetChildCenter proc hwnd:HWND, x:ptr dword, y:ptr dword

local rect:RECT
local parent:HWND
local point:POINT
invoke GetWindowRect, [hwnd], addr rect

mov eax, [rect].left
mov [point].x, eax
add [point].x, CELL_WIDTH/2
mov eax, [rect].top
mov [point].y, eax
add [point].y, CELL_HEIGHT/2

invoke GetParent, [hwnd]
mov [parent], eax

invoke ScreenToClient, [parent], addr point

mov ecx, [x]
mov eax, [point].x
mov [ecx], eax
mov ecx, [y]
mov eax, [point].y
mov [ecx], eax

ret

GetChildCenter endp

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]