3

你知道如何在 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) 创建和显示的。

目前有一个答案表明这无法完成,但我想从可靠的来源确认这一点。

谢谢,

4

2 回答 2

2

我花了几个小时测试和试验不同的解决方案,但最终奏效的是:

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

HWND win_handle = FindWindow(0, L"Stackoverflow");
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(使用 GUI 构建应用程序的跨平台 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("Stackoverflow");

  glutDisplayFunc(displayGL);
  initializeGL();

  /* Maximize window using Windows API */

  HWND win_handle = FindWindow(0, L"Stackoverflow");
  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;
}
于 2015-01-03T17:59:07.270 回答
1

据我所知,没有平台独立的方式来最大化窗口的过剩。一种可能的解决方法是忘记最大化窗口,而是将其大小设置为显示器的大小。也就是说,使用glutGet(GLUT_SCREEN_WIDTH)glutGet(GLUT_SCREEN_HEIGHT)获取显示的大小,然后使用glutInitWindowSize.

于 2014-12-17T20:44:53.490 回答