Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
cs_from_hell
0 / 0 / 0
Регистрация: 25.05.2010
Сообщений: 19
#1

Процедура обработки сообщений для отдельного контрола - C++

29.07.2010, 10:53. Просмотров 844. Ответов 6
Метки нет (Все метки)

Доброго времени суток!
Не могу найти информацию как реализовать отдельную процедуру обработки сообщений какого-либо контрола на фотме.
Нашел такой вариант, но ничего не происходит:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
LRESULT CALLBACK newEditProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
WNDPROC oldEditProcedure;
//
 
oldEditProcedure = (WNDPROC)GetWindowLongPtr (hedit, GWLP_WNDPROC);         
SetWindowLongPtr (hedit, GWLP_WNDPROC, (LONG_PTR)newEditProcedure);
//
 
LRESULT CALLBACK newEditProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 
    switch (message)
    {
    case WM_KEYUP:
         {
               MessageBox(NULL, "Не появляется!(((", "in newEditProcedure", 0);
         }
         break;
    default:
         if (oldEditProcedure)
         {
              return CallWindowProc (oldEditProcedure, hwnd, message, wParam, lParam);
         }
         else
         {
              return DefWindowProc (hwnd, message, wParam, lParam);
         }
    }
}
Как это можно реализовать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2010, 10:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Процедура обработки сообщений для отдельного контрола (C++):

Как в функцию обработки сообщений передать параметры? - C++
Как в функцию обработки сообщений типа void CMathematicsView::OnResultButton() передать параметры? Как и где написать прототип и...

Можно ли создать поток для выполнения отдельного метода - C++
Здравствуйте! Подскажите как ( и возможно ли это вообще ) создать поток для отдельного метода? Имеется клас окна, в нем метод который...

Вычислить среднее и сумму для каждого отдельного имени ассоциативного массива - C++
Доброго времени суток! Хочу разобраться с примером из книги Страуструпа. Задание звучит следующим образом: введите последовательность...

Создать функцию для обработки символьных строк. За образец брать библиотечные функции обработки строк языка С, но не применять их в своей функции - C++
Доброго времени суток! Крайне необходима помощь экспертов в С++! Кто может - не оставьте меня в беде))) Вот задания: 3. Создать...

Отдельная процедура обработки сообщений от GroupBox - C++ WinAPI
Создаю отдельную процедуру для обработки сообщений от элементов, которые находятся на GroupBox. сам GroupBox лежит на главной форме. Всё...

Скриншот отдельного контрола - C#
Собственно сабж... Но есть и пример этого всего :) Откройте визуал студию и в ней несколько окон, потом нажмите кнтр+таб, и появиться...

6
rrrFer
Заблокирован
29.07.2010, 14:02 #2
cs_from_hell,
сохраняете процедуру обработки по умолчанию
C++
1
2
3
4
5
6
WNDPROC OldWinProc; //стандартная процедура обработки событий
HWND wndThis;
wndThis = CreateWindowEx(WS_EX_ACCEPTFILES,TEXT("BUTTON"),
            TEXT(""),!WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
            x, y, h, w, hForm, 0, (HINSTANCE)GetModuleHandle (0),0);
OldWinProc = (WNDPROC)SetWindowLong(wndThis, GWL_WNDPROC, (LONG)DefWindowProc);
в процедуре обработки обрабатываете те события которые вам надо обрабатывать по особому(из за чего заваривалась каша) и, затем, выполняете
C++
1
return OldWinProc(hwnd, message, wParam, lParam);
чтобы не описывать обработку событий, которые должны быть обработаны стандартно.

Добавлено через 3 минуты
забыл, после того как сохранена процедура обработки событий по умолчанию, надо привязать к созданному окну новую процедуру обработки:
C++
1
2
OldWinProc = (WNDPROC)SetWindowLong(wndThis, GWL_WNDPROC, (LONG)DefWindowProc);
    SetWindowLongPtr (wndThis, GWLP_WNDPROC,(long)ButtonProc);
1
cs_from_hell
0 / 0 / 0
Регистрация: 25.05.2010
Сообщений: 19
29.07.2010, 19:26  [ТС] #3
Спасибо! Это понятно! Еще один вопрос с этим связанный. Что передается в "message", "wParam" и "lParam"?
Понимаю что из этих переменных можно получить много полезной информации, например координаты мыши, код символа при событии WM_CHAR или WM_KEYDOWN например. Как получить все данные что в них передаются?
0
rrrFer
Заблокирован
29.07.2010, 19:44 #4
cs_from_hell, посмотри тут
0
cs_from_hell
0 / 0 / 0
Регистрация: 25.05.2010
Сообщений: 19
29.07.2010, 21:46  [ТС] #5
Еще один вопрос возник, в C# к примеру при обработке собыдия KeyPress если символ подходит просто пишем return, если нужно заблокировать его ввод e.Handled = true, как в Апи это сделать? Или придется добавлять стивол в коде(сразу вопрос возник, как к тексту эдита просто добавить текст(Не соединяя полученный от него и добавляемый)?)?

Добавлено через 11 минут
rrrFer, спасибо за ссылку, статья интересная)

Добавлено через 1 час 41 минуту
С одной проблемой разобрался, если надо пропустить символ то передаем сообщение родной процедуре контрола
C++
1
return OldWndProc(hedit, message, wParam, lParam);
Хотелось бы еще побольше узнать о значениях содержащихся в lParam и wParam в разных сообщениях и можно ли так же что-нибудь вытащить из UINT message?
0
rrrFer
Заблокирован
30.07.2010, 03:36 #6
cs_from_hell, ищи описание сообщения на http://msdn.microsoft.com там же найдешь значение wparam и lparam для этого сообщения, например http://msdn.microsoft.com/en-us/library/ms646347(v=VS.85).aspx
0
cs_from_hell
0 / 0 / 0
Регистрация: 25.05.2010
Сообщений: 19
30.07.2010, 22:07  [ТС] #7
rrrFer, спасибо! Теперь знаю в какую сторону копть)))
0
30.07.2010, 22:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2010, 22:07
Привет! Вот еще темы с ответами:

Динамически добавить рамку для контрола с возможностью обработки клика - C# WPF
Суть задачи: на форме много разных контролов, нужно по определенным условиям выделить некоторые контролы с помощью рамки (примерно как с...

Процедура печати для внешней обработки - 1С
Добрый день, 2-ой день мучаюсь с простейшей задачей: Я создал внешнюю обработку в ней создал макет, в котором для теста поместил...

Процедура обработки нажатых клавиш для сокобана - Delphi
Нужно сделать так , чтобы при нажатии на клавиши кроме w,a,s,d, вместо ошибки ничего не происходило. procedure...

Процедура обработки события нажатия клавиши для формы - Visual Basic
Как правильно написать процедуру обработки события нажатия клавиши для формы (нажатие комбинаций клавиш с ALT, SHIFT или CTRL)? Есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru