Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Собственный обработчик |
Автор: Coocky 12.4.2004, 20:07 |
Как говорит мой препод,если что-то не нравится,напиши сам ![]() ![]() 1.Какие есть параметры(и где их можно достать в МСДН) типа pMsg,UINT id, pHWND ну вы поняли,о чем я ![]() 2.Все ли сообщения можно обрабатывать "ручками" 3.Ну и если это все занимает много инфы,то в каком разделе МСДН это можно достать ![]() |
Автор: 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 | ||
Спасибо за потраченное на меня время,но видать я не правильно обьяснил.Я работаю(работал и буду работать ![]() ![]()
А вопрос,ребята пока,в силе... ![]() |
Автор: AlexNor 15.4.2004, 22:49 | ||||||
если чесно - то не совсем ![]()
В MFC? Я точно сказать не могу... Прям все сообщения не обрабатывал ![]()
На сколько я понял тебе нужно чётко знать маршрутизацию всех сообщений в MFC. Да уж.... В MSDN я нихрена толком не нашёл . Я как то пытался это разобрать методом трассирования: и часто происходило так что одна функция вызывает другую, другая - третью, третья - четвёртую и т.д. в конце концов сообщение пропадало где-то в недрах... Я как то нарыл очень хороший текст (аглицкий правда): там крендель очень хорошо написал о маршрутизации комманд в MFC (ну и соответсвенно где и как их можно перехватывать). И потом как то видел на русском. В электронном виде он у меня не сохранился ![]() |