Окнонные сообщения
От: Alex Россия  
Дата: 26.09.01 07:00
Оценка:
Привет всем!

У меня вот такой вопрос: у каждого окна есть статическая функция обработки сообщений. И я точно знаю, что есть возможность сделать свою CallBack-функцию и подставить ее заместо «родной» и получать все сообщения окна себе и при необходимости перенаправлять эти сообщения далее в окно (хозяину). Не подскажете, какой функцией подставляется своя функция. Если можно, укажите API функцию и эквивалентный ей метод класса CWnd.

Огромное спасибо.

PS Ну и вообще прекрасно будет, если исходными кодами будет сопровождение.
Re: Окнонные сообщения
От: migel  
Дата: 26.09.01 07:24
Оценка:
Здравствуйте Alex, вы писали:
/*
A>Привет всем!

A>У меня вот такой вопрос: у каждого окна есть статическая функция обработки сообщений. И я точно знаю, что есть возможность сделать свою CallBack-функцию и подставить ее заместо «родной» и получать все сообщения окна себе и при необходимости перенаправлять эти сообщения далее в окно (хозяину). Не подскажете, какой функцией подставляется своя функция. Если можно, укажите API функцию и эквивалентный ей метод класса CWnd.

*/
В классе CWnd есть виртуальный метод WndProc — переопределяй его на здоровье и работай с "сырыми" сообщениями.
Так же можеш подсунуть статическую функцию класса в RegisterClass (создав окно соотв. класса) — тут уж MFC стандартый обработчик сообщений окна AfxWndProc совсем выключается из игры.
Re[2]: Окнонные сообщения
От: Alex Россия  
Дата: 26.09.01 08:29
Оценка:
Здравствуйте migel,

Спасибо за информацию, но мне не хочется для каждого окна наследовать класс.
Как вы думаете, можно создать наследника от CWnd, переопределить у него WndProc и с помощью метода Attach аттачить его к любому HWND? И, соответственно снимать сообщения...
Re[3]: Окнонные сообщения
От: PeterG  
Дата: 26.09.01 09:01
Оценка:
SetWindowLong(hWnd, GWL_WNDPROC, ...)
Re[4]: Окнонные сообщения
От: migel  
Дата: 26.09.01 09:42
Оценка:
Здравствуйте PeterG, вы писали:

PG>SetWindowLong(hWnd, GWL_WNDPROC, ...)

Вот-вот этот метод вообще глобален и к MFC отношения не имеет — называется Window Procedure subclassing... почитать много где есть — и на этом сервере то же.
Только не забудте хранить старый обработчик и делать CallWindowProc на него.
Re[5]: Окнонные сообщения
От: Alex Россия  
Дата: 26.09.01 14:22
Оценка:
Спасибо, Вам, за сообщения, я посмотрел, попробовал то, что вы говорили, но все равно я до конца не понял. Давайте по пунктам.

1. Если я подставляю свою функцию WindowProc (это я делал, и действительно сообщения приходят туда), но как мне сделать, чтобы остальные сообщения уходили к окну, к истинному получателью этих сообщений? А то хреново получается. Примерчик киньте пожалуйста.
2. Следует уточнить:

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

HWnd – понятно (хэндл отправителя), да?
message – сообщение
wParam – ?? ID контрола пославшего сообщение
lParam – ?? указатель на какую-то структуру
можно поточнее, что такое wParam и lParam.

3. Для чего все это?
На диалоге есть контрол (скажем ComboBox). Не используя CW, не используя карту сообщений (для этого контрола), нужно получать сообщения от этого контрола. Я подразумеваю, что они должны приходить либо в WindowProc либо должно приходить сообщение WM_NOTIFY и его обрабатывать.

Пожалуйста, подскажите как написать функцию обработки таких сообщений.

Или я вообще не прав? Может контрол обязательно прописывать в карту сообщений?

С уважением, Алексей.
Re[6]: Окнонные сообщения
От: migel  
Дата: 26.09.01 15:25
Оценка:
Здравствуйте Alex, вы писали:

A>Спасибо, Вам, за сообщения, я посмотрел, попробовал то, что вы говорили, но все равно я до конца не понял. Давайте по пунктам.


A>1. Если я подставляю свою функцию WindowProc (это я делал, и действительно сообщения приходят туда), но как мне сделать, чтобы остальные сообщения уходили к окну, к истинному получателью этих сообщений? А то хреново получается. Примерчик киньте пожалуйста.

Тут Вам нужно вызывать CWnd::WindowProc если используете виртуальный метод. Либо AfxWndProc если используйте свой класс окна.

A>2. Следует уточнить:


A>LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);


A>HWnd – понятно (хэндл отправителя), да?

A>message – сообщение
A>wParam – ?? ID контрола пославшего сообщение
A>lParam – ?? указатель на какую-то структуру
A>можно поточнее, что такое wParam и lParam.
ЭЭЭ батенька это долгий разговор — зависят от типа сообщения: читайте МСДН

A>На диалоге есть контрол (скажем ComboBox).

A>Или я вообще не прав? Может контрол обязательно прописывать в карту сообщений?
В вашем случае (а кстати какой ваш случай?) я бы порекомендовал субклассинг — дешево и сердито.
Насчет контролов так для этого есть виртуальные OnCommand() + OnNotify() — туда приходит все сырое, вне зависимомсти от наличия обработчиков в карте сообщений.

A>С уважением, Алексей.
Re[7]: Окнонные сообщения
От: Alex Россия  
Дата: 26.09.01 18:49
Оценка:
Мой случай такой, что много тулбаров и на них есть контролы (CcomboBox, EditBox и т.д.) и от них нужно обрабатывать сообщения. Вооот.
С помощью CReBar добавляю CDialog с загруженными ресурсами, чтоб сделать на тулбаре контролы.

По поводу OnCommand, спасибо за идею. Гляну.

До свидания.
Алексей.
Re[7]: Окнонные сообщения
От: Alex Россия  
Дата: 27.09.01 12:24
Оценка:
Все... Въехал.
Спасибо за инфу.
Сделал примерно так:

[code]
LRESULT CTestDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if ( message==WM_COMMAND )
{
switch ( HIWORD(wParam) )
{
case CBN_SELCHANGE:
// обработка сообщения
// lParam = HWND контрола, пославшего сообщение
break;
}
}
return CDialog::WindowProc(message, wParam, lParam);
}
[\code]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.