Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/40: Рейтинг темы: голосов - 40, средняя оценка - 4.73
2 / 2 / 0
Регистрация: 16.08.2019
Сообщений: 13
1

Создание диалоговых окон

16.08.2019, 14:02. Показов 7486. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Возникла проблема с отображением диалоговых окон. Создал ресурс меню(один пункт для вызова диалогового окна) и диалоговое окно(кнопки 'ok', 'отмена' и две пользовательские кнопки). При вызове диалогового меню появляются только кнопки из диалогового окна, а само диалоговое окно не отображается. При нажатии на кнопку 'отмена'(закрытие диалогового окна) кнопки исчезают, при нажатии на пользовательские кнопки(должно было появиться окно сообщения) программа зависает.
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <Windows.h>
#include "resource.h"
 
//********************************************************************************************
LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK DFunc(HWND, UINT, WPARAM, LPARAM);
//********************************************************************************************
char szWinName[] = "МоеОкно";
HINSTANCE hInst;
//********************************************************************************************
 
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs, int nWinMode) {
    HWND hwnd;
    MSG msg;
    WNDCLASS wc1;
    wc1.hInstance = hThisInst;
    wc1.lpszClassName = (LPCSTR)szWinName;
    wc1.lpfnWndProc = WindowFunc;
    wc1.style = 0;
    wc1.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc1.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc1.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
    wc1.cbClsExtra = 0;
    wc1.cbWndExtra = 0;
    wc1.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    if (!RegisterClass(&wc1)) { return 0; }
    hwnd = CreateWindow((LPCSTR)szWinName,
        (LPCSTR)"Каркас программы для Windows",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        HWND_DESKTOP,
        NULL,
        hThisInst,
        NULL);
    ShowWindow(hwnd, nWinMode);
    UpdateWindow(hwnd);
    hInst=hThisInst;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
 
//********************************************************************************************
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
    switch (message) {
        case WM_COMMAND:
            switch(LOWORD(wParam)) {
                case ID_40001:
                    DialogBox(hInst,MAKEINTRESOURCE(IDD_DIALOG1), hwnd, DFunc);
                    break;
            }
            break;
        case WM_DESTROY: PostQuitMessage(0); break;
        default: return DefWindowProc(hwnd, message, wParam, lParam);
    }
    return 0;
}
 
BOOL CALLBACK DFunc(HWND hdwnd, UINT message, WPARAM wParam, LPARAM lParam) {
    switch(message) {
        case WM_COMMAND:
            switch(LOWORD(wParam)) {
                case IDCANCEL:
                    EndDialog(hdwnd, 0);
                    return 1;
                case IDC_BUTTON1:
                    MessageBox(hdwnd, "Выбран красный", "Красный", MB_OK);
                    break;
                case IDC_BUTTON2:
                    MessageBox(hdwnd, "Выбран зеленый", "Зеленый", MB_OK);
                    break;
            }
            break;
    }
}
//********************************************************************************************
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.08.2019, 14:02
Ответы с готовыми решениями:

Создание диалоговых окон
Доброго времени суток, есть полное непонимание в создание диалогового окна... Как я понимаю, для...

Создание Диалоговых окон в ResEdit для Code::Blocks
Здравствуйте! Скачал данную программку, пытаюсь создать файл, но она выдает вот что: Подскажите...

Редактор диалоговых окон
Как вызвать панель инструментов для диалогового окна?

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

10
2376 / 834 / 317
Регистрация: 10.02.2018
Сообщений: 1,968
16.08.2019, 14:36 2
Лучший ответ Сообщение было отмечено AirL как решение

Решение

Оконная функция для диалога не корректна, по спецификации она всегда должна возвращать значение.
1
2 / 2 / 0
Регистрация: 16.08.2019
Сообщений: 13
16.08.2019, 15:04  [ТС] 3
Спасибо за ответ. Подскажите какой тип она должна возвращать?
0
2376 / 834 / 317
Регистрация: 10.02.2018
Сообщений: 1,968
16.08.2019, 15:09 4
тип? BOOL
У вас функция ничего не возвращает, return только для одной ветки switch сделан.

Return
Typically, the dialog box procedure should return TRUE if it processed the message, and FALSE if it did not. If the dialog box procedure returns FALSE, the dialog manager performs the default dialog operation in response to the message.

If the dialog box procedure processes a message that requires a specific return value, the dialog box procedure should set the desired return value by calling SetWindowLong(hwndDlg, DWL_MSGRESULT, lResult) immediately before returning TRUE. Note that you must call SetWindowLong immediately before returning TRUE; doing so earlier may result in the DWL_MSGRESULT value being overwritten by a nested dialog box message.

...

Remarks
You should use the dialog box procedure only if you use the dialog box class for the dialog box. This is the default class and is used when no explicit class is specified in the dialog box template. Although the dialog box procedure is similar to a window procedure, it must not call the DefWindowProc function to process unwanted messages. Unwanted messages are processed internally by the dialog box window procedure.
1
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
16.08.2019, 15:10 5
AirL, А как Вы думаете, если
C++
1
BOOL CALLBACK DFunc()
?
Сообщение обработано, возвращаем TRUE, не обработано - FALSE. Это первое.
Второе: где default: ? На которое надо вернуть FALSE.
1
2 / 2 / 0
Регистрация: 16.08.2019
Сообщений: 13
16.08.2019, 15:28  [ТС] 6
Код должен быть таким:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
BOOL CALLBACK DFunc(HWND hdwnd, UINT message, WPARAM wParam, LPARAM lParam) {
    switch(message) {
        case WM_COMMAND:
            switch(LOWORD(wParam)) {
                case IDCANCEL:
                    EndDialog(hdwnd, 0);
                    return TRUE;
                case IDC_BUTTON1:
                    MessageBox(hdwnd, "Выбран красный", "Красный", MB_OK);
                    break;
                    return TRUE;
                case IDC_BUTTON2:
                    MessageBox(hdwnd, "Выбран зеленый", "Зеленый", MB_OK);
                    break;
            }
            break;
        default: return FALSE;
    }
}
0
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
16.08.2019, 15:34 7
Лучший ответ Сообщение было отмечено AirL как решение

Решение

C++
1
2
3
4
        default: return FALSE;
    }
    return TRUE;
}
Добавлено через 1 минуту
Во всех case можно написать break;

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
BOOL CALLBACK DFunc(HWND hdwnd, UINT message, WPARAM wParam, LPARAM lParam) {
    switch(message) {
        case WM_COMMAND:
            switch(LOWORD(wParam)) {
                case IDCANCEL:
                    EndDialog(hdwnd, 0);
                    break;
                case IDC_BUTTON1:
                    MessageBox(hdwnd, "Выбран красный", "Красный", MB_OK);
                    break;
                case IDC_BUTTON2:
                    MessageBox(hdwnd, "Выбран зеленый", "Зеленый", MB_OK);
                    break;
            }
            break;
        default: return FALSE;
    }
    return TRUE;
}
1
2 / 2 / 0
Регистрация: 16.08.2019
Сообщений: 13
16.08.2019, 15:40  [ТС] 8
Спасибо.
Почему то поведение не поменялось с новым кодом оконной функции. Отображаются только кнопки, а диалоговое окно не отображается. При нажатии на пользовательскую кнопку программа зависает.
Вот получившийся код оконной функции диалогового окна:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
BOOL CALLBACK DFunc(HWND hdwnd, UINT message, WPARAM wParam, LPARAM lParam) {
    switch(message) {
        case WM_COMMAND:
            switch(LOWORD(wParam)) {
                case IDCANCEL:
                    EndDialog(hdwnd, 0);
                    break;
                case IDC_BUTTON1:
                    MessageBox(hdwnd, "Выбран красный", "Красный", MB_OK);
                    break;
                    return TRUE;
                case IDC_BUTTON2:
                    MessageBox(hdwnd, "Выбран зеленый", "Зеленый", MB_OK);
                    break;
            }
            break;
        default: return FALSE;
    }
    return TRUE;
}
0
2376 / 834 / 317
Регистрация: 10.02.2018
Сообщений: 1,968
16.08.2019, 16:22 9
Отображаются только кнопки, а диалоговое окно не отображается
Нужно посмотреть стили, которые вы проставили в редакторе диалога. Если вы поставили диалогу стиль CHILD, то он показывается без своего заголовка и рамки, интегрируясь в родительское окно.

При нажатии на пользовательскую кнопку программа зависает
Должно появиться модальное окно сообщения, а диалоги должны заблокироваться до нажатия OK в этом новом окне. "Зависает" может означать блокировку диалогов. Может окно с сообщением всё же появляется, но где-то далеко, например, на втором мониторе, где вы его не видите?
1
2 / 2 / 0
Регистрация: 16.08.2019
Сообщений: 13
16.08.2019, 16:51  [ТС] 10
Спасибо за помощь! Создал новый проект, с исправленным кодом оконной функции диалогового проекта - все заработало. Почему то в старом проекте исправление кода не помогло.

Добавлено через 12 минут
Может Visual Studio не коректно работает? Бывает ли такое у Вас?
1
2376 / 834 / 317
Регистрация: 10.02.2018
Сообщений: 1,968
16.08.2019, 17:31 11
Может Visual Studio не коректно работает? Бывает ли такое у Вас?
Бывает, но крайне редко. Чаще бывает, что виновником оказываюсь я сам. Например, можно открыть копию файла из другой версии проекта, править в этом файле что-то и удивляться отсутствию результата при запуске. В коротком имени файла на закладке не видно так сразу полного пути к нему. Или с удалённой отладкой, когда забываешь скопировать свежий скомпилированный файл в нужное место.
1
16.08.2019, 17:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.08.2019, 17:31
Помогаю со студенческими работами здесь

Программа для создания диалоговых окон
Подскажите пожалуйста прогу как в заголовке темы

Где исходный код ресурсов диалоговых окон?
Работаю в обычном WinAPI 2010 Студия, когда создается окно диалога в ресурсах оно отображается в...

MVVM и создание диалоговых окон
Приветствую вновь прибывших. В приложении нужно открыть диалоговое окно пока решил это таким...

Создание диалоговых окон типо next\back
Собстно как это лучше реализовать ?


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

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