Как развернуть окно с помощью GLUT

Знаете ли вы, как я могу создать максимизированное окно в GLUT? (развернуто, не в полноэкранном режиме)

Я искал решение в Google, но не смог найти его, поэтому я начал пытаться сделать это с помощью Windows API, даже если мне позже потребуется решить его и для Linux:(

Вот что я попробовал:

wchar_t* wString = new wchar_t[4096];
MultiByteToWideChar(CP_ACP, 0, "GLUT", -1, wString, 4096);
HWND vWnd = FindWindow(wString, NULL);
long currentStyle = GetWindowLong(vWnd, GWL_STYLE);
SetWindowLong(vWnd, GWL_STYLE, currentStyle | WS_MAXIMIZE);

Но это не меняет состояние окна. Я также попробовал это:

ShowWindow(vWnd, WS_MAXIMIZE);

Потому что в документации ( здесь) говорится, что эта функция: "Устанавливает состояние показа указанного окна". Но я думаю, что это только для Windows, которые еще не видны, а мой был создан и показан с помощью GLUT (glutCreateWindow).

В настоящее время есть ответ, в котором говорится, что это невозможно, но я хотел бы получить подтверждение от надежного источника.

Спасибо,

2 ответа

Решение

Я провел несколько часов, тестируя и экспериментируя с различными решениями, но в итоге получилось:

/* Maximize window using Windows API after glutCreateWindow() has been called */

HWND win_handle = FindWindow(0, L"Stackru");
if (!win_handle)
{
    printf("!!! Failed FindWindow\n");
    return -1;
}

SetWindowLong(win_handle, GWL_STYLE, (GetWindowLong(win_handle, GWL_STYLE) | WS_MAXIMIZE));
ShowWindowAsync(win_handle, SW_SHOWMAXIMIZED);

/* Activate GLUT main loop */

glutMainLoop();

Это довольно просто, и я просто хочу подчеркнуть, что вы можете только позвонить glutMainLoop() в конце.

Теперь, так как вы ищете кроссплатформенное решение, я должен сказать, что этот подход - ужасная идея. Позвольте мне поделиться несколькими другими подходами:

  • Подумайте об использовании Qt (кроссплатформенный фреймворк C++ для сборки приложений с графическим интерфейсом). Вот пример;

  • Рассмотрите возможность написания кода отдельной платформы для получения текущего разрешения монитора. когда glutInitWindowSize() вызывается, вы можете передать правильные значения вместо попытки взломать окно, чтобы максимизировать его;

Вот исходный код минимального, полного и проверяемого примера (для Windows):

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <GL/glut.h>

int WIDTH = 480;
int HEIGHT = 480;

void initializeGL()
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    GLfloat aspect = (GLfloat) WIDTH / HEIGHT;
    gluPerspective(45, aspect, 1.0f, 500.0f);
    glViewport(0, 0, WIDTH, HEIGHT);

    glMatrixMode(GL_MODELVIEW);
    glShadeModel( GL_SMOOTH );
    glClearDepth( 1.0f );
    glEnable( GL_DEPTH_TEST );
    glDepthFunc( GL_LEQUAL );
    glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
    glClearColor(0.0, 0.0, 0.0, 1.0);
}

void displayGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(0.0f,0.0f,-3.0f);

    glBegin(GL_TRIANGLES);
        glColor3f(0.0f,0.0f,1.0f);
        glVertex3f( 0.0f, 1.0f, 0.0f);
        glColor3f(0.0f,1.0f,0.0f);
        glVertex3f(-1.0f,-1.0f, 0.0f);
        glColor3f(1.0f,0.0f,0.0f);
        glVertex3f( 1.0f,-1.0f, 0.0f);
    glEnd();

  glutSwapBuffers();
}

int main(int argc, char* argv[])
{
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
  glutInitWindowSize(640, 480);
  glutCreateWindow("Stackru");

  glutDisplayFunc(displayGL);
  initializeGL();

  /* Maximize window using Windows API */

  HWND win_handle = FindWindow(0, L"Stackru");
  if (!win_handle)
  {
      printf("!!! Failed FindWindow\n");
      return -1;
  }

  SetWindowLong(win_handle, GWL_STYLE, (GetWindowLong(win_handle, GWL_STYLE) | WS_MAXIMIZE));
  ShowWindowAsync(win_handle, SW_SHOWMAXIMIZED);

  /* Activate GLUT main loop */

  glutMainLoop();

  return 0;
}

Насколько я знаю, нет независимого от платформы способа максимизировать окна от переизбытка. Одним из возможных способов обойти это было бы забыть развернуть окно до максимума и вместо этого установить его размер в соответствии с размером дисплея. То есть использовать glutGet(GLUT_SCREEN_WIDTH) а также glutGet(GLUT_SCREEN_HEIGHT) чтобы получить размер дисплея, а затем использовать эти значения в glutInitWindowSize,

Другие вопросы по тегам