Как сгенерировать ON_START_EDIT нажатием на клавиатуре

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Asterg
14
Asterg  

Прошу помочь в решении задачи. Есть торговая панель, на которой расположено несколько графических объектов типа CEdit. Нужно чтобы после окончания введения данных в один из Edit'ов и нажатия на клавишу (например, TAB) фокус переходил к следующему Edit'у.

Если кликнуть мышью на Edit, то в логе можно увидеть три строки (см.скриншот) с кодами событий 1, 4 и 1005. А после окончания ввода данных (END_EDIT) - две строки с кодами событий 3 и 1006.

Я пытаюсь привязать окончание ввода данных в один Edit к активации другого Edit'а, чтобы он перешел в состояние ON_START_EDIT.

Пробовал через EventChartCustom(INTERNAL_EVENT,ON_START_EDIT,560,175,m_name+"m_EdtLossQuanUnits"); - генерируется одна из трех необходимых строк, которые видны на скриншоте - с кодом события 1005. Как сгенерировать события с кодами 1 и 4, если события пользователя начинаются с 1000?

EventChartCustom(INTERNAL_EVENT,CHARTEVENT_OBJECT_CLICK,560,175,m_name+"m_EdtLossQuanUnits"); тоже не подходит.

Файлы:
Maxim Dmitrievsky
19199
Maxim Dmitrievsky  

Попробуйте через конструкцию с макросами, типа такого, для примера:

//+------------------------------------------------------------------+
//| Class IntegralCControlsDialog                                    |
//| Usage: main dialog of the Controls application                   |
//+------------------------------------------------------------------+
class IntegralCControlsDialog : public CAppDialog
  {
public:
   CEdit             m_edit;                       
   
public:
                     IntegralCControlsDialog(void);
                    ~IntegralCControlsDialog(void);
   //--- create
   virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
   //--- chart event handler
   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
  
public:
   void              OnChangeComboBox(void);
   void              OnClickButton(void);
   void              OnEndEditEdit(void);
  };
//+------------------------------------------------------------------+
//| Event Handling                                                   |
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(IntegralCControlsDialog)
ON_EVENT(ON_CHANGE,m_combo_box,OnChangeComboBox)
ON_EVENT(ON_CLICK,m_button,OnClickButton)
ON_EVENT(ON_END_EDIT,m_edit,OnEndEditEdit) - нужное событие
EVENT_MAP_END(CAppDialog)

void IntegralCControlsDialog::OnEndEditEdit(void)
  {
   тут то что происходит при срабатывании события конца редактирования поля ввода. Например, добавить метод класса, который реализует ON_START_EDIT следующего контрола
  }
IntegralCControlsDialog ExtDialog;
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
     ExtDialog.OnEvent(id,lparam,dparam,sparam);
  }
Dmitry Fedoseev
56939
Dmitry Fedoseev  

Генерация события не поможет. Если объект генерирует событие, это совсем не значит, что он на него реагирует.

Maxim Dmitrievsky
19199
Maxim Dmitrievsky  
Dmitry Fedoseev:

Генерация события не поможет. Если объект генерирует событие, это совсем не значит, что он на него реагирует.

а если текст в элементе поменять программно события тоже не генерируются? тогда попадос
Dmitry Fedoseev
56939
Dmitry Fedoseev  
Maxim Dmitrievsky:
а если текст в элементе поменять программно события тоже не генерируются? тогда попадос

Если менять программно, то можно обойтись без события, потому-что и так понятно, когда текст изменился, потому-что сам менял.

Как понял, тут надо поставить фокус другому полю ввода, чтобы ввод продолжался в него. Что-то типа метода SetFocus() нужно. 

Asterg
14
Asterg  
Dmitry Fedoseev:

Если менять программно, то можно обойтись без события, потому-что и так понятно, когда текст изменился, потому-что сам менял.

Как понял, тут надо поставить фокус другому полю ввода, чтобы ввод продолжался в него. Что-то типа метода SetFocus() нужно. 

Да, нужно что-то типа SetFocus() или ON_START_EDIT. Однако, как выяснилось, генерации одного только ON_START_EDIT недостаточно, так как это событие с кодом 1005, а нужна связка из трех событий: с кодами 1, 4 и 1005. Или же каким-то образом сгенерировать клик мышью по эдиту. Пробовал через CHARTEVENT_OBJECT_CLICK - получается событие с кодом 1001, то есть это пользовательское событие, код которого (1) добавляется к 1000 (начало нумерации кодов пользовательских событий), а мне нужно сгенерировать событие не с кодом 1001, а именно с кодом 1.
Dmitry Fedoseev
56939
Dmitry Fedoseev  
Asterg:
Да, нужно что-то типа SetFocus() или ON_START_EDIT. Однако, как выяснилось, генерации одного только ON_START_EDIT недостаточно, так как это событие с кодом 1005, а нужна связка из трех событий: с кодами 1, 4 и 1005. Или же каким-то образом сгенерировать клик мышью по эдиту. Пробовал через CHARTEVENT_OBJECT_CLICK - получается событие с кодом 1001, то есть это пользовательское событие, код которого (1) добавляется к 1000 (начало нумерации кодов пользовательских событий), а мне нужно сгенерировать событие не с кодом 1001, а именно с кодом 1.

Генерация событий в терминале не поможет. Клик мышью может быть, но это делается средствами Windows API. Переместить указатель мыши, сгенерировать событие нажатия кнопки.

Только зачем оно такое нужно... нужно иметь здоровые, естественные потребности. 

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий