簡體   English   中英

糊塗:如何知道窗口何時移動?

[英]Glut: how to know when the window is moving?

我有一個過剩的問題,我想有一個回調來知道用戶何時移動我的應用程序的窗口,而我在過剩的東西中沒有發現任何東西。

我的目標是僅在Windows上創建應用程序,使用MFC保留我的glut代碼是否可以做到這一點?

提前致謝

我找不到回調函數,但是您可以使用glutGet手動glutGet

int glutGet(GLenum state);

您可能會做的一個例子是:

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

如果將其從初始位置移開,則將返回true。 如果要查看自上次檢查后是否已移動,請嘗試:

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

您可以使用以下功能來設置窗口位置: glutPositionWindow

void glutPositionWindow(int x, int y);

布魯斯的想法非常好。 我認為使用GLUT時沒有其他選擇。 我認為這種情況不是為GLUT開發的。 GLUT是OpenGL的工具包,它跨平台包裝了窗口和輸入管理。 它有很多用途,但是當拖動窗口時為什么要關心它呢? 我認為,如果您(或您的程序)在乎,那么無論如何您應該實現自己的窗口和輸入管理。

這使我想到了第二個問題。 您可以將OpenGL與MFC一起使用(盡管我的建議強烈取決於您的計划)。 那么,您不應該使用GLUT,因為MFC有其自身的處理輸入,窗口,事件管理,渲染/繪圖的方式...

如果您確實要這樣做: http : //www.codeproject.com/KB/openGL/OpenGL_MFC_AppWizard.aspx

您可以嘗試使用glutTimerFunction定期調用Bruce的示例函數。 它必須使用整數作為用於標識回調請求源的參數。 glutTimerFunction還設計為僅被調用一次,然后將其刪除。 但是,它可以安排自己的呼叫。 我使用PyOpenGL遇到了這個問題,所以我不會經歷將其編譯的C痛苦。 從布魯斯的慷慨例子改寫而來。 顯然是hack,但比報廢更好。


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

GLUT實際上是相當有限的,並且不會向客戶端公開所有窗口事件。 但是,它確實為WGL(在Windows上)和GLX(在X11上)提供了許多鍋爐代碼板,可能不值得重寫。

當我有一個使用GL的業余項目時,並且某些事件我無法通過GLUT處理,我所做的就是派生開源freeglut 也就是說,下載壓縮包,並編輯庫的WindowProc(Windows)或XGetEvent()循環(在X上),然后只需將缺少的回調添加到庫中即可。

您將依賴於自己的GLUT修改,但是它將起作用,並且不必像直接針對WGL或GLX那樣編寫太多的樣板代碼。

您可能需要靜態鏈接,這樣它就不會與任何其他freeglut沖突。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM