Files
foobar2000-sdk/libPPUI/CDialogResizeHelper.h
2021-12-14 00:28:25 -07:00

67 lines
1.8 KiB
C++

#pragma once
#include "CDialogResizeHelperCompat.h"
#include <vector>
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<typename TParam, size_t paramCount> 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<runtime_t> m_runtime;
std::vector<Param> m_initData;
CWindow m_thisWnd, m_sizeGrip;
unsigned min_x, min_y, max_x, max_y;
};