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);

ドキュメント(here)には、この関数が「指定されたウィンドウの表示状態を設定する」と記載されているためです。しかし、まだ表示されていないのは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

私の知る限り、過剰なウィンドウを最大化するプラットフォームに依存しない方法はありません。考えられる回避策の 1 つは、ウィンドウを最大化するのを忘れて、そのサイズをディスプレイのサイズに設定することです。つまり、 と を使用glutGet(GLUT_SCREEN_WIDTH)glutGet(GLUT_SCREEN_HEIGHT)てディスプレイのサイズを取得し、それらの値を で使用しますglutInitWindowSize

于 2014-12-17T20:44:53.490 に答える