119 lines
3.1 KiB
C++
119 lines
3.1 KiB
C++
#include <windows.h>
|
|
#include "main.h"
|
|
|
|
static void SetWindowRect(HWND w, RECT * r)
|
|
{
|
|
SetWindowPos(w, 0, r->left, r->top, r->right - r->left, r->bottom - r->top, SWP_NOZORDER | SWP_NOCOPYBITS);
|
|
}
|
|
|
|
class DlgBase
|
|
{
|
|
public:
|
|
BOOL isDialogMessage(MSG * m)
|
|
{
|
|
return wnd ? IsDialogMessage(wnd, m) : 0;
|
|
}
|
|
protected:
|
|
void endDialog(int x)
|
|
{
|
|
EndDialog(wnd, x);
|
|
}
|
|
|
|
void _do_size_x(RECT * r, UINT id, UINT wx, UINT min_x)
|
|
{
|
|
RECT r1 = {r->left, r->top, wx - min_x + r->right, r->bottom};
|
|
SetWindowRect(GetDlgItem(wnd, id), &r1);
|
|
}
|
|
|
|
void _do_size_xy(RECT * r, UINT id, UINT wx, UINT wy, UINT min_x, UINT min_y)
|
|
{
|
|
RECT r1 = {r->left, r->top, wx - min_x + r->right, wy - min_y + r->bottom};
|
|
SetWindowRect(GetDlgItem(wnd, id), &r1);
|
|
}
|
|
|
|
void _do_align_x_size_y(RECT * r, UINT id, UINT wx, UINT wy, UINT min_x, UINT min_y)
|
|
{
|
|
RECT r1 = {wx - min_x + r->left, r->top, wx - min_x + r->right, wy - min_y + r->bottom};
|
|
SetWindowRect(GetDlgItem(wnd, id), &r1);
|
|
}
|
|
|
|
void _do_align_x(RECT * r, UINT id, UINT wx, UINT min_x)
|
|
{
|
|
RECT r1 = {wx - min_x + r->left, r->top, wx - min_x + r->right, r->bottom};
|
|
SetWindowRect(GetDlgItem(wnd, id), &r1);
|
|
}
|
|
|
|
void _do_align_xy(RECT * r, UINT id, UINT wx, UINT wy, UINT min_x, UINT min_y)
|
|
{
|
|
RECT r1 = {wx - min_x + r->left, wy - min_y + r->top, wx - min_x + r->right, wy - min_y + r->bottom};
|
|
SetWindowRect(GetDlgItem(wnd, id), &r1);
|
|
}
|
|
|
|
#define do_size_x(id,r) _do_size_x(r,id,sx,min_size_x)
|
|
#define do_size_xy(id,r) _do_size_xy(r,id,sx,sy,min_size_x,min_size_y)
|
|
#define do_align_x_size_y(id,r) _do_align_x_size_y(r,id,sx,sy,min_size_x,min_size_y)
|
|
#define do_align_xy(id,r) _do_align_xy(r,id,sx,sy,min_size_x,min_size_y)
|
|
#define do_align_x(id,r) _do_align_x(r,id,sx,min_size_x)
|
|
|
|
HWND wnd;
|
|
UINT min_size_x, min_size_y;
|
|
UINT min_size_x_w, min_size_y_w;
|
|
|
|
void do_sizing(UINT wp, RECT * r);
|
|
void MakeComboEdit(UINT id, DWORD s);
|
|
void GetChildRect(UINT id, RECT& child);
|
|
|
|
virtual BOOL DlgProc(UINT msg, WPARAM wp, LPARAM lp) { return 0;};
|
|
static BOOL CALLBACK TheDialogProc(HWND wnd, UINT msg, WPARAM wp, LPARAM lp)
|
|
{
|
|
DlgBase * p;
|
|
if (msg == WM_INITDIALOG)
|
|
{
|
|
p = (DlgBase*)lp;
|
|
SetWindowLong(wnd, DWL_USER, lp);
|
|
p->wnd = wnd;
|
|
RECT r;
|
|
GetClientRect(wnd, &r);
|
|
p->min_size_x = r.right;
|
|
p->min_size_y = r.bottom;
|
|
GetWindowRect(wnd, &r);
|
|
p->min_size_x_w = r.right - r.left;
|
|
p->min_size_y_w = r.bottom - r.top;
|
|
}
|
|
else p = (DlgBase*)GetWindowLong(wnd, DWL_USER);
|
|
BOOL rv = 0;
|
|
if (p)
|
|
{
|
|
rv = p->DlgProc(msg, wp, lp);
|
|
if (msg == WM_DESTROY)
|
|
{
|
|
p->wnd = 0;
|
|
SetWindowLong(wnd, DWL_USER, 0);
|
|
}
|
|
}
|
|
return rv;
|
|
}
|
|
HWND myCreateDialog(UINT id, HWND parent)
|
|
{
|
|
return CreateDialogParamT(hIns, (char*)id, parent, TheDialogProc, (long)this);
|
|
}
|
|
virtual void myProcessMessage(MSG * msg)
|
|
{
|
|
if (!IsDialogMessage(wnd, msg))
|
|
{
|
|
TranslateMessage(msg);
|
|
DispatchMessage(msg);
|
|
}
|
|
}
|
|
|
|
int myDialogBox(UINT id, HWND parent)
|
|
{
|
|
return DialogBoxParamT(hIns, (char*)id, parent, TheDialogProc, (long)this);
|
|
}
|
|
DlgBase() {
|
|
wnd = 0;
|
|
min_size_x = min_size_y = min_size_x_w = min_size_y_w = 0;
|
|
}
|
|
virtual ~DlgBase() {}
|
|
};
|