// Windows/Control/Dialog.h #ifndef __WINDOWS_CONTROL_DIALOG_H #define __WINDOWS_CONTROL_DIALOG_H #include "Windows/Window.h" namespace NWindows { namespace NControl { class CDialog: public CWindow { public: CDialog(HWND wndow = NULL): CWindow(wndow){}; virtual ~CDialog() {}; HWND GetItem(int itemID) const { return GetDlgItem(_window, itemID); } bool EnableItem(int itemID, bool enable) const { return BOOLToBool(::EnableWindow(GetItem(itemID), BoolToBOOL(enable))); } bool ShowItem(int itemID, int cmdShow) const { return BOOLToBool(::ShowWindow(GetItem(itemID), cmdShow)); } bool HideItem(int itemID) const { return ShowItem(itemID, SW_HIDE); } bool SetItemText(int itemID, LPCTSTR s) { return BOOLToBool(SetDlgItemText(_window, itemID, s)); } #ifndef _UNICODE bool SetItemText(int itemID, LPCWSTR s) { CWindow window(GetItem(itemID)); return window.SetText(s); } #endif UINT GetItemText(int itemID, LPTSTR string, int maxCount) { return GetDlgItemText(_window, itemID, string, maxCount); } #ifndef _UNICODE /* bool GetItemText(int itemID, LPWSTR string, int maxCount) { CWindow window(GetItem(itemID)); return window.GetText(string, maxCount); } */ #endif bool SetItemInt(int itemID, UINT value, bool isSigned) { return BOOLToBool(SetDlgItemInt(_window, itemID, value, BoolToBOOL(isSigned))); } bool GetItemInt(int itemID, bool isSigned, UINT &value) { BOOL result; value = GetDlgItemInt(_window, itemID, &result, BoolToBOOL(isSigned)); return BOOLToBool(result); } HWND GetNextGroupItem(HWND control, bool previous) { return GetNextDlgGroupItem(_window, control, BoolToBOOL(previous)); } HWND GetNextTabItem(HWND control, bool previous) { return GetNextDlgTabItem(_window, control, BoolToBOOL(previous)); } bool MapRect(LPRECT rect) { return BOOLToBool(MapDialogRect(_window, rect)); } bool IsMessage(LPMSG message) { return BOOLToBool(IsDialogMessage(_window, message)); } LRESULT SendItemMessage(int itemID, UINT message, WPARAM wParam, LPARAM lParam) { return SendDlgItemMessage(_window, itemID, message, wParam, lParam); } bool CheckButton(int buttonID, UINT checkState) { return BOOLToBool(CheckDlgButton(_window, buttonID, checkState)); } bool CheckButton(int buttonID, bool checkState) { return CheckButton(buttonID, UINT(checkState ? BST_CHECKED : BST_UNCHECKED)); } UINT IsButtonChecked(int buttonID) const { return IsDlgButtonChecked(_window, buttonID); } bool IsButtonCheckedBool(int buttonID) const { return (IsButtonChecked(buttonID) == BST_CHECKED); } bool CheckRadioButton(int firstButtonID, int lastButtonID, int checkButtonID) { return BOOLToBool(::CheckRadioButton(_window, firstButtonID, lastButtonID, checkButtonID)); } virtual bool OnMessage(UINT message, WPARAM wParam, LPARAM lParam); virtual bool OnInit() { return true; } virtual bool OnCommand(WPARAM wParam, LPARAM lParam); virtual bool OnCommand(int code, int itemID, LPARAM lParam); virtual bool OnSize(WPARAM /* wParam */, int /* xSize */, int /* ySize */) { return false; } /* #ifdef UNDER_CE virtual void OnHelp(void *) { OnHelp(); }; #else virtual void OnHelp(LPHELPINFO) { OnHelp(); }; #endif */ virtual void OnHelp() {}; virtual bool OnButtonClicked(int buttonID, HWND buttonHWND); virtual void OnOK() {}; virtual void OnCancel() {}; virtual bool OnNotify(UINT /* controlID */, LPNMHDR /* lParam */) { return false; } virtual bool OnTimer(WPARAM /* timerID */, LPARAM /* callback */) { return false; } LONG_PTR SetMsgResult(LONG_PTR newLongPtr ) { return SetLongPtr(DWLP_MSGRESULT, newLongPtr); } LONG_PTR GetMsgResult() const { return GetLongPtr(DWLP_MSGRESULT); } bool GetMargins(int margin, int &x, int &y) { RECT rect; rect.left = 0; rect.top = 0; rect.right = margin; rect.bottom = margin; if (!MapRect(&rect)) return false; x = rect.right - rect.left; y = rect.bottom - rect.top; return true; } int Units_To_Pixels_X(int units) { RECT rect; rect.left = 0; rect.top = 0; rect.right = units; rect.bottom = units; if (!MapRect(&rect)) return units * 3 / 2; return rect.right - rect.left; } bool GetItemSizes(int id, int &x, int &y) { RECT rect; if (!::GetWindowRect(GetItem(id), &rect)) return false; x = rect.right - rect.left; y = rect.bottom - rect.top; return true; } void GetClientRectOfItem(int id, RECT &rect) { ::GetWindowRect(GetItem(id), &rect); ScreenToClient(&rect); } bool MoveItem(int id, int x, int y, int width, int height, bool repaint = true) { return BOOLToBool(::MoveWindow(GetItem(id), x, y, width, height, BoolToBOOL(repaint))); } void NormalizeSize(bool fullNormalize = false); void NormalizePosition(); }; class CModelessDialog: public CDialog { public: bool Create(LPCTSTR templateName, HWND parentWindow); bool Create(UINT resID, HWND parentWindow) { return Create(MAKEINTRESOURCEW(resID), parentWindow); } #ifndef _UNICODE bool Create(LPCWSTR templateName, HWND parentWindow); #endif virtual void OnOK() { Destroy(); } virtual void OnCancel() { Destroy(); } }; class CModalDialog: public CDialog { public: INT_PTR Create(LPCTSTR templateName, HWND parentWindow); INT_PTR Create(UINT resID, HWND parentWindow) { return Create(MAKEINTRESOURCEW(resID), parentWindow); } #ifndef _UNICODE INT_PTR Create(LPCWSTR templateName, HWND parentWindow); #endif bool End(INT_PTR result) { return BOOLToBool(::EndDialog(_window, result)); } virtual void OnOK() { End(IDOK); } virtual void OnCancel() { End(IDCANCEL); } }; class CDialogChildControl: public NWindows::CWindow { int m_ID; public: void Init(const NWindows::NControl::CDialog &parentDialog, int id) { m_ID = id; Attach(parentDialog.GetItem(id)); } }; bool IsDialogSizeOK(int xSize, int ySize); }} #endif