Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
 Аватар для Merovingean
5 / 5 / 2
Регистрация: 14.12.2013
Сообщений: 67
1

Некорректное отображение диалогового окна. Win32API, OpenGL

19.03.2014, 21:21. Показов 1647. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер.

Я пытаюсь сделать так, чтобы по нажатии кнопки меню появлялось модальное диалоговое окно.
На данном этапе, содержащее хотя бы кнопки "Ок" и "Отмена".
Работаю в VS13. Уже раскаялся, что не в Qt.
Как водится, в ресурсах создаю диалоговое окно, указываю ID и больше ничего не трогаю.
Пишу соответствующий код в обработчик событий и пишу функцию диалогового окна.
В итоге получаю следующее:
Некорректное отображение диалогового окна. Win32API, OpenGL


Подскажите, пожалуйста, где я делаю ошибку.
Пытался искать в старых темах - не нашел.

Значимая часть программы:
Строка 84 - вызов диалога.
Кликните здесь для просмотра всего текста
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
HWND  g_hWnd = NULL;
HDC   g_hDC = NULL;
HGLRC g_hRC = NULL;
HINSTANCE hInst;
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK Options(HWND, UINT, WPARAM, LPARAM);
void Init(void);
void ShutDown(void);
//------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR     lpCmdLine,
    int       nCmdShow)
{
    hInst = hInstance;
    WNDCLASSEX winClass;
    MSG        uMsg;
 
    memset(&uMsg, 0, sizeof(uMsg));
 
    winClass.lpszClassName = "MY_WINDOWS_CLASS";
    winClass.cbSize = sizeof(WNDCLASSEX);
    winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    winClass.lpfnWndProc = WindowProc;
    winClass.hInstance = hInstance;
    winClass.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_OPENGL_ICON);
    winClass.hIconSm = LoadIcon(hInstance, (LPCTSTR)IDI_OPENGL_ICON);
    winClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    winClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    winClass.lpszMenuName = NULL;
    winClass.cbClsExtra = 0;
    winClass.cbWndExtra = 0;
 
    if (!RegisterClassEx(&winClass))
        return E_FAIL;
 
    HMENU hMenu = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU1));
    g_hWnd = CreateWindowEx(NULL, "MY_WINDOWS_CLASS",
        "WIN32 OGL DMp",
        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
        600, 400, 1200, 800, NULL, hMenu, hInstance, NULL);
 
    if (g_hWnd == NULL)
        return E_FAIL;
 
    Randomize();
    ShowWindow(g_hWnd, nCmdShow);
    UpdateWindow(g_hWnd);
 
    Init();
 
    while (uMsg.message != WM_QUIT)
    {
        if (PeekMessage(&uMsg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&uMsg);
            DispatchMessage(&uMsg);
        }
        else
            Render();
    }
 
    fine.close();
    ShutDown();
 
    UnregisterClass("MY_WINDOWS_CLASS", winClass.hInstance);
 
    return uMsg.wParam;
}
//------------------------------------------------------------------------------
LRESULT CALLBACK WindowProc(HWND   hWnd,
    UINT   msg,
    WPARAM wParam,
    LPARAM lParam)
{
    switch (msg)
    {
case WM_COMMAND:
            switch (LOWORD(wParam))
            {
                case ID_OPT: // Нажатие кнопки
                    DialogBox(hInst, MAKEINTRESOURCE(IDD_OPTS), g_hWnd, Options);
                    break;
            default:
                break;
            }
            break;
case WM_SIZE:
        {
            int nWidth = LOWORD(lParam);        // Ширина
            int nHeight = HIWORD(lParam);       // Высота
            glViewport(0, 0, nWidth, nHeight);  // Вьюпорт OpenGL
 
            glMatrixMode(GL_PROJECTION);        // Матрица проекции
            glLoadIdentity();                   // Сбрасываем
 
            // Устанавливаем перспективу OpenGL (угол взгляда, аспект ширины и высоты, ближайшее и дальнее отсечение взгляда)
            gluPerspective(45.0, (GLdouble)nWidth / (GLdouble)nHeight, 0.1, 5000.0);
        }
            break;
        case WM_PAINT:
            Render();
            break;
            // Если закрыли окно - выходим 
        case WM_DESTROY:
        case WM_CLOSE:
            PostQuitMessage(0);
            break;
 
        default:
            return DefWindowProc(hWnd, msg, wParam, lParam);
            break;
    }
 
    return 0;
}
//------------------------------------------------------------------------------
INT_PTR CALLBACK Options(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    UpdateWindow(hDlg);
    switch (message)
    {
    case WM_COMMAND:
 
        if (wParam == IDOK || wParam == IDCANCEL)
            return EndDialog(hDlg, 0);
    default:
        break;
    }
}
//------------------------------------------------------------------------------
//  Инициализация OGL
void Init(void)
{
    PIXELFORMATDESCRIPTOR pfd;
    memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
 
    pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
    pfd.nVersion = 1;
    pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 16;
    pfd.cDepthBits = 16;
 
    g_hDC = GetDC(g_hWnd);
    GLuint iPixelFormat = ChoosePixelFormat(g_hDC, &pfd);
 
    if (iPixelFormat != 0)
    {
        PIXELFORMATDESCRIPTOR bestMatch_pfd;
        DescribePixelFormat(g_hDC, iPixelFormat, sizeof(pfd), &bestMatch_pfd);
 
        if (bestMatch_pfd.cDepthBits < pfd.cDepthBits)
        {
            return;
        }
 
        if (SetPixelFormat(g_hDC, iPixelFormat, &pfd) == FALSE)
        {
            DWORD dwErrorCode = GetLastError();
            return;
        }
    }
    else
    {
        DWORD dwErrorCode = GetLastError();
        return;
    }
 
    g_hRC = wglCreateContext(g_hDC);
    wglMakeCurrent(g_hDC, g_hRC);
 
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Цвет вьюпорта OpenGL
 
    glMatrixMode(GL_PROJECTION); // Матрица проекции
    glLoadIdentity();
    gluPerspective(45.0f, 1200.0f / 800.0f, 0.1f, 5000.0f); // Перспектива
 
    glCullFace(GL_BACK);
    glEnable(GL_CULL_FACE);
}
//------------------------------------------------------------------------------
// Корректное выключение
void ShutDown(void)
{
    if (g_hRC != NULL)
    {
        wglMakeCurrent(NULL, NULL);
        wglDeleteContext(g_hRC);
        g_hRC = NULL;
    }
 
    if (g_hDC != NULL)
    {
        ReleaseDC(g_hWnd, g_hDC);
        g_hDC = NULL;
    }
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.03.2014, 21:21
Ответы с готовыми решениями:

Неправильное отображение диалогового окна
Как исправить это?

Некорректное отображение блока C++ OpenGL (Debian 9)
Установлена библиотека libsfml-dev 2.4.1 Написал программу по первому примеру с видео на YouTube (Создание 3d игр на C++: Minecraft) ...

Как присвоить переменную одного диалогового окна к переменной другого диалогового окна? (ООП)
Вот у меня есть результат вычисления и я его присваиваю переменной в первом диалоговом окне, но я хочу выдать результат во второе...

4
Модератор
Эксперт С++
 Аватар для zss
13732 / 10928 / 6483
Регистрация: 18.12.2011
Сообщений: 29,167
19.03.2014, 21:36 2
Попробуйте так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
INT_PTR CALLBACK Options(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    //UNREFERENCED_PARAMETER(lParam);
    //UpdateWindow(hDlg);
    switch (message)
    {
     case WM_COMMAND:
 
        if (wParam == IDOK || wParam == IDCANCEL)
            EndDialog(hDlg, 0);
            return 1;
    default:
        break;
    }
    return 0;
}
1
 Аватар для Merovingean
5 / 5 / 2
Регистрация: 14.12.2013
Сообщений: 67
19.03.2014, 21:44  [ТС] 3
Цитата Сообщение от zss Посмотреть сообщение
Попробуйте так
К сожалению, результат неизменен.

Еще я могу свести свою беду к этой беде:
Не создаются диалоговые окна
Но я не понимаю, где вызывать ValidateRect, о которой говорил автор в последнем сообщении.
Эта функция должна принимать идентификатор окна, а hDlg доступен только из функции Options. А вызов ValidateRect внутри функции Options не дает результата.

Не по теме:

Пардон, что опять написал не в ту тему.

0
Модератор
Эксперт С++
 Аватар для zss
13732 / 10928 / 6483
Регистрация: 18.12.2011
Сообщений: 29,167
19.03.2014, 21:58 4
Лучший ответ Сообщение было отмечено Merovingean как решение

Решение

У меня есть тестовый пример содержащий только диалог (прилагаю).
Попробуйте, может найдете разницу.
2
 Аватар для Merovingean
5 / 5 / 2
Регистрация: 14.12.2013
Сообщений: 67
19.03.2014, 22:57  [ТС] 5
Цитата Сообщение от zss Посмотреть сообщение
Попробуйте, может найдете разницу.
Спасибо. Не помогло, но натолкнуло на мысль.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
INT_PTR CALLBACK Options(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;
 
    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}


Теперь функция выглядит так.
Окно теперь выглядит нормально.
Но при нажатии на кнопку меню окно не выпадает.
Оно появляется только после того, как я нажму Alt.
Вероятно, для корректного появления нужно сказать, что главное окно не активно, а активно диалоговое.
Вы могли бы подсказать, как это сделать?

Добавлено через 7 минут
Точнее, помогло.
Не сразу осознал, что заметил отсутствие INITDIALOG только после вашего примера.

Добавлено через 35 минут
Очень странно.
В меню ресурсов, в панели свойств диалогового окна, переключил флажок "Видимое" в состояние True.
Теперь окно активируется автоматически. Все работает, как нужно.
Только не пойму, почему в вашем проекте и в стандартной заготовке MSVS этот флажок не стоит, но д.окна отображаются корректно.

Спасибо.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.03.2014, 22:57
Помогаю со студенческими работами здесь

Некорректное отображение окна
Добрый день . при создание экземпляра окна , задаю стиль со всем нужными мне параметрами , но окно отображается не корректно, не...

RibbonWindow: некорректное отображение окна
Здравствуйте. Есть проблема с отображением окна при использование RIBBON контроллов. -использую стандартную, мс-овскую dll...

Некорректное отображение имени и класса окна в ListBox
Доброго времени суток. Подскажите, пожалуйста, решение следующей проблемы (поиск в google не дал результатов или я не умею гуглить:));...

Некорректное отображение окна в развёрнутом и свёрнутом состояниях
Выкладываю вам проект и стиль (для тех, кто боится запускать проект). Проблема состоит в том, что при разворачивании стилизированного...

Удержание окна с текущими введенными значениями после диалогового окна (с предупреждением)
Здравствуйте, есть маленькая задачка. Форма добавления ТС, открывается с основной формы. Нужно заполнить все поля и нажать кнопку, если...


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

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

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Неблокируемый стек в C++26: реализуем простой сборщик мусора
stackOverflow 02.03.2025
Многопоточные приложения требуют надежных и производительных структур данных, способных эффективно работать в условиях конкурентного доступа. Неблокируемые структуры данных представляют собой особый. . .
Шаблон REQ/REP в ZeroMQ: сверхбыстрый обмен сообщениями в C++ и Python
stackOverflow 02.03.2025
Построение высоконагруженных распределенных систем требует надежного и производительного механизма обмена сообщениями. ZeroMQ выделяется среди прочих решений своей невероятной скоростью работы и. . .
Нестандартные приемы работы с итераторами в C++
stackOverflow 02.03.2025
Итераторы - один из краеугольных камней C++, предоставляющий универсальный механизм обхода и манипуляции данными в контейнерах. Появившись как замена небезопасным указателям, они эволюционировали от. . .
Лексический анализ и регулярные выражения в C++26
stackOverflow 02.03.2025
Лексический анализ - ядро любого компилятора и инструмента обработки текста. Каждый программист сталкивается с задачами парсинга строк, обработки файлов конфигурации или анализа пользовательского. . .
Подробно о std::mdspan в C++23
stackOverflow 02.03.2025
Работа с многомерными массивами данных традиционно была одной из сложных задач в C++. Программистам приходилось создавать собственные абстракции или использовать сторонние библиотеки для эффективной. . .
Колмогоровская сложность в C++: Путь к совершенному коду
stackOverflow 02.03.2025
Абстрактная математическая теория Колмогорова стала мощным средством оценки и улучшения программного кода. Сложность алгоритма - не только в его вычислительной эффективности, но и в том, насколько. . .
Изменения в C# 14
stackOverflow 02.03.2025
Одно из самых значимых изменений в C# 14 - поддержка коллекционных выражений, которые позволяют создавать и инициализировать коллекции с помощью нового лаконичного синтаксиса. Это нововведение. . .
Разработка кроссплатформен­­­­ного мобильного приложения для iOS/Android на C++
bytestream 02.03.2025
C++ как язык программирования высокого уровня с прямым доступом к аппаратным ресурсам позволяет создавать приложения, работающие одинаково быстро как на iOS, так и на Android устройствах. Ни для кого. . .
Аутентификация/авторизация на Golang
bytestream 02.03.2025
Go предлагает множество возможностей для создания надежных систем аутентификации. Встроенные криптографические пакеты, высокая производительность и простота параллельной обработки запросов делают его. . .
Нововведения TypeScript 5.8
bytestream 02.03.2025
TypeScript 5. 8 приносит много возможностей и оптимизаций, которые существенно расширяют границы типобезопасного программирования на JavaScript. Эта версия включает ряд значительных улучшений в работе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru