Невозможно освободить контекст устройства, HWND и не может отменить регистрацию класса Windows (OpenGL) —

Я следую за http://nehe.gamedev.net/tutorial/creating_an_opengl_window_(win32)/13001/ Учебник по OpenGL, и я получил код от этой работы. Сейчас я пытаюсь организовать вещи, используя несколько классов. Когда я создавал этот класс, я не смог выпустить «Контекст устройства», HWND и не смог отменить регистрацию класса Windows. Код ниже является кодом, используемым для проверки, могут ли они быть выпущены или нет:

GLvoid KillGLWindow(GLvoid){
if (fullscreen){
ChangeDisplaySettings(NULL, 0);
ShowCursor(true);
}
if (hRC){
if (!wglMakeCurrent(NULL, NULL)){
MessageBox(NULL, "Release of DC and RC failed", "Shutdown error", MB_OK | MB_ICONINFORMATION);
}
if (!wglDeleteContext(hRC)){
MessageBox(NULL, "Release of RC failed", "Shutdown error", MB_OK | MB_ICONEXCLAMATION);
}
hRC = NULL;
}
if (hDC && !ReleaseDC(hWnd, hDC)){
MessageBox(NULL, "Release of DC failed", "Shutdown error", MB_OK | MB_ICONINFORMATION);
hDC = NULL;
}
if (hWnd && !DestroyWindow(hWnd)){
MessageBox(NULL, "Release of hWnd failed", "Shutdown error", MB_OK | MB_ICONINFORMATION);
hWnd = NULL;
}
if (!UnregisterClass("OpenGL", hInstance)){
MessageBox(NULL, "Could not unregister window class", "Shutdown error", MB_OK | MB_ICONINFORMATION);
hInstance = NULL;
}
}

(Последние три, если выстрелили)

Код, который я перемещал, вызвавший эти ошибки, является кодом, определяющим код в функции WinMain. Это единственный код, который я изменил.

else{
if (active){

if (testKey.isEsc()){
done = true;
}
if (testKey.isA()){
KillGLWindow();
}
else{
DrawGLScene();
SwapBuffers(hDC);
}
}
if (testKey.isF1()){
//Keys::keys[VK_F1] = false;
KillGLWindow();
fullscreen = !fullscreen;
if (!CreateGLWindow("XcoxGL", 640, 480, 16, fullscreen)){
return 0;
}
}

Что я изменил, так это часть testKey.THING. testKey инициируется в основном классе строкой

Keys testKey

Keys.cpp выглядит так:

bool Keys::keys[256] = { false };

bool Keys::isA(){
if (&keys[0x41]){
return true;
}
else{
return false;
}
}

bool Keys::isF1(){
if (&keys[VK_F1]){
return true;
}
else{
return false;
}
}

bool Keys::isEsc(){
if (&keys[VK_ESCAPE]){
return true;
}
else{
return false;
}
}

И, наконец, Keys.h выглядит так:

#pragma once
class Keys{
public:
static bool keys[256];
bool isA();

bool isF1();

bool isEsc();
};

Я могу опубликовать полный код, если хотите, но способ создания DC и HWND показан и объяснен в учебнике, который я выложил выше.

Кто-нибудь знает, что в моем Ключевом коде приводит к тому, что мои DC и HWND не могут выпустить?

1

Решение

Вероятно, KillGLWindow вызывается более одного раза, и это не совсем правильно, попробуйте это:

GLvoid KillGLWindow(GLvoid){
if (fullscreen){
ChangeDisplaySettings(NULL, 0);
ShowCursor(true);
}
if (hRC){
if (!wglMakeCurrent(NULL, NULL)){
MessageBox(NULL, "Release of DC and RC failed", "Shutdown error", MB_OK | MB_ICONINFORMATION);
}
if (!wglDeleteContext(hRC)){
MessageBox(NULL, "Release of RC failed", "Shutdown error", MB_OK | MB_ICONEXCLAMATION);
}
}
hRC = NULL;
if (hDC && !ReleaseDC(hWnd, hDC)){
MessageBox(NULL, "Release of DC failed", "Shutdown error", MB_OK | MB_ICONINFORMATION);
}
hDC = NULL;
if (hWnd && !DestroyWindow(hWnd)){
MessageBox(NULL, "Release of hWnd failed", "Shutdown error", MB_OK | MB_ICONINFORMATION);
}
hWnd = NULL;
if (hInstance && !UnregisterClass("OpenGL", hInstance)){
MessageBox(NULL, "Could not unregister window class", "Shutdown error", MB_OK | MB_ICONINFORMATION);
}
hInstance = NULL;
}
0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector