#pragma once #include "CDialogResizeHelperCompat.h" #include class CDialogResizeHelper : public CMessageMap { public: typedef CDialogResizeHelperCompat::param ParamOld; struct Param { uint32_t id; float snapLeft, snapTop, snapRight, snapBottom; }; private: void AddSizeGrip(); public: inline void set_min_size(unsigned x, unsigned y) { min_x = x; min_y = y; } inline void set_max_size(unsigned x, unsigned y) { max_x = x; max_y = y; } BEGIN_MSG_MAP_EX(CDialogResizeHelper) if (uMsg == WM_INITDIALOG) OnInitDialog(hWnd); MSG_WM_SIZE(OnSize) MSG_WM_DESTROY(OnDestroy) MSG_WM_GETMINMAXINFO(OnGetMinMaxInfo) END_MSG_MAP() template CDialogResizeHelper(const TParam(&src)[paramCount], CRect const& minMaxRange = CRect(0, 0, 0, 0)) { InitTable(src, paramCount); InitMinMax(minMaxRange); } void InitTable(const Param* table, size_t tableSize); void InitTable(const ParamOld * table, size_t tableSize); void InitMinMax(const CRect & range); bool EvalRect(UINT id, CRect & out) const; //! initData.id may be null, if so specify a non null window handle. void AddControl( Param const & initData, CWindow wnd = NULL ); bool RemoveControl( CWindow wnd ); bool HaveControl(CWindow wnd) const; private: struct runtime_t { HWND userHWND = 0; CRect origRect; CSize origWindowSize; Param initData = {}; }; CSize CurrentSize() const; CWindow ResolveWnd( runtime_t const & rt ) const; CRect _EvalRect(runtime_t const & rt, CSize wndSize) const; void OnGetMinMaxInfo(LPMINMAXINFO lpMMI) const; void OnSize(UINT nType, CSize size); void OnInitDialog(CWindow thisWnd); void OnDestroy(); std::vector m_runtime; std::vector m_initData; CWindow m_thisWnd, m_sizeGrip; unsigned min_x, min_y, max_x, max_y; };