Переизбыток: как узнать, когда окно движется? - PullRequest
1 голос
/ 13 октября 2009

У меня проблема с переизбытком, я хотел бы получить обратный вызов, чтобы узнать, когда пользователь перемещает окно моего приложения, и я ничего не нашел в переизбытке.

Моя цель - сделать приложение только под Windows, возможно ли это сделать с помощью MFC, сохраняя мой код перенасыщения?

Заранее спасибо

Ответы [ 4 ]

2 голосов
/ 14 октября 2009

Мне не удалось найти функцию обратного вызова, но вы могли бы сделать это вручную с помощью 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);
1 голос
/ 14 октября 2009

идея от Брюса очень хорошая. я думаю, что нет другого варианта при использовании GLUT. я думаю, что этот сценарий - то, для чего GLUT не был разработан. GLUT - это набор инструментов для OpenGL, который охватывает управление окнами и вводом данных на разных платформах. у него много применений, но почему это должно волновать, когда его окно перетаскивается? я думаю, что если вы (или ваша программа) заботитесь, то вам все равно следует реализовать собственное управление окнами и вводом.

, что приводит меня к вашему второму вопросу. Вы можете использовать OpenGL с MFC (хотя моя рекомендация сильно зависит от того, что вы планируете). тогда вам не следует использовать GLUT, потому что MFC имеет собственный способ обработки ввода, окон, управления событиями, рендеринга / рисования ...

если вы действительно хотите это сделать: http://www.codeproject.com/KB/openGL/OpenGL_MFC_AppWizard.aspx

0 голосов
/ 22 декабря 2009

GLUT на самом деле довольно ограничен и не предоставляет все события окна клиенту. Тем не менее, он предоставляет множество кодовых табличек для WGL (в Windows) и GLX (в X11), которые, вероятно, не стоит переписывать.

Когда у меня был хобби-проект, в котором использовалась GL, и были некоторые события, которые я не мог обработать через GLUT, я делал форк с открытым исходным кодом freeglut . То есть загрузите tarball, отредактируйте библиотечный цикл WindowProc (Windows) или XGetEvent () (на X) и просто добавьте недостающие обратные вызовы в библиотеку.

Вы будете зависеть от своих собственных модификаций GLUT, но это сработает, и вам не нужно будет писать столько кода, как если бы вы работали непосредственно с WGL или GLX.

Вы, вероятно, захотите связать его статически, чтобы он не конфликтовал ни с каким другим freeglut.

0 голосов
/ 22 декабря 2009

Вы можете попробовать использовать функцию glutTimerFunction для периодического вызова примера функции Брюса. Он должен принимать целое число в качестве параметра, используемого для идентификации источника запроса обратного вызова. Функция glutTimerFunction также предназначена для вызова только один раз, затем она удаляет себя. Тем не менее, он может запланировать вызов на себя. Я столкнулся с этой проблемой, используя PyOpenGL, поэтому я не собираюсь проходить через агонию C, заставляя это скомпилировать. От щедрого примера Брюса изменилось. Очевидно, что взломать, но лучше, чем слом.

<code>
int main(void)
{
   ...
   glutTimerFunc(0, window_change, 0);</p>

<p>}</p>

<p>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);
   ...</p>

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

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

...