![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
GGoga |
|
||||||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 1.5.2007 Где: Харьков Репутация: нет Всего: нет |
Здравствуйте, уважаемые господа программисты! Помогите, пожалуйста, начинающему программисту
![]() Как можно реализовать следующую задачу: необходимо, чтобы при наступлении определенного события, обрабатывать его в функции WindowProc. Я так понимаю, что необходимо определить свое сообщение, для этого я пишу следующий код:
После этого ловлю данное сообщение в функции WindowProc:
И отправляю данное сообщение при наступлении события:
Однако при этом ничего не происходит, сообщение "Game Over!" на экран не выводится :( Я просто уверен, что я что-то делаю не так или не все! Вот только не знаю, что именно нужно изменить или добавить. Подскажите кто-нибудь решение проблемы. Заранее ОГРОМНОЕ СПАСИБО! |
||||||
|
|||||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 12 Всего: 92 |
интересная сигнатура у твоей WindowProc если работаешь в МФС, то перегружай соответствующий метод (WindowProc) у главного окна, и там лови |
|||
|
||||
GGoga |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 1.5.2007 Где: Харьков Репутация: нет Всего: нет |
Работаю с WinAPI с поддержкой MFC. Пробовал вариант c SendMessage(), только при этом приложение вылетает с неизвестной ошибкой :( Как ее избежать я не знаю, при троссировке показывает доступ к неизвестной области памяти... |
|||
|
||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 12 Всего: 92 |
||||
|
||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 12 Всего: 92 |
вот тебе пример рабочий:
проект на всякий случай прикладываю (VC7.1) Это сообщение отредактировал(а) zkv - 21.7.2007, 01:51 Присоединённый файл ( Кол-во скачиваний: 11 ) ![]() |
|||
|
||||
CMD |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 1.8.2006 Репутация: 1 Всего: 1 |
Здравствуй.
1) Ход мыслей почти правильный, только свои сообщения нужно отлавливать соответствующе, а отправляються они окну не напрямую, а через сообщение WM_COMMAND, в параметре wParam. Для твоего случая это будет выглядить так:
2) Исходя из первого пункта думаю понятно, что ты пытаешься вызвать неопределённое действие. Если хочешь, стучи в аську 367-й0й, й=5. Я - BO$$. |
|||
|
||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 12 Всего: 92 |
||||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 12 Всего: 121 |
Я так понял, так делается в случае, когда в программе используется Accelerator. Но с чего решили, что он здесь используется? http://msdn2.microsoft.com/en-us/library/ms645526.aspx http://msdn2.microsoft.com/en-us/library/ms647591.aspx -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
CMD |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 1.8.2006 Репутация: 1 Всего: 1 |
Ты ж его не сам писал, вот и непотрудился разобраться, что к чему: http://msdn2.microsoft.com/en-us/library/ms644931.aspx Там чётко написано, какие бывают сообщения, я не видел всего твоего кода, но думаю, что целесообразнее использовать WM_APP, вместо WM_USER.
Неправильно ты понял, там же доступным языком написано, что:
А parent window - это контрол. Акселераторы тут непричём. |
||||||
|
|||||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 12 Всего: 92 |
сам, от первой до последней строчки. Хамите сударь!
почитал информацию по вашей ссылке, интересно, не знал, всегда работал с WM_USER, проблем не было. Спасибо. чего? CMD, WM_COMMAND точно такое же сообщение как и все остальные в системе. Что пошлем, то и ловить надо, или вы хотите сказать, что если мы делаем SendMessage( WM_USER+1 ) своему окну, то ловить придется WM_COMMAND? ![]() Вот поэтому и работает мой пример. В вашей ссылке говорится, что такое сообщение может использоваться другими классами окон, те возможны конфликты (в моей практике не было, кто-нить сталкивался? интересно), но кто говорил о том, что обрабатывать надо WM_COMMAND, если мы сами его не слали? Не путайте пожалуйста пользовательские сообщения с notifications контролов. Прошу вас, не пытаться устроить тут войну, я буду очень вам благодарен, если вы расскажете мне что-то, чего я не знаю. |
|||
|
||||
CMD |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 1.8.2006 Репутация: 1 Всего: 1 |
zkv, извини, я ошибся ибо имел ввиду автора темы - GGoga. Что косаеться контролов - то это тоже окна. А про конфликты - видимо имелось ввиду, что если определить сообщение, которое уже зарезервировано системой, то тогда и будут конфликты. |
|||
|
||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 12 Всего: 92 |
в курсе. только контрол по отношению к форме это child window, а форма по отношению к контролу как раз parent window
я тоже так понял, но до конца еще не уверен, что понял правильно, множество исходников есть, где люди используют WM_USER и не стесняются. |
|||
|
||||
CMD |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 1.8.2006 Репутация: 1 Всего: 1 |
А чего тут стесняться? Из приведенных мною выше ссылок следует, что есть несколько типов сообщений, для каждого типа - есть область идентификаторов сообщений. По этому можно совершенно спокойно наплодить довольно большую кучку собственных сообщений и ни о чём не беспокоиться. |
|||
|
||||
GGoga |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 1.5.2007 Где: Харьков Репутация: нет Всего: нет |
Спасибо Вам за пример! Я вот только не могу получить указатель на окно :( Я пытаюсь вызвать функцию AfxGetMainWnd(), однако она возвращает NULL. Может она и не должна возвращать указатель, ведь приложение не MFC (хотя с его поддержкой). Если этой функцией нельзя, то как в такой ситуации быть? А вот если сделать так:
То сообщение нормально, без каких-либо проблем, будет выведено на экран. Подскажите, пожалуйста, как в такой ситуации поступить? Как правильно получить указатель на окно, если AfxGetMainWnd() возвращает NULL? Заранее, СПАСИБО! |
||||
|
|||||
CMD |
|
||||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 1.8.2006 Репутация: 1 Всего: 1 |
Функция MessageBox будет выполянться в любом случае, при любом hWnd, даже если он равен нулю.
А как же ты его интересно создавал? Если средствами WinAPI, то при создании сам определяешь указатель на него. Лучше приведи свой код для ясности. FindWindow найдёт окно по названию. |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |