From: <ipe...@it...> - 2012-07-02 08:44:14
|
Hi LJ, i wrote a sample program in GLUT which creates a main window and then a subwindow (child window). Each has its own callbacks. I noticed that the keyboard callback that is called depends on the position of the mouse. If the mouse is over the main window it calls the main window's callback. If the mouse is over the subwindow it calls the subwindow's callback. Your program hides the mouse cursor (when the mouse is over the subwindow). So when the mouse is invisible i would expect you to get keyboard responses from the subwindow's callback. This is exactly what happens on my machine (DEV C++, Windows XP) both in GLUT and FREEGLUT. And if i move the mouse outside the subwindow, it becomes visible again and the key callback is the main window's one. I noticed that FREEGLUT doesn't call the subwindow's callback (a bug probably) unless you set the focus to the subwindow. I guess this is why we have this SetFocus inside WM_MOUSEMOVE. This is though irritating for the rest of the main windows because they loose their focus unexpectedly. One workaround is to set the focus in WM_MOUSEMOVE only when the main window is the active (foreground) window and so it switches the focus between the main window and its subwindows when necessary. My quick (and probably dirty) approach would be to change the WindowProc as follows: LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { static int lastWindowWasChild=-1; ... switch( uMsg ) { ... case WM_ACTIVATE: if (LOWORD(wParam) != WA_INACTIVE) { lastWindowWasChild=-1; } lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); break; ... case WM_MOUSEMOVE: { ... if (window->Parent==NULL && window->Children.First!=NULL && lastWindowWasChild!=0 && hWnd==GetForegroundWindow()) { lastWindowWasChild=0; //printf("Main Window Takes Focus from Child Window\n"); SetFocus(window->Window.Handle); } else if (window->Parent!=NULL && lastWindowWasChild!=1 && window->Parent->Window.Handle==GetForegroundWindow()) { lastWindowWasChild=1; //printf("Child Window takes Focus from Main Window\n"); SetFocus(window->Window.Handle); } ... } break; ... } If it will help you somehow, i can mail you the test program. I hope this helps. Regards Ioannis >> >> > I am currently trying to use freeglut to collect key board information >> > for a subwindow. But somehow keyboard information is only >> collected by main >> > window. >> > The code works well for glut , but not for freeglut. Anyone can >> give me some >> > idea what I should do. I am using visual studio 2008 on windows xp with >> > freeglut 2.8.0 version. Thanks in advance. part of the code is >> given below: >> > >> > void SubWindowRoutine(int main_w,CameraSetupConfig *_cfg) >> > { >> > static CameraSetupConfig cfg; >> > cfg = *_cfg; >> > if (calWindow == -1) >> > { >> > mainWindow = main_w; >> > calWindow = glutCreateSubWindow(main_w, 0, 0, cfg.width, >> > cfg.height); >> > glutSetWindow(calWindow); >> > glutDisplayFunc(perform_calibration_graphics); >> > glutKeyboardFunc(cal_keyboard); >> > glutSpecialFunc(cal_special_keys); >> > glutSetCursor(GLUT_CURSOR_NONE); >> > glutIdleFunc(subwindow_idle); >> > >> > glClearColor(cfg.background[0], cfg.background[1], >> > cfg.background[2], cfg.background[3]); >> > glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear >> > Screen And Depth Buffer >> > glColor3f(1.0,1.0,1.0); >> > >> > glDisable(GL_BLEND); >> > >> > // reset view matrices >> > glMatrixMode(GL_PROJECTION); >> > glLoadIdentity(); >> > glMatrixMode(GL_MODELVIEW); >> > glLoadIdentity(); >> > } >> > >> > >> > glutSetWindow(calWindow); >> > glutSwapBuffers( ); >> > _beginthread(Proc,0,&cfg); //here >> another thread >> > starts >> > while(!ts) Sleep(1000); // wait till the calibration starts >> > >> > glutPostWindowRedisplay(calWindow); >> > } >> > >> > void cal_keyboard(unsigned char key, int x, int y) >> > { >> > printf("Cal key is collected\n"); // never get this >> printout???? >> > //glutSetWindow(calWindow); >> > if(ts) >> > { >> > addKey(key); >> > >> > } >> > glutPostRedisplay (); >> > } >> > >> > >> > main func: >> > { >> > glutInit ( &argc, argv ); // Erm Just Write It =) >> > glutInitDisplayMode ( GLUT_RGBA | GLUT_DOUBLE ); // Display Mode >> > glutInitWindowSize ( 1024, 768 ); // If glutFullScreen wasn't >> called this >> > is the window size >> > mainWindow = glutCreateWindow ( "NeHe's OpenGL Framework" ); >> // Window >> > Title (argv[0] for current directory as title) >> > // glutFullScreen ( ); // Put Into Full Screen >> > InitGL (); >> > glutDisplayFunc ( display ); // Matching Earlier Functions To Their >> > Counterparts >> > glutReshapeFunc ( reshape ); >> > glutKeyboardFunc ( keyboard ); >> > glutSpecialFunc ( arrow_keys ); >> > glutIdleFunc ( display ); >> > glutMainLoop ( ); // Initialize The Main Loop >> > >> > } ---------------------------------------------------------------- This message was sent using IMP, the Internet Messaging Program. |