Нажатие Enter не "доходит" до ActiveX-контрола
Я на диалоговом окне использую ActiveX-контрол (один из Grid'ов).
Для того, чтобы по клавише Энтер не происходило закритие окна, я
поставил заглушку на CDialog::OnOK() (пустую переопределённую функцию)
Эффект достигнут естественно, но вот к контролу нажатия Энтера не
доходят. Я что-то читал о том что,... цитата: "...MFC сглаживает логику
обработки сообщений, поднимая уведомляющие сообщения от элементов
управления до уровня других Windiws-сообщений..."
Как сделать так, чтоб до контрола доходили нажатия Энтера?
Буду очень признателен за помощь.
Может быть ссылку на статью, которая чётко освещает данную тема.
Спасибо
[email]yurrrik@interia.pl[/email]
Допустим, что OCX это M$FlexGrid и в классе диалога есть переменная
CMSFlexGrid m_frg; , связянная с OCX.
Перегружаем PreTranslateMessage диалога:
BOOL CDlgenterDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN
&& pMsg->wParam==VK_RETURN)
{
CWnd* fwnd=GetFocus();
if(fwnd==&m_frg)
{
fwnd->SendMessage(pMsg->message,
pMsg->wParam,pMsg->lParam);
return 1;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
Добавляем обработчик DISPID_KEYDOWN для FlexGrid:
void CDlgenterDlg::OnKeyDownMsflexgrid1(short FAR* KeyCode, short Shift)
{
if(*KeyCode==VK_RETURN)
{
long r=m_frg.GetRow();
r++;
m_frg.SetRow(++m_frg.GetRow());
}
}
Но почему-то и это не помогает.
Этот грид (не MS, а FlexCell Grid) сам реагирует на нажатия правильно (то есть переопределять реакции не надо), просто надо чтоб эти Энтеры доходили, как , например, всё нормально с клавишей F2.
И даже такое внаглую не канает:
BOOL CCititiesDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN)
{
m_cities.SendMessage(pMsg->message, pMsg->wParam,pMsg->lParam);
return 1;
}
return CDialog::PreTranslateMessage(pMsg);
}
Если есть ещё идеи, буду рад и благодарен.
Ворос на самом деле интересный, в моём окружении я не первый сталкиваюсь, но к сожалению не имею возможности узнать как они справлялись.
Спасибо за ответ.
Но почему-то и это не помогает.
Этот грид (не MS, а FlexCell Grid) сам реагирует на нажатия правильно (то есть переопределять реакции не надо), просто надо чтоб эти Энтеры доходили, как , например, всё нормально с клавишей F2.
А можно поподробнее?
1.Вызывается ли CCititiesDlg::OnKeyDownYourMsflexgrid ?
(в моем примере ведь эта ф-ция нужна только для того,
чтобы убедиться, что вызывается, сторчки и без нее
можно было передвинуть)
2. Какое значение возвратит
yourGrid->SendMessage(WM_GETDLGCODE,0,(long)pMsg);
3. Можно ли посмотреть на ту Grid, которую ты исп-ешь?
4.Как она должна реагировать на RETURN, и откуда ты это знаешь?
Там есть примеры на ВБшнике, в них я вижу как реагирует тот грид. Достаточно интуитивно понятно, как в Экселе.
m_cities.SendMessage(pMsg->message, pMsg->wParam,pMsg->lParam);
возвращает 0 :(
Соответственно никаких полезных действий не происходит :(
Сенкс
А где найти нормальную версию этого грида (не траил)??????
А где найти нормальную версию этого грида (не траил)??????
Как это ни ужасно: купить.
Кряков я не видел, но особо и не искал, и так надо будет покупать, т.к. соблюдать лицензирование надо будет (в моём случае). Он дешевле других Гридов.
Как это ни ужасно: купить.
Да уж, за 100 баксов, да еще и на VB написанный ...
Вот так еще можно:
BOOL CDlgenterDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN &&
pMsg->wParam==VK_RETURN)
{
CWnd* fwnd=GetFocus();
if(fwnd && fwnd->GetParent()==&m_cgr)
{
fwnd->SendMessage(WM_KEYDOWN,13,
pMsg->lParam |4);
return 1;
}
else if(CWnd* pf=fwnd->GetParent())
{
if(CWnd* ppf=pf->GetParent())
if(ppf->GetParent()==&m_cgr)
pf->GetParent()->SendMessage(WM_KEYDOWN,
13,pMsg->lParam |4);
return 1;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
Да уж, за 100 баксов, да еще и на VB написанный ...
приходится :( остальные намного дороже.
Помогла такая фигня:
BOOL PrintLabelsDlg:: PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN)
{
return CWnd:: PreTranslateMessage(pMsg);
}
else
{
return CDialog::PreTranslateMessage(pMsg);
};
}
-----------------
но вот один проблем!!!!! Всё работает ок, но если диалог у меня на вкладке (CTabCtrl) то нифига не происходит. :(
Незнаешь почему?
Помогла такая фигня:
Да, это гораздо профессиональнее :)...
Откуда ж мне знать...
Возможно, потому же, что и в первом случае,
т.е. потому, что диалоги вместо KEYDOWN'ов etc.
посылают своим child'ам WM_GETDLGCODE...