2

ユーザーがいつアプリケーションのウィンドウを移動しているかを知るためのコールバックが必要ですが、過剰に何も見つかりませんでした。

私の目標は、Windows でのみアプリケーションを作成することです。MFC で大量のコードを保持してこれを行うことは可能ですか?

前もって感謝します

4

4 に答える 4

2

I couldn't find a call back function but you could do it by hand with glutGet:

int glutGet(GLenum state);

An example of what you might do is:

bool window_change(void)
{
  int init_x = glutGet(GLUT_INIT_WINDOW_X);
  int init_y = glutGet(GLUT_INIT_WINDOW_Y);
  int pos_x = glutGet(GLUT_WINDOW_X);
  int pos_y = glutGet(GLUT_WINDOW_Y);

  return (init_x != pos_x || init_y != pos_y);
}

This will return true if it's moved from it's initial spot. If you want to see if it's moved since the last check, try:

bool window_change(void)
{
  static int init_x = glutGet(GLUT_INIT_WINDOW_X);
  static int init_y = glutGet(GLUT_INIT_WINDOW_Y);
  int pos_x = glutGet(GLUT_WINDOW_X);
  int pos_y = glutGet(GLUT_WINDOW_Y);

  bool result = init_x != pos_x || init_y != pos_y;

  init_x = pos_x; 
  init_y = pos_y;

  return result;
}

You can set the window position by using the function: glutPositionWindow

void glutPositionWindow(int x, int y);
于 2009-10-13T22:36:45.703 に答える
1

ブルースのアイデアはとても良いです。GLUTを使用している間、別のオプションはないと思います。このシナリオは、GLUT が開発されたものではないと思います。GLUT は OpenGL 用のツールキットで、プラットフォーム全体でウィンドウと入力の管理をラップします。多くの用途がありますが、ウィンドウがドラッグされたときに、なぜ気にする必要があるのでしょうか? あなた(またはあなたのプログラム)が気になるなら、とにかく独自のウィンドウおよび入力管理を実装する必要があると思います。

それがあなたの2番目の質問につながります。MFC で OpenGL を使用できます (ただし、私の推奨事項は、何を計画しているかによって大きく異なります)。MFCには入力、ウィンドウ、イベント管理、レンダリング/描画を処理する独自の方法があるため、GLUTを使用しないでください...

本当にやりたい場合: http://www.codeproject.com/KB/openGL/OpenGL_MFC_AppWizard.aspx

于 2009-10-13T23:49:02.870 に答える
0

Bruce のサンプル関数を定期的に呼び出すために、glutTimerFunction を使用してみてください。コールバック要求のソースを識別するために使用されるパラメーターとして整数を取る必要があります。glutTimerFunction も 1 回だけ呼び出されるように設計されており、その後、自身を削除します。ただし、それ自体でコールをスケジュールできます。私は PyOpenGL を使用してこの問題に遭遇したので、これをコンパイルする C の苦痛を経験するつもりはありません。ブルースの寛大な例から変更されました。明らかにハックですが、廃棄するよりはましです。


int main(void)
{
   ...
   glutTimerFunc(0, window_change, 0);

}

void window_change(int id) { int init_x = glutGet(GLUT_INIT_WINDOW_X); int init_y = glutGet(GLUT_INIT_WINDOW_Y); int pos_x = glutGet(GLUT_WINDOW_X); int pos_y = glutGet(GLUT_WINDOW_Y); ...

/* call back again after 1 second has passed */ glutTimerFunc (1000, window_change, id); }

http://www.opengl.org/resources/faq/technical/glut.htm

于 2009-12-22T03:52:25.823 に答える
0

GLUT は実際にはかなり制限されており、すべてのウィンドウ イベントがクライアントに公開されるわけではありません。ただし、WGL (Windows の場合) および GLX (X11 の場合) には、おそらく書き直す価値のない多くのボイラー コード プレートが提供されます。

GL を使用する趣味のプロジェクトがあり、GLUT では処理できない特定のイベントがあったとき、私が行ったことは、オープン ソースのfreeglutをフォークすることでした。つまり、tarball をダウンロードし、ライブラリの WindowProc (Windows) または XGetEvent() ループ (X の場合) を編集して、不足しているコールバックをライブラリに追加するだけです。

独自の GLUT の変更に依存することになりますが、それは機能し、WGL や GLX を直接ターゲットにする場合ほど多くのボイラープレート コードを記述する必要はありません。

他の freeglut と競合しないように、静的にリンクすることをお勧めします。

于 2009-12-22T04:26:46.353 に答える