#define SIZES_DATA_SIZE 8
struct SIZES_DATA {
HWND wnd;
RECT wndBase;
RECT bases[SIZES_DATA_SIZE];
RECT defaults[SIZES_DATA_SIZE];
HWND handles[SIZES_DATA_SIZE];
bool moveL[SIZES_DATA_SIZE];
bool moveR[SIZES_DATA_SIZE];
bool moveT[SIZES_DATA_SIZE];
bool moveB[SIZES_DATA_SIZE];
};
SIZES_DATA pos_data = { 0 };
#define COLLECT_MAIN {\
GetWindowRect(pos_data.wnd, &(pos_data.wndBase));\
COLLECT_HANDLE(0, IDC_GROUPLIST, false, true, false, false);\
COLLECT_HANDLE(1, IDC_MAPLIST, false, true, false, true);\
COLLECT_HANDLE(2, IDC_STATIC, false, true, false, false);\
COLLECT_HANDLE(3, IDC_STATIC2, false, true, false, true);\
COLLECT_HANDLE(4, IDC_RESTOREFILE, false, false, true, true);\
COLLECT_HANDLE(5, IDC_DELETEMAP, true, true, true, true);\
COLLECT_HANDLE(6, IDC_DELETEGROUP, true, true, false, false);\
COLLECT_HANDLE(7, IDC_CLEARALL, false, false, false, false);\
}
#define COLLECT_HANDLE(index, item, _moveL, _moveR, _moveT, _moveB) {\
pos_data.moveL[index] = _moveL;\
pos_data.moveR[index] = _moveR;\
pos_data.moveT[index] = _moveT;\
pos_data.moveB[index] = _moveB;\
pos_data.handles[index] = GetDlgItem(pos_data.wnd, item);\
GetWindowRect(pos_data.handles[index], &(pos_data.defaults[index]));\
GetWindowRect(GetParent(pos_data.handles[index]), &(pos_data.bases[index]));\
pos_data.defaults[index].left -= (pos_data.bases[index].right - pos_data.bases[index].left);\
pos_data.defaults[index].right -= pos_data.bases[index].right;\
pos_data.defaults[index].top -= (pos_data.bases[index].bottom - pos_data.bases[index].top);\
pos_data.defaults[index].bottom -= pos_data.bases[index].bottom;\
}
#define MOVE_ALL \
if (pos_data.wnd == 0) {\
pos_data.wnd = hDlg;\
COLLECT_MAIN\
}\
MOVE(0);\
MOVE(1);\
MOVE(2);\
MOVE(3);\
MOVE(4);\
MOVE(5);\
MOVE(6);\
MOVE(7);\
#define MOVE(index) {\
RECT currentBase;\
RECT currentWndBase;\
GetWindowRect(pos_data.wnd, ¤tWndBase);\
GetWindowRect(GetParent(pos_data.handles[index]), ¤tBase);\
RECT rect;\
int diffX = currentWndBase.left - pos_data.wndBase.left;\
int diffY = currentWndBase.top - pos_data.wndBase.top;\
rect.left = pos_data.defaults[index].left + (pos_data.moveL[index] ? (currentBase.right - currentBase.left) + diffX: (pos_data.bases[index].right - pos_data.bases[index].left) + diffX);\
rect.right = pos_data.defaults[index].right + (pos_data.moveR[index] ? currentBase.right : pos_data.bases[index].right + diffX);\
rect.top = pos_data.defaults[index].top + (pos_data.moveT[index] ? (currentBase.bottom - currentBase.top) + diffY : (pos_data.bases[index].bottom - pos_data.bases[index].top) + diffY);\
rect.bottom = pos_data.defaults[index].bottom + (pos_data.moveB[index] ? currentBase.bottom : pos_data.bases[index].bottom + diffY);\
POINT p;\
p.x = rect.left;p.y = rect.top;ScreenToClient(GetParent(pos_data.handles[index]), &p);rect.left = p.x;rect.top = p.y;\
p.x = rect.right;p.y = rect.bottom;ScreenToClient(GetParent(pos_data.handles[index]), &p);rect.right = p.x;rect.bottom = p.y;\
MoveWindow(pos_data.handles[index], rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, true);\
}
Comments
0 B
|👍
/👎