У меня например 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
Задача ещё не решена.
Других решений пока нет …