Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Глючит функция DestroyWindow()  (Прочитано 13988 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Eidan
Гость
« : 01-07-2005 14:36 » 

Недавно начал осваивать Visual C++. Пишу игру типа "Угадай слово по буквам".

Помогите, пожалуйста, решить такую проблему с функцией DestroyWindow():

Нажатые на клавиатуре буквы я обрабатываю функцией
void CMainWnd::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
}

Проблема такая. Если в начале этой функции поставить DestroyWindow(), то главное окно убивается, но при этом выдается ошибка обращения к памяти. Почему это происходит? И как этого избежать?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 01-07-2005 15:10 » 

А какое окошко ты хочеш убить. Если ты ставиш в данную функцию DestroyWindow, то получается, что ты убиваеш окно, которое принадлежит классу. Тем самым ты убиваеш класс. Ну естественно, дальнейшее выполнение функций класса уже не возможно.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Eidan
Гость
« Ответ #2 : 01-07-2005 16:02 » 

Я как раз и хочу убить главное и единственное окно моей программы.
То есть это, конечно, должно происходить не в начале функции OnChar, а дальше, после обработки ряда событий, НО
когда у меня полезла эта ошибка обращения к памяти, то я для теста решил поставить DestroyWindow в начало функции.
Поставил. Ошибка осталась.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 01-07-2005 17:47 » 

Лучше пошли своему окну сообшение WM_DESTROY при помоши функции PostMessage. Тогда у тебя не должно быть глюков.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Eidan
Гость
« Ответ #4 : 01-07-2005 19:16 » 

Заменил DestroyWindow() на PostMessage(WM_DESTROY)
В этом случае программа окно вообще не закрывает, хотя PostMessage возвращает единицу.
Может ему надо как-то указать, что какое именно окно закрывать. Но я не знаю, как это сделать.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 01-07-2005 19:46 » 

Ради примера я сейчас сделал на чистом WinAPI  програму и прописал так PostMessage(hWnd, WM_CLOSE,0,0);
где hWnd  Хэндл окна. Здесь я посылаю сообшение WM_CLOSE но в принципе также посылал WM_DESTROY. PostMessage просто оставляет сообшение в очереди сообшений. Поэтому результат работы данной функции будет положительным.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #6 : 01-07-2005 20:53 » 

Я c MFC не работал. Чуть порылся по инету, Вот что нашел в аналогичном случае http://codenet.ru/progr/visualc/mfc/mfc6.php
Код:
afx_msg void CMainWin::OnCommand_Exit()
  {
  this->SendMessage(WM_CLOSE);
  }
« Последнее редактирование: 01-07-2005 21:04 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Eidan
Гость
« Ответ #7 : 02-07-2005 03:33 » new

WM_CLOSE вызывает ту же самую функцию DestroyWindow(), и поэтому выдает ту же ошибку,
А  WM_DESTROY почему-то вообще ничего не делает.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #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
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #10 : 02-07-2005 09:48 » 

А после DestroyWindow ты не пробовал поставить return;
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Eidan
Гость
« Ответ #11 : 02-07-2005 10:15 » 

Ой:) Клево. Помогло. Спасибо:)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines