У меня вот такой вопрос: у каждого окна есть статическая функция обработки сообщений. И я точно знаю, что есть возможность сделать свою CallBack-функцию и подставить ее заместо «родной» и получать все сообщения окна себе и при необходимости перенаправлять эти сообщения далее в окно (хозяину). Не подскажете, какой функцией подставляется своя функция. Если можно, укажите API функцию и эквивалентный ей метод класса CWnd.
Огромное спасибо.
PS Ну и вообще прекрасно будет, если исходными кодами будет сопровождение.
Здравствуйте Alex, вы писали:
/* A>Привет всем!
A>У меня вот такой вопрос: у каждого окна есть статическая функция обработки сообщений. И я точно знаю, что есть возможность сделать свою CallBack-функцию и подставить ее заместо «родной» и получать все сообщения окна себе и при необходимости перенаправлять эти сообщения далее в окно (хозяину). Не подскажете, какой функцией подставляется своя функция. Если можно, укажите API функцию и эквивалентный ей метод класса CWnd.
*/
В классе CWnd есть виртуальный метод WndProc — переопределяй его на здоровье и работай с "сырыми" сообщениями.
Так же можеш подсунуть статическую функцию класса в RegisterClass (создав окно соотв. класса) — тут уж MFC стандартый обработчик сообщений окна AfxWndProc совсем выключается из игры.
Спасибо за информацию, но мне не хочется для каждого окна наследовать класс.
Как вы думаете, можно создать наследника от CWnd, переопределить у него WndProc и с помощью метода Attach аттачить его к любому HWND? И, соответственно снимать сообщения...
Здравствуйте PeterG, вы писали:
PG>SetWindowLong(hWnd, GWL_WNDPROC, ...)
Вот-вот этот метод вообще глобален и к MFC отношения не имеет — называется Window Procedure subclassing... почитать много где есть — и на этом сервере то же.
Только не забудте хранить старый обработчик и делать CallWindowProc на него.
Спасибо, Вам, за сообщения, я посмотрел, попробовал то, что вы говорили, но все равно я до конца не понял. Давайте по пунктам.
1. Если я подставляю свою функцию WindowProc (это я делал, и действительно сообщения приходят туда), но как мне сделать, чтобы остальные сообщения уходили к окну, к истинному получателью этих сообщений? А то хреново получается. Примерчик киньте пожалуйста.
2. Следует уточнить:
HWnd – понятно (хэндл отправителя), да?
message – сообщение
wParam – ?? ID контрола пославшего сообщение
lParam – ?? указатель на какую-то структуру
можно поточнее, что такое wParam и lParam.
3. Для чего все это?
На диалоге есть контрол (скажем ComboBox). Не используя CW, не используя карту сообщений (для этого контрола), нужно получать сообщения от этого контрола. Я подразумеваю, что они должны приходить либо в WindowProc либо должно приходить сообщение WM_NOTIFY и его обрабатывать.
Пожалуйста, подскажите как написать функцию обработки таких сообщений.
Или я вообще не прав? Может контрол обязательно прописывать в карту сообщений?
Здравствуйте 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>С уважением, Алексей.
Мой случай такой, что много тулбаров и на них есть контролы (CcomboBox, EditBox и т.д.) и от них нужно обрабатывать сообщения. Вооот.
С помощью CReBar добавляю CDialog с загруженными ресурсами, чтоб сделать на тулбаре контролы.