прилепить к Edit Controlу Spin Control
От: newser  
Дата: 03.10.02 19:49
Оценка:
Очень нужно прилепить к 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
Re: прилепить к Edit Controlу Spin Control
От: AlexRb  
Дата: 04.10.02 04:14
Оценка: 1 (1)
Здравствуйте 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().
Re[2]: debug assertion failed
От: newser  
Дата: 06.10.02 11:25
Оценка:
Здравствуйте AlexRb, Вы писали:

работает только release версия, debug вызывает "debug assertion failed"

AR>Если на диалог Вы CEdit ручками кидаете то реализацию AddSpin() просто перенести в OnCreate().


а OnCreate вообще не вызывается
Re[3]: debug assertion failed
От: AlexRb  
Дата: 07.10.02 03:47
Оценка:
Здравствуйте 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, уже лежащего на диалоге.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.