您知道如何在GLUT中创建最大化窗口吗? (最大化,不是全屏)
我在谷歌搜索过该解决方案,但我找不到它,所以我开始尝试使用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);
但它并没有改变Window的状态。我也试过这个:
ShowWindow(vWnd, WS_MAXIMIZE);
因为文档(here)声明此函数:“设置指定窗口的显示状态”。但我想只有Windows才能看到,我的使用GLUT(glutCreateWindow
)创建和显示。
目前有一个答案表明无法做到这一点,但我希望从可信的来源得到确认。
谢谢,
答案 0 :(得分: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(一个跨平台的C ++框架来构建带有GUI的应用程序)。 Here's an example;
考虑编写单独的平台代码以检索当前的监视器分辨率。调用glutInitWindowSize()
时,您可以传递正确的值,而不是尝试破解窗口以使其最大化;
这是minimal, complete and verifiable example(适用于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;
}
答案 1 :(得分:0)
据我所知,没有独立于平台的方法来最大化来自过剩的窗口。一种可能的解决方法是忘记最大化窗口,而是将其大小设置为显示的大小。也就是说,使用glutGet(GLUT_SCREEN_WIDTH)
和glutGet(GLUT_SCREEN_HEIGHT)
来获取显示的大小,然后在glutInitWindowSize
中使用这些值。