Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 04.02.2012
Сообщений: 4
1

Не обрабатывается WM_DESTROY

04.02.2012, 15:10. Показов 3416. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, вот случилось некоторое непонимание по поводу базовых функций окошек

Вот основной цикл main()
C++
1
2
3
4
5
6
7
8
9
10
11
    while(true)
    {
        if(PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE))
        {
            if(msg.message == WM_QUIT)
                break;
            
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
Так-же обработчик WndProc() (lpfnWndProc):
C++
1
2
3
4
5
6
7
8
9
    switch(message)
    {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        default: 
            PostQuitMessage(0);
            return DefWindowProc(hWnd,message,wParam,lParam);
    }
При нажатии на крестик окошко пропадает, но процесс остаётся жив, хотя WM_DESTROY в обработчике есть...
Так-же при любой другом действии с окном(перемещение) срабатывает "default" в switch(WndProc), тоесть сообщения обрабатываются, но именно впоймать WM_DESTROY не получается...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.02.2012, 15:10
Ответы с готовыми решениями:

WM_DESTROY закрывает не все окна
Пишу на C#, на раздел по WinAPI есть только в разделе C++. Если будет ответ с кодом на C++,...

Сообщения WM_DESTROY и WM_CLOSE
Есть одна небольшая проблема: С помощью Сишной DLL-ки ставлю 'хук' на чужое окно. Это главное...

Не обрабатывается исключение
Подскажите, пожалуйста, почему не обрабатывается исключение когда я ввожу не int число а букву? Все...

Не обрабатывается форма
Здравствуйте. К сожалению нужна помощь в решении задачи, которую я не смог решить. PHP только...

7
20 / 20 / 4
Регистрация: 23.10.2009
Сообщений: 139
04.02.2012, 15:17 2
Попробуй обработать WM_CLOSE, это сообщение должно посылаться по крестику. А в обработчике вручную послать WM_DESTROY. Примерно такая схема при работе с немодальными диалогами в МФЦ. Ну здесь я думаю также.
0
Модератор
Эксперт по электронике
8950 / 6716 / 921
Регистрация: 14.02.2011
Сообщений: 23,696
04.02.2012, 19:26 3
выкинь из
Цитата Сообщение от dimon4ik062 Посмотреть сообщение
default:
PostQuitMessage(0);
return DefWindowProc(hWnd,message,wParam,lParam)
PostQuitMessage(0);
http://www.firststeps.ru/mfc/winapi/r.php?60
при WM_DESTROY:
вызывается PostQuitMessage(0);
которая вызовет WM_QUIT
у тебя нет этого обработчика попадаем в ветку default
где опять вызывается PostQuitMessage
и опять WM_QUIT
зациклились в
return DefWindowProc(hWnd,message,wParam,lParam); не попадаем

Добавлено через 4 минуты
Цитата Сообщение от dimon4ik062 Посмотреть сообщение
но процесс остаётся жив, хотя WM_DESTROY в обработчике есть...
не он же убивает процесс

Добавлено через 1 минуту
вот еще
http://www.transl-gunsmoker.ru... ssage.html
0
0 / 0 / 0
Регистрация: 04.02.2012
Сообщений: 4
04.02.2012, 20:36  [ТС] 4
Цитата Сообщение от ValeryS Посмотреть сообщение
выкинь из

PostQuitMessage(0);
это я для проверки вставил, при перемещении окна успешно обрабатывается как раз dafault и WM_QUIT срабатывает, процесс умирает.

Цитата Сообщение от ValeryS Посмотреть сообщение
http://www.firststeps.ru/mfc/winapi/r.php?60
при WM_DESTROY:
вызывается PostQuitMessage(0);
которая вызовет WM_QUIT
у тебя нет этого обработчика попадаем в ветку default
где опять вызывается PostQuitMessage
и опять WM_QUIT
зациклились в
return DefWindowProc(hWnd,message,wParam,lParam); не попадаем

Добавлено через 4 минуты

не он же убивает процесс

Добавлено через 1 минуту
вот еще
http://www.transl-gunsmoker.ru... ssage.html
Вроде логику Вашего мышления понял, но всёравно запутался уже под конец...

В общем пытаюсь просто методом тыка...

Если отлавливать WM_CLOSE, то он срабатывает только допустим после перемещения окна, тоесть если жмакать по крестику ничего не происходит, но если сменить положение окна, т.е. вызвать default разок, то на сл. раз крестик срабатывается и приложение умирает правильно... странно...
C++
1
2
3
4
5
6
7
8
    switch(message)
    {
        case WM_CLOSE:
            PostQuitMessage(0);
            return 0;
        default: 
            return DefWindowProc(hWnd,message,wParam,lParam);
    }
0
Модератор
Эксперт по электронике
8950 / 6716 / 921
Регистрация: 14.02.2011
Сообщений: 23,696
04.02.2012, 20:49 5
Цитата Сообщение от dimon4ik062 Посмотреть сообщение
Если отлавливать WM_CLOSE,
кто тебя так учил
если так то посылай в обработчике WM_DESTROY
но проще и правильней
C++
1
2
3
4
5
6
7
8
9
switch(message)
        {
                case WM_DESTROY:
                        PostQuitMessage(0);
                        return 0;
                default: 
                    
                        return DefWindowProc(hWnd,message,wParam,lParam);
        }
Добавлено через 1 минуту
ты ссылки прочитал? там все описано что происходит при закрытии
0
0 / 0 / 0
Регистрация: 04.02.2012
Сообщений: 4
04.02.2012, 20:52  [ТС] 6
Цитата Сообщение от ValeryS Посмотреть сообщение
кто тебя так учил
если так то посылай в обработчике WM_DESTROY
но проще и правильней
C++
1
2
3
4
5
6
7
8
9
switch(message)
        {
                case WM_DESTROY:
                        PostQuitMessage(0);
                        return 0;
                default: 
                    
                        return DefWindowProc(hWnd,message,wParam,lParam);
        }
Обратите внимание, пожалуйста, на первый пост.
Там при использовании WM_DESTROY почему-то не убивается процесс. Это цель данной темы: понять почему же так происходит.

Спасибо.

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
кто тебя так учил
ты ссылки прочитал? там все описано что происходит при закрытии
Т.е. мне нужно в WndProc отловить WM_QUIT и послать его на основной цикл(WinMain)?
0
Модератор
Эксперт по электронике
8950 / 6716 / 921
Регистрация: 14.02.2011
Сообщений: 23,696
04.02.2012, 20:53 7
Цитата Сообщение от dimon4ik062 Посмотреть сообщение
Это цель данной темы: понять почему же так происходит.
я тебе объяснил
из за
PostQuitMessage(0); в ветке default:
сравни мой и твой код и почитай наконец ссылки
0
Заблокирован
Автор FAQ
05.02.2012, 12:22 8
Цитата Сообщение от dimon4ik062 Посмотреть сообщение
case WM_DESTROY:
* * * * * * * * * * * * PostQuitMessage(0);
* * * * * * * * * * * * return 0;
* * * * * * * * default:
* * * * * * * * * * * * PostQuitMessage(0);
* * * * * * * * * * * * return DefWindowProc(hWnd,message,wParam,lParam);
* * * * }
- как по мне нужно писать вот так
Вот так пробуй
C
1
2
3
4
5
6
7
case WM_DESTROY:
        PostQuitMessage(0);
        break;
     default: 
        return DefWindowProc(hWnd,message,wParam,lParam);
}//End switch
return 0;
Добавлено через 3 минуты
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
PostQuitMessage(0);
* * * * break;
- возможно ещё добавить DestroyWindow(hWnd); или же если DialogBox юзалась EndDialog
А вообще лучше весь код выложы для анализа

Добавлено через 5 минут
А вообще вот так приблизительно строю WndProc
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
30
31
32
33
34
35
36
37
38
LRESULT APIENTRY WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    BOOL bRet = FALSE;
    BOOL bCmd = FALSE;
 
    switch (msg) 
    {
        case WM_INITDIALOG:       
    
            bRet = TRUE;
            break;
        case WM_COMMAND:
              bCmd = TRUE;//Чтобы занырнуть в свич команд
              bRet = TRUE;
              break;
        case WM_DESTROY:          /* при закрытии окна восстанавливаем старую иконку */
            SetClassLong(hwnd,GCL_HICON,(long)OldIcon);
            PostQuitMessage(0);
            bRet = TRUE;
            break;
    }
    if(bCmd == TRUE) //сюда попадём только если msg == WM_COMMAND
    switch(LOWORD(wParam))
    {
        case ID_OPEN:
            
            break;
        case ID_ABOUT:         /* команда меню "About" */
            MessageBoxA(hwnd,"Bla bla bla","О программе...",MB_OK | MB_ICONINFORMATION);
            break;
        case IDCANCEL:         /* посылается при закрытии диалога по [Esc]*/
        case ID_EXIT:          /* команда меню "ВЫход" */
            DestroyWindow(hwnd);
            bRet = TRUE;
            break;
    }
    return bRet;
}
0
05.02.2012, 12:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.02.2012, 12:22
Помогаю со студенческими работами здесь

Не обрабатывается success
Всем привет, есть форма : <form id="LogonForm" action="" method="post"> div class="logonField"> ...

Не обрабатывается $_POST
Здравствуйте, сделал лёгкую авторизацию чтобы запаролить страницу, столкнулся с такой проблемой....

Не обрабатывается MouseLeftButtonUp
Хотя, возможно, я неверно понял его работу... Если я жму по элементу и отпускаю мышку, то ничего...

Не обрабатывается php
Здравствуйте, такая проблема. Сайт находится на системе RipeCMS Lite. Изначально находился на...

Не обрабатывается исключение
Ребят, начал изучать механизм исключений, но что-то не задалось( Просто вводим два числа, делим...

Не обрабатывается исключение
Почему не обрабатывается исключение? procedure Dobavit_v_avtozapusk(); var reg: tregistry;...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru