Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Собственный обработчик


Автор: Coocky 12.4.2004, 20:07
Как говорит мой препод,если что-то не нравится,напиши сам biggrin.gif Вот и хочу писать(правильно ударение ставте biggrin.gif )сообственные обработчики.Вот только подскажите:
1.Какие есть параметры(и где их можно достать в МСДН) типа pMsg,UINT id, pHWND ну вы поняли,о чем я smile.gif
2.Все ли сообщения можно обрабатывать "ручками"
3.Ну и если это все занимает много инфы,то в каком разделе МСДН это можно достать smile.gif

Автор: Antech 13.4.2004, 08:29
Coocky
1. Если вы имеете в виду оконную процедуру, то об этом лучше почитать в любом описалове WinAPI. Его в инете масса.

2. Чтобы обрабатывать сообщения окна, можно поступить двумя способами:
а) Задать адрес оконно процедуры при создании окна в соответствующем поле структуры:
wndClass.lpfnWndProc=&WndProc;
б) Сабклассить существующее окно:
LONG wndProcPtr=::GetWindowLong(hWnd,GWL_WNDPROC); // Адрес исходной процедуры
::SetWindowLong(hWnd,GWL_USERDATA,wndProcPtr); // Запомнить исходный адрес
::SetWindowLong(hWnd,GWL_WNDPROC,(LONG)&WndProc); // Заменить адрес оконной процедуры
Здесь, как видите, нам понадобилось сохранить адрес исходной процедуры окна в одном очень
интимном месте, связанном с окном, которое носит имя User Data.
Если Вы сабклассите контрол на окне, созданном из ресурсов:
HWND hWndDialog=DialogBox(hInstance,MAKEINTRESOURCE(ID_DIALOG),NULL,&DialogProc), то Вам будет очень полезна следующая функция для определения хэндла:
HWND hWnd=::GetDlgItem(hWndDialog,ID_EDIT); // Например, для эдитбокса

3. Оконная процедура выглядит следующим образом:
// Не ругайте, если что некорректно. Я в основном сейчас на Фортране...
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
// Здесь Ваша обработка событий
switch (msg)
{
case WM_MOUSEMOVE:
// Обработка перемещения мышки на окне
break;
case WM_LBUTTONDOWN:
// Обработка нажатия левой кнопки мышки
break;
};
// Исходный обработчик следует запускать только в случае сабклассинга
WNDPROC wndProc; // Адрес исходной оконной процедуры
wndProc=(WNDPROC)::GetWindowLong(hWnd,GWL_USERDATA)
::CallWindowProc(wndProc,hWnd,msg,wParam,lParam) // Исходный обработчик
};

Если Вы создаете собственный контрол, то Вам будет необходимо запихивать в USER_DATA не адрес исходного обработчика окна, а адрес объекта Вашего класса (в оконной процедуре, соответственно, ставите указатель на этот объект). Одним из свойств должен быть тот самый адрес исходного обработчика (если он нужен).

Все это скромное IMHO, не пинайте сильно.

Автор: Coocky 15.4.2004, 21:44
Спасибо за потраченное на меня время,но видать я не правильно обьяснил.Я работаю(работал и буду работать biggrin.gif ) с МФС.Мне интересно,что-то типа ON_COMMAND_RANGE.,ON_CONTROL_ID,только собственными руками smile.gif
Цитата
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
я знаю,жив еще старичок,только в МФС я его не вижу и не увижу(да и не растроюсь).
А вопрос,ребята пока,в силе... smile.gif

Автор: AlexNor 15.4.2004, 22:49
Цитата(Coocky @ 12.4.2004, 20:07)

1.Какие есть параметры(и где их можно достать в МСДН) типа pMsg,UINT id, pHWND ну вы поняли,о чем я smile.gif

если чесно - то не совсем hmmm.gif

Цитата(Coocky @ 12.4.2004, 20:07)

2.Все ли сообщения можно обрабатывать "ручками"

В MFC? Я точно сказать не могу... Прям все сообщения не обрабатывал biggrin.gif

Цитата(Coocky @ 12.4.2004, 20:07)

3.Ну и если это все занимает много инфы,то в каком разделе МСДН это можно достать smile.gif


На сколько я понял тебе нужно чётко знать маршрутизацию всех сообщений в MFC. Да уж....
В MSDN я нихрена толком не нашёл . Я как то пытался это разобрать методом трассирования: и часто происходило так что одна функция вызывает другую, другая - третью, третья - четвёртую и т.д. в конце концов сообщение пропадало где-то в недрах...
Я как то нарыл очень хороший текст (аглицкий правда): там крендель очень хорошо написал о маршрутизации комманд в MFC (ну и соответсвенно где и как их можно перехватывать). И потом как то видел на русском. В электронном виде он у меня не сохранился sad.gif но поищи в инете: автор Поль ДиЛашиа (Paul DiLascia) темы статьи тоже не сохранилось но что то вроде Маршрутизация сообщений и комманд в MFC.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)