Tarferi icon

For SI - Recalculating wnd

Tarferi | PRO | 07/16/19 10:14:19 PM UTC | 0 ⭐ | 16166 👁️ | Never ⏰ | []
C++ (WinAPI) |

0 B

|

None

|

0 👍

/

0 👎

 
#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, &currentWndBase);\
GetWindowRect(GetParent(pos_data.handles[index]), &currentBase);\
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

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎