Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Нажатие Enter не "доходит" до ActiveX-контрола

6.9K
06 сентября 2004 года
gang
7 / / 25.05.2004
Добрый день, У меня такой вопрос:

Я на диалоговом окне использую ActiveX-контрол (один из Grid'ов).
Для того, чтобы по клавише Энтер не происходило закритие окна, я
поставил заглушку на CDialog::OnOK() (пустую переопределённую функцию)
Эффект достигнут естественно, но вот к контролу нажатия Энтера не
доходят. Я что-то читал о том что,... цитата: "...MFC сглаживает логику
обработки сообщений, поднимая уведомляющие сообщения от элементов
управления до уровня других Windiws-сообщений..."

Как сделать так, чтоб до контрола доходили нажатия Энтера?

Буду очень признателен за помощь.
Может быть ссылку на статью, которая чётко освещает данную тема.

Спасибо

[email]yurrrik@interia.pl[/email]
430
07 сентября 2004 года
craftyfox
157 / / 20.02.2000
Как тебе такой вариант?

Допустим, что 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());
}
}
6.9K
07 сентября 2004 года
gang
7 / / 25.05.2004
Спасибо за ответ.
Но почему-то и это не помогает.
Этот грид (не 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);

}

Если есть ещё идеи, буду рад и благодарен.
Ворос на самом деле интересный, в моём окружении я не первый сталкиваюсь, но к сожалению не имею возможности узнать как они справлялись.
430
07 сентября 2004 года
craftyfox
157 / / 20.02.2000
Цитата:
Originally posted by gang
Спасибо за ответ.
Но почему-то и это не помогает.
Этот грид (не MS, а FlexCell Grid) сам реагирует на нажатия правильно (то есть переопределять реакции не надо), просто надо чтоб эти Энтеры доходили, как , например, всё нормально с клавишей F2.



А можно поподробнее?
1.Вызывается ли CCititiesDlg::OnKeyDownYourMsflexgrid ?
(в моем примере ведь эта ф-ция нужна только для того,
чтобы убедиться, что вызывается, сторчки и без нее
можно было передвинуть)
2. Какое значение возвратит
yourGrid->SendMessage(WM_GETDLGCODE,0,(long)pMsg);
3. Можно ли посмотреть на ту Grid, которую ты исп-ешь?
4.Как она должна реагировать на RETURN, и откуда ты это знаешь?

6.9K
07 сентября 2004 года
gang
7 / / 25.05.2004
Грид, который я использую: http://www.grid2000.com/

Там есть примеры на ВБшнике, в них я вижу как реагирует тот грид. Достаточно интуитивно понятно, как в Экселе.

m_cities.SendMessage(pMsg->message, pMsg->wParam,pMsg->lParam);
возвращает 0 :(
Соответственно никаких полезных действий не происходит :(

Сенкс
433
07 сентября 2004 года
AlexII
86 / / 13.10.2003
Цитата:
Originally posted by gang
Грид, который я использую: http://www.grid2000.com/



А где найти нормальную версию этого грида (не траил)??????

6.9K
07 сентября 2004 года
gang
7 / / 25.05.2004
Цитата:
Originally posted by AlexII


А где найти нормальную версию этого грида (не траил)??????




Как это ни ужасно: купить.
Кряков я не видел, но особо и не искал, и так надо будет покупать, т.к. соблюдать лицензирование надо будет (в моём случае). Он дешевле других Гридов.

430
07 сентября 2004 года
craftyfox
157 / / 20.02.2000
Цитата:
Originally posted by gang

Как это ни ужасно: купить.



Да уж, за 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);
}

6.9K
07 сентября 2004 года
gang
7 / / 25.05.2004
Цитата:
Originally posted by craftyfox


Да уж, за 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) то нифига не происходит. :(

Незнаешь почему?

430
07 сентября 2004 года
craftyfox
157 / / 20.02.2000
Цитата:
Originally posted by gang

Помогла такая фигня:



Да, это гораздо профессиональнее :)...

Цитата:
Незнаешь почему?



Откуда ж мне знать...

Возможно, потому же, что и в первом случае,
т.е. потому, что диалоги вместо KEYDOWN'ов etc.
посылают своим child'ам WM_GETDLGCODE...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог