Eidan
Гость
|
|
« : 01-07-2005 14:36 » |
|
Недавно начал осваивать Visual C++. Пишу игру типа "Угадай слово по буквам".
Помогите, пожалуйста, решить такую проблему с функцией DestroyWindow():
Нажатые на клавиатуре буквы я обрабатываю функцией void CMainWnd::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { }
Проблема такая. Если в начале этой функции поставить DestroyWindow(), то главное окно убивается, но при этом выдается ошибка обращения к памяти. Почему это происходит? И как этого избежать?
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Online
Пол:
Пролетал мимо
|
|
« Ответ #1 : 01-07-2005 15:10 » |
|
А какое окошко ты хочеш убить. Если ты ставиш в данную функцию DestroyWindow, то получается, что ты убиваеш окно, которое принадлежит классу. Тем самым ты убиваеш класс. Ну естественно, дальнейшее выполнение функций класса уже не возможно.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Eidan
Гость
|
|
« Ответ #2 : 01-07-2005 16:02 » |
|
Я как раз и хочу убить главное и единственное окно моей программы. То есть это, конечно, должно происходить не в начале функции OnChar, а дальше, после обработки ряда событий, НО когда у меня полезла эта ошибка обращения к памяти, то я для теста решил поставить DestroyWindow в начало функции. Поставил. Ошибка осталась.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Online
Пол:
Пролетал мимо
|
|
« Ответ #3 : 01-07-2005 17:47 » |
|
Лучше пошли своему окну сообшение WM_DESTROY при помоши функции PostMessage. Тогда у тебя не должно быть глюков.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Eidan
Гость
|
|
« Ответ #4 : 01-07-2005 19:16 » |
|
Заменил DestroyWindow() на PostMessage(WM_DESTROY) В этом случае программа окно вообще не закрывает, хотя PostMessage возвращает единицу. Может ему надо как-то указать, что какое именно окно закрывать. Но я не знаю, как это сделать.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Online
Пол:
Пролетал мимо
|
|
« Ответ #5 : 01-07-2005 19:46 » |
|
Ради примера я сейчас сделал на чистом WinAPI програму и прописал так PostMessage(hWnd, WM_CLOSE,0,0); где hWnd Хэндл окна. Здесь я посылаю сообшение WM_CLOSE но в принципе также посылал WM_DESTROY. PostMessage просто оставляет сообшение в очереди сообшений. Поэтому результат работы данной функции будет положительным.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Finch
Спокойный
Администратор
Online
Пол:
Пролетал мимо
|
|
« Ответ #6 : 01-07-2005 20:53 » |
|
Я c MFC не работал. Чуть порылся по инету, Вот что нашел в аналогичном случае http://codenet.ru/progr/visualc/mfc/mfc6.phpafx_msg void CMainWin::OnCommand_Exit() { this->SendMessage(WM_CLOSE); }
|
|
« Последнее редактирование: 01-07-2005 21:04 от Finch »
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Eidan
Гость
|
|
« Ответ #7 : 02-07-2005 03:33 » |
|
WM_CLOSE вызывает ту же самую функцию DestroyWindow(), и поэтому выдает ту же ошибку, А WM_DESTROY почему-то вообще ничего не делает.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Online
Пол:
Пролетал мимо
|
|
« Ответ #8 : 02-07-2005 07:08 » |
|
Напиши полный код функции void CMainWnd::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags). Иначе, это гадание на пальцах.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Eidan
Гость
|
|
« Ответ #9 : 02-07-2005 09:39 » |
|
Я понял, в чем проблема, но не совсем понял как ее решить Дело в том, что после срабатывания DestroyWindow программа не сразу заканчивает работу, а хочет дойти до конца функции OnChar А у меня в конце OnChar стоит такая проверка "угадано ли слово целиком?"
if (guessedLetters == wordLength) { DestroyWindow(); }
Так вот после срабатывания DestroyWindow в начале программы обе переменные (guessedLetters и wordLength) становятся равными -174838 (ну или какое-то похожее число). Естественно условие проверки выполняется и DestroyWindow запускается еще раз. А уничтожать уже нечего:) Поэтому выдается ошибка обращения к памяти.
Вопрос. Как избежать того, что guessedLetters и wordLength делаются равными после первого срабатывания DestroyWindow?
|
|
« Последнее редактирование: 02-07-2005 14:12 от Eidan »
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Online
Пол:
Пролетал мимо
|
|
« Ответ #10 : 02-07-2005 09:48 » |
|
А после DestroyWindow ты не пробовал поставить return;
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Eidan
Гость
|
|
« Ответ #11 : 02-07-2005 10:15 » |
|
Ой:) Клево. Помогло. Спасибо:)
|
|
|
Записан
|
|
|
|
|