Невозможно обрабатывать полный экран в OpenGL через класс окна [закрыто]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Невозможно обрабатывать полный экран в OpenGL через класс окна [закрыто]

Сообщение Anonymous »

Я пытаюсь создать класс Window , который может позаботиться о создании окна с основными функциями, такими как переключение полноэкранного и привязки ESC, чтобы закрыть окно и windo .
Я могу выйти с ESC , но когда я нажимаю f11 , я продолжаю получать исключение доступа к 0x001d6f6b в idk.exe: 0xc0000005: доступ Расположение чтения нарушений 0xcccccf78. в строке 16 в window.cpp , не уверен, почему это происходит. Вызов, и я вижу действительные значения, но как только GLFWGETWINDOWPOS (_Window, & _WindowedMode.xpos, & _windowedmode.ypos); Я продолжаю получать такую ​​же ошибку, и я застрял.
window.h
#pragma once
#include
#include
#include
#include "Vertex.h"

class Window
{
public:
std::string _title;
bool _fullscreen;
GLFWwindow* _window;
WindowProperties _windowedMode;
float _aspectRatio;

Window(const std::string& title, WindowProperties winProp, bool fullscreen);
~Window();

static void FrameBufferCallback(GLFWwindow* window, int width, int height);
static void KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods);
bool init();

GLFWwindow* getWindow() const { return _window; }
void setKeyCallback(GLFWkeyfun callback) { glfwSetKeyCallback(_window, callback); }
void setScrollCallback(GLFWscrollfun callback) { glfwSetScrollCallback(_window, callback); }
void setCursorPositionCallback(GLFWcursorposfun callback) { glfwSetCursorPosCallback(_window, callback); }

private:
void toggleFullScreen();
void key_call_back(GLFWwindow* window, int key, int scancode, int action, int mods);
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
};
< /code>
window.cpp:
#include "Window.h"

Window::Window(const std::string& title, WindowProperties winProp = { 100, 100, 920, 900 }, bool fullscreen = false)
: _title(title),
_windowedMode(winProp),
_fullscreen(fullscreen),
_window(nullptr),
_aspectRatio(float(winProp.width) / float(winProp.height)) {}

void Window::toggleFullScreen()
{
if (!_fullscreen)
{
// Switch to fullscreen mode
glfwGetWindowPos(_window, &_windowedMode.xpos, &_windowedMode.ypos);
glfwGetWindowSize(_window, &_windowedMode.width, &_windowedMode.height);

GLFWmonitor* monitor = glfwGetPrimaryMonitor();
const GLFWvidmode* mode = glfwGetVideoMode(monitor);

glfwSetWindowMonitor(_window, monitor, 0, 0, mode->width, mode->height, mode->refreshRate);
_fullscreen = true; // Update the flag after switching
}
else
{
// Switch back to windowed mode
glfwSetWindowMonitor(_window, nullptr, _windowedMode.xpos, _windowedMode.ypos,
_windowedMode.width, _windowedMode.height, 0);
_fullscreen = false; // Update the flag after switching
}
}

void Window::key_call_back(GLFWwindow* window, int key, int scancode, int action, int mods)
{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);

// Add debouncing for F11 key
static bool f11Pressed = false;
if (glfwGetKey(window, GLFW_KEY_F11) == GLFW_PRESS)
{
if (!f11Pressed)
{
toggleFullScreen();
f11Pressed = true;
}
}
else
{
f11Pressed = false;
}
}

void Window::framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
_aspectRatio = float(width) / float(height);
}

void Window::KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
Window* windowInstance = static_cast(glfwGetWindowUserPointer(window));
if (windowInstance) {
windowInstance->key_call_back(window, key, scancode, action, mods);
}
}

void Window::FrameBufferCallback(GLFWwindow* window, int width, int height) {
// Retrieve the instance of TestBatchRendering
Window* instance = static_cast(glfwGetWindowUserPointer(window));
if (instance) {
instance->framebuffer_size_callback(window, width, height); // Call the member function
}
}

bool Window::init()
{
if (!glfwInit())
{
std::cerr

Подробнее здесь: https://stackoverflow.com/questions/793 ... ndow-class
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»