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

C++ и WinAPI

Войти
Регистрация
Восстановить пароль
 
Ваю
18 / 18 / 1
Регистрация: 21.04.2015
Сообщений: 528
#1

Диалог выхода из программы - C++ WinAPI

26.11.2016, 21:09. Просмотров 289. Ответов 7
Метки нет (Все метки)

Нужно сделать выход из прграммы, что-то типа
C++
1
MessageBox(hWnd, TEXT("Выйти из программы?"), TEXT("Выход"), MB_YESNO);
когда жмёшь на крестик. Как это делается?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
MSG msg; BOOL bRet;
for (;;) {
    // определяем наличие сообщений в очереди
    while (!PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) { }
    bRet = GetMessage(&msg, NULL, 0, 0);
 
    switch (bRet) {
        case 0: break; // получено WM_QUIT
        default:
            if (FALSE == PreTranslateMessage(&msg)) {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
    }
} // for
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2016, 21:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Диалог выхода из программы (C++ WinAPI):

Самописный диалог - C++
Надо сделать свой диалог с экзекьютом на сях. Как это делается?

Привязать диалог - C++ WinAPI
Доброго времени суток. Имеется главный диалог, при нажатии клавиши необходимо что бы всплывал справа от диалога второй диалог. Эту...

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

Диалог сохранения GetSaveFileName - C++ WinAPI
Не могу найти как сделать его. Создал кнопку, есть обработчик. Какой функцией он вызывается? И может библиотеки какие нужно подключать?

Немодальный диалог в DLL - C++ WinAPI
Пытаюсь в функции DLL создать немодальный диалог с помощью CreateDialog. Функция возвращает ошибку 1813 (указанный тип ресурса в файле...

Почему-то не вызывается диалог - C++ WinAPI
Вызов: CreateDialog(hInst, MAKEINTRESOURCE(IDD_INPUTBOX), hWnd, MyInputDlgProc); MyInputDlgProc INT_PTR CALLBACK MyInputDlgProc(HWND...

7
карбид
Заблокирован
26.11.2016, 21:19 #2
Кликните здесь для просмотра всего текста
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
//
// Подтверждение на выход.
//
BOOL ConfirmExit()
{
if( MessageBox(
GetActiveWindow(),
"Закрыть программу?",
"Выход из программы", MB_YESNO | MB_ICONQUESTION) == IDYES )
{
    return TRUE;// Выход.
}
return FALSE;   // Отмена.
}
 
//
//
 
case WM_CLOSE:
if( ConfirmExit()==TRUE )
{
    DestroyWindow(hWnd);
}
break;
 
//
0
Ваю
18 / 18 / 1
Регистрация: 21.04.2015
Сообщений: 528
26.11.2016, 21:40  [ТС] #3
При получении WM_CLOSE окна программы уже нет, оно было закрыто, при этом нельзя вызвать диалог как дочерний, я сначала пытался сделать примерно тоже самое, но это не работает, в результате того, что выход из цикла по break произведён не был - программа просто зацикливается на просмотре пустой очереди в PeekMessage
0
карбид
Заблокирован
26.11.2016, 21:47 #4
У вас ерунда какая то. Создайте простой проект с помощью мастера и посмотрите, образец кода - стандартный.
Если не знаете, как создавать - сожалею.
0
Ваю
18 / 18 / 1
Регистрация: 21.04.2015
Сообщений: 528
27.11.2016, 01:47  [ТС] #5
Подобное делалось созданием своей функции закрытия окна, которой подменялась стандартная, но как это сделать я не знаю. Может кто-то помочь?
0
WhiteP
606 / 204 / 23
Регистрация: 20.11.2012
Сообщений: 426
27.11.2016, 08:41 #6
Лови SC_CLOSE.

C
1
2
3
4
5
6
7
    case WM_SYSCOMMAND:
        if (wParam == SC_CLOSE)
        {
            if (MessageBox(hWnd, L"Выйти?", L"Application", MB_YESNO | MB_ICONQUESTION) == IDYES)
                break;          
            return 0; 
        }
1
Alex5
1102 / 763 / 119
Регистрация: 12.04.2010
Сообщений: 1,936
27.11.2016, 17:44 #7

Не по теме:

Цитата Сообщение от Ваю Посмотреть сообщение
пытался сделать примерно то же самое,


Цитата Сообщение от Ваю Посмотреть сообщение
При получении WM_CLOSE окна программы уже нет, оно было закрыто
Ваю, то, что Вы говорите, относится к событию WM_DESTROY.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
LONG WINAPI WndProc( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam )
{
    switch (message)
    {
    case WM_CLOSE:
        {
            int b = MessageBoxA( hwnd, "WM_CLOSE",  "Info", MB_OKCANCEL | MB_ICONINFORMATION | MB_TOPMOST ); 
            if( IDOK == b ) 
                return DefWindowProc(hwnd, msg, wparam, lparam); // By default, the DefWindowProc function calls the DestroyWindow 
            else 
                return 0; // окно не будет закрыто 
        }
        break;
1
Ваю
18 / 18 / 1
Регистрация: 21.04.2015
Сообщений: 528
28.11.2016, 01:43  [ТС] #8
Цитата Сообщение от WhiteP Посмотреть сообщение
WM_SYSCOMMAND
при использоваии этого флага мне придётся обрабатывать всё самому, хотя такой вопрос я тоже задал, спасибо

Alex5, сделал по вашему примеру и перенёс WM_CLOSE в самый конц свича, вроде как частично работает, но при нажатии на "Да" программа зацикливается в PeekMessage

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
LRESULT CALLBACK WinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {
        
        ...
        
        case WM_CLOSE:
            if (IDNO == MessageBox(hWnd, TEXT("Выйти из программы?"), 
                TEXT("Выход"), MB_YESNO | MB_ICONQUESTION | MB_TOPMOST)) return 0;
    } // switch
    
    ...
    
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
УПД:
не досмотрел "case 0: break;" надо заменить на "case 0: return (int)msg.wParam;" изначально у меня были if-ы, а потом заменил их на switch и поэтому выход из цикла по break; пропал
0
28.11.2016, 01:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2016, 01:43
Привет! Вот еще темы с ответами:

Windres ругается на диалог - C++ WinAPI
вот файл ресурсов #define ID_MANIFEST 1 #define RT_MANIFEST 24 ID_MANIFEST RT_MANIFEST "cert.manifest" ICO_MAIN ICON...

Создать прозрачный диалог с кнопкой - C++ WinAPI
Доброго времени суток. Необходимо сделать прозрачный диалог и кнопку. Кнопка должна быть либо прозрачной и на ней рисунок, либо как-то...

Диалог открытия файла на winApi - C++ WinAPI
Здратвуйте как вызвать диалог открытия/сохранения файла в winApi?

Заменить немодальный диалог на модальный - C++ WinAPI
Всем привет. У меня появилась некоторая проблема, при изучении языка С++Bilder 6.0 Так как я пропустил некоторое кол-во пар ( я учусь в...


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

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

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