Очень нужно прилепить к Edit Controlу, нарисованному в Dialog Editor
Spin Control (не рисуя!), установить им обоим один диапазон значений
и проверять значение, введенное с клавиатуры.
Попытки сделать типа
class CEditWithSpin: public CEdit
{
int MaxValue,MinValue;
CSpinButtonCtrl SpinControl;
...
};
CEditWithSpin::CEditWithSpin()
{
CEdit::CEdit();
CRect editRect,spinRect;
GetRect(&editRect);
...
SpinControl.Create(UDS_ARROWKEYS|UDS_HO....
SpinControl.SetRange(MinValue,MaxValue);
}
приводят к краху
пробовал вставлять это и в ON_WM_SETFOCUS, и в ON_WM_CREATE,
и во все другие места... не выходит цветок каменный
Скажите, то, что я задумал, вообще возможно?
А если да, то как?
В MFC я совсем недавно- раньше делал на WIN32 API
Здравствуйте newser, Вы писали:
N>Очень нужно прилепить к Edit Controlу, нарисованному в Dialog Editor
N>Spin Control (не рисуя!), установить им обоим один диапазон значений
N>и проверять значение, введенное с клавиатуры.
... skiped
Можно воспользоваться
SubclassDlgItem. Я сделал следующим образом:
Создал класс
class CEditSpin : public CEdit
{
.......
CSpinButtonCtrl m_wndSpinCtrl;
.......
};
1. На диалоге есть
CEdit c ID = IDC_MYEDIT.
2. Добавляем в диалог
CEditSpin m_wndEditSpin;
3. В
OnInitDialog():
m_wndEditSpin.SubclassDlgItem(ID IDC_MYEDIT, this);
m_wndEditSpin.AddSpin();
где:
void CEditSpin::AddSpin(void)
{
CRect rect;
GetWindowRect(rect);
m_wndSpinCtrl.Create(UDS_ALIGNRIGHT | UDS_SETBUDDYINT | UDS_ARROWKEYS | WS_CHILD | WS_VISIBLE , rect, GetOwner(),0);
m_wndSpinCtrl.SetRange(1, 100); // MinValue, MaxValue
m_wndSpinCtrl.SetBuddy(this);
}
Если на диалог Вы CEdit ручками кидаете то реализацию AddSpin() просто перенести в OnCreate().
Здравствуйте newser, Вы писали:
N>работает только release версия, debug вызывает "debug assertion failed"
AR>>Если на диалог Вы CEdit ручками кидаете то реализацию AddSpin() просто перенести в OnCreate().
N>а OnCreate вообще не вызывается
OnCreate не вызывается при сабклассировании. Вместо этого надо использовать PreSubclassWindow()
Вот реализация для сабклассирования, которая у меня работает:
В хедере:
class CRASpinCtrl : public CEdit
{
DECLARE_DYNAMIC(CRASpinCtrl)
public:
CRASpinCtrl();
virtual ~CRASpinCtrl();
protected:
DECLARE_MESSAGE_MAP()
private:
CSpinButtonCtrl m_wndSpinCtrl;
protected:
virtual void PreSubclassWindow();
public:
void SubclassDlgItemAndInit(UINT nID, CWnd *pParent, int nMin = 0, int nMax = 99, int nPos = 0);
};
В сср:
IMPLEMENT_DYNAMIC(CRASpinCtrl, CEdit)
CRASpinCtrl::CRASpinCtrl()
{
}
CRASpinCtrl::~CRASpinCtrl()
{
}
void CRASpinCtrl::PreSubclassWindow()
{
CRect rect;
GetWindowRect(rect);
m_wndSpinCtrl.Create(UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_ARROWKEYS | WS_CHILD | WS_VISIBLE, rect, GetOwner(), 0);
m_wndSpinCtrl.SetBuddy(this);
ModifyStyle(0, ES_NUMBER);
CEdit::PreSubclassWindow();
}
void CRASpinCtrl::SubclassDlgItemAndInit(UINT nID, CWnd *pParent, int nMin /* = 0*/, int nMax /*= 99*/, int nPos /*= 0*/)
{
SubclassDlgItem(nID, pParent);
m_wndSpinCtrl.SetRange(nMin, nMax);
m_wndSpinCtrl.SetPos(nPos);
}
Для диалога:
в хедере;
CRASpinCtrl m_wndSpinCtrlDlg;
В OnInitDialog():
m_wndSpinCtrlDlg.SubclassDlgItem(IDC_EDIT1, this);
или:
m_wndSpinCtrlDlg.SubclassDlgItemAndInit(IDC_EDIT1, this, 1, 99, 30);
где
IDC_EDIT1 — ID СEdit, уже лежащего на диалоге.