Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.119.131.178] |
|
Сообщ.
#1
,
|
|
|
На окне диалога расположено два CComboBox с типом "Раскрывающееся меню".
В CComboBox вводим текст и нажимаем клавишу Enter. В обработчике диалога: void CtestDlg::OnOK() { CWnd *pWnd = GetFocus(); if( pWnd ) { int p = pWnd->GetDlgCtrlID(); // p для любого CComboBox всегда равно 1001 .... } } Как определить в каком CComboBox нажали на клавишу Enter? |
Сообщ.
#2
,
|
|
|
если поймал 1001, то запроси ID родителя
1001 - это вроде как ID эдита комбобокса |
Сообщ.
#3
,
|
|
|
Цитата ElcnU @ если поймал 1001, то запроси ID родителя 1001 - это вроде как ID эдита комбобокса А разве этот самый ID не указывается в методе "Create" при создании контрола ? Идентификатор необходим, чтобы отличать один контрол (или пункт меню) от другого. Те "идентифицировать". Одинаковые значения идентификаторов для разных объектов крайне подозрительны.. |
Сообщ.
#4
,
|
|
|
Цитата ЫукпШ @ Одинаковые значения идентификаторов для разных объектов крайне подозрительны.. в рамках одного родителя |
Сообщ.
#5
,
|
|
|
Цитата ElcnU @ Цитата ЫукпШ @ Одинаковые значения идентификаторов для разных объектов крайне подозрительны.. в рамках одного родителя Да. Но число возможных ID достаточно настолько, чтобы их не экономить. Кроме того, ID для контролов имеют актуальность только для обработчиков, которые сконструированы для их использования. Казалось бы. Теоретически, если обработчики будут использовать только хзндлы контролов (а в сообщениях вместе с ID контрола передаётся и его хэндл), тогда ID вообще не нужны. Обнулим все эти параметры. Но что там может произойти внутри Виндус при таких мероприятиях вообще не известно, лучше не делать таких опытов. |
Сообщ.
#6
,
|
|
|
Получилось так:
void CtestDlg::OnOK() { CWnd *pWnd = GetFocus(); if( pWnd ) { pWnd = pWnd->GetParent(); if( pWnd ) { switch( pWnd->GetDlgCtrlID() ) { ..... } } } SendMessage( WM_NEXTDLGCTL, 0, 0); } Спасибо всем! |
Сообщ.
#7
,
|
|
|
Цитата Vladimir_ @ Получилось так: void CtestDlg::OnOK() { CWnd *pWnd = GetFocus(); if( pWnd ) { pWnd = pWnd->GetParent(); Наверное, здесь нужно проверить, что parent именно combobox, например при помощи GetClassName. Иначе, для других котролов у тебя здесь вернётся указатель на диалог. Добавлено Кстати, ещё можно в OnInitDialog тупо поменять id для editа bool ResetComboBoxIDs(HWND hComboBox) { const int id = ::GetDlgCtrlID(hComboBox); COMBOBOXINFO cbi; cbi.cbSize = sizeof(cbi); if (!::GetComboBoxInfo(hComboBox, &cbi)) return false; ::SetWindowLong(cbi.hwndItem, GWL_ID, id); //::SetWindowLong(cbi.hwndList, GWL_ID, id); return true; } |
Сообщ.
#8
,
|
|
|
Цитата ЫукпШ @ Да. Но число возможных ID достаточно настолько, чтобы их не экономить. пример, номера квартир. В общем чисел достаточно, чтобы их не экономить, но у каждого дома квартиры начинаются с 1. |