Обработка нажатия клавиши в CPropertyPage
От: Defenseur  
Дата: 04.11.03 08:31
Оценка:
Есть диалог, унаследованный от CPropertyPage. На нем два элемента Edit. В каком обработчике мне узнать, что в одном из элементов была нажата клавиша?

Пробовал:


void CMyPropDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
   AfxMessageBox("fff");
   if (GetFocus()->m_hWnd ==m_Edit1.m_hWnd) AfxMessageBox("fff");
   CPropertyPage::OnKeyDown(nChar, nRepCnt, nFlags);
}

void CMyPropDlg::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
   AfxMessageBox("ddd");
   CPropertyPage::OnChar(nChar, nRepCnt, nFlags);
}


Так он ни в один из обработчиков не попадает.
Re: Обработка нажатия клавиши в CPropertyPage
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 04.11.03 08:54
Оценка:
Здравствуйте, Defenseur, Вы писали:

D>Есть диалог, унаследованный от CPropertyPage. На нем два элемента Edit. В каком обработчике мне узнать, что в одном из элементов была нажата клавиша?


ИМХО надо ловить EN_CHANGE. Или сабклассить EDITы и ловить WM_CHAR.
- Искренне ваш, Поросенок Пафнутий
Re[2]: Обработка нажатия клавиши в CPropertyPage
От: Defenseur  
Дата: 04.11.03 09:21
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>ИМХО надо ловить EN_CHANGE. Или сабклассить EDITы и ловить WM_CHAR.


Тут возникает небольшая проблема: Edit'ы взаимосвязаны, т.е. я бы хотел по изменении значения в первом менять значение во втором и наоборот. При обработке EM_CHANGE на обоих будет переполнение стека, т.е. тогда хочется на время запрещать обработку этого сообщения
Re[3]: Обработка нажатия клавиши в CPropertyPage
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 04.11.03 09:43
Оценка:
Здравствуйте, Defenseur, Вы писали:

D>Здравствуйте, SchweinDeBurg, Вы писали:


SDB>>ИМХО надо ловить EN_CHANGE. Или сабклассить EDITы и ловить WM_CHAR.


D>Тут возникает небольшая проблема: Edit'ы взаимосвязаны, т.е. я бы хотел по изменении значения в первом менять значение во втором и наоборот. При обработке EM_CHANGE на обоих будет переполнение стека, т.е. тогда хочется на время запрещать обработку этого сообщения


А кто мешает повесить разные обработчики EN_CHANGE на эти EDITы?
- Искренне ваш, Поросенок Пафнутий
Re[4]: Обработка нажатия клавиши в CPropertyPage
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 04.11.03 09:44
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>А кто мешает повесить разные обработчики EN_CHANGE на эти EDITы?


Кроме того:

The EN_CHANGE notification message is sent when the user has taken an action that may have altered text in an edit control.

- Искренне ваш, Поросенок Пафнутий
Re[5]: Обработка нажатия клавиши в CPropertyPage
От: Defenseur  
Дата: 04.11.03 09:57
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Здравствуйте, SchweinDeBurg, Вы писали:


SDB>>А кто мешает повесить разные обработчики EN_CHANGE на эти EDITы?


SDB>Кроме того:

SDB>

SDB>The EN_CHANGE notification message is sent when the user has taken an action that may have altered text in an edit control.


Вот потому и не катит!!! Висят разные обработчики. И картина такая

1. Изменили тектст в первом
2. Сработал EN_CHANGE1
3. EN_CHANGE1 изменил текст во втором
4. Сработал EN_CHANGE2
5. EN_CHANGE2 изменил текст в первом
6. Сработал EN_CHANGE1
И так далее по циклу имеем при разных обработчиках переполнение стека!!!

А шаги 4 и 6 не нужны, я ведь не редактировал впрямую, а соответствие выставлено шагами 1-3.
Re[6]: Обработка нажатия клавиши в CPropertyPage
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 04.11.03 10:05
Оценка:
Здравствуйте, Defenseur, Вы писали:

D>Вот потому и не катит!!! Висят разные обработчики. И картина такая


D>1. Изменили тектст в первом

D>2. Сработал EN_CHANGE1
D>3. EN_CHANGE1 изменил текст во втором
D>4. Сработал EN_CHANGE2
D>5. EN_CHANGE2 изменил текст в первом
D>6. Сработал EN_CHANGE1
D>И так далее по циклу имеем при разных обработчиках переполнение стека!!!

D>А шаги 4 и 6 не нужны, я ведь не редактировал впрямую, а соответствие выставлено шагами 1-3.


Странно... у меня вот такое никакого переполнения стека не вызывает:
void CTestChangeDlg::OnChangeEdit1() 
{
    // TODO: Add your control notification handler code here
    GetDlgItem(IDC_EDIT2)->SetWindowText(_T("By first"));
}

void CTestChangeDlg::OnChangeEdit2() 
{
    // TODO: Add your control notification handler code here
    GetDlgItem(IDC_EDIT1)->SetWindowText(_T("By second"));
}
- Искренне ваш, Поросенок Пафнутий
Re[7]: Обработка нажатия клавиши в CPropertyPage
От: Defenseur  
Дата: 04.11.03 10:59
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Здравствуйте, Defenseur, Вы писали:


SDB>Странно... у меня вот такое никакого переполнения стека не вызывает:

SDB>
SDB>void CTestChangeDlg::OnChangeEdit1() 
SDB>{
SDB>    // TODO: Add your control notification handler code here
SDB>    GetDlgItem(IDC_EDIT2)->SetWindowText(_T("By first"));
SDB>}

SDB>void CTestChangeDlg::OnChangeEdit2() 
SDB>{
SDB>    // TODO: Add your control notification handler code here
SDB>    GetDlgItem(IDC_EDIT1)->SetWindowText(_T("By second"));
SDB>}
SDB>


Ну вот авбстрагировался я от своего проекта, создал тестовый dialog-based. И по вашему примеру ради интереса. Все тоже самое stack overflow. По крайней мере в седьмой студии
Re[8]: Обработка нажатия клавиши в CPropertyPage
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 04.11.03 11:24
Оценка:
Здравствуйте, Defenseur, Вы писали:

D>Ну вот авбстрагировался я от своего проекта, создал тестовый dialog-based. И по вашему примеру ради интереса. Все тоже самое stack overflow. По крайней мере в седьмой студии


У меня 6-ка SP5.
- Искренне ваш, Поросенок Пафнутий
Re: Обработка нажатия клавиши в CPropertyPage
От: Аноним  
Дата: 05.11.03 07:17
Оценка:
Используй лучше, PreTranslateMessage(MSG* pMsg), или GetKeyStat();
Re[8]: Обработка нажатия клавиши в CPropertyPage
От: Maslex  
Дата: 05.11.03 14:35
Оценка:
D>Ну вот авбстрагировался я от своего проекта, создал тестовый dialog-based. И по вашему примеру ради интереса. Все тоже самое stack overflow. По крайней мере в седьмой студии

Попробуй вот так:
void CTestChangeDlg::OnChangeEdit1() 
{
   static bool bWeAreHere = false; //специально чтоб не закливаться
   if( !bWeAreHere )
   {
      bWeAreHere = true;
      GetDlgItem(IDC_EDIT2)->SetWindowText(_T("By first"));
      bWeAreHere = false;
   }
}

void CTestChangeDlg::OnChangeEdit2() 
{
   static bool bWeAreHere = false; //специально чтоб не закливаться
   if( !bWeAreHere ) 
   {
      bWeAreHere = true;
      GetDlgItem(IDC_EDIT1)->SetWindowText(_T("By second"));
      bWeAreHere = false;
   }
}


PS:
все гениальное как обычно просто
WBR,
Maslex
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.