Cansisti Temat założony przez niniejszego użytkownika |
» 2015-08-09 20:35:03 W jednym oknie nie byłoby źle, ale trzeba by użyć tego kontekstu a ja na razie umiem tylko zainicjować okno GLUT i przekazać mu funkcje renderujace, zmiany rozmiaru okna itp. Pomysł z wątkiem jest niezły o tyle że nie musiałbym się martwić o zatrzymywanie glutmainloop() |
|
Cansisti Temat założony przez niniejszego użytkownika |
» 2015-08-09 21:06:45 Niestety próba utworzenia okna GLUT w wątku skończyła się tak: :) C:\Cpp\_LIBS\freeglut\lib\libfreeglut_static.a(freeglut_init.o):freeglut_init.c|| undefined reference to `_imp__GetDeviceCaps@8'| C:\Cpp\_LIBS\freeglut\lib\libfreeglut_static.a(freeglut_init.o):freeglut_init.c|| undefined reference to `_imp__CreateDCA@16'| C:\Cpp\_LIBS\freeglut\lib\libfreeglut_static.a(freeglut_init.o):freeglut_init.c|| undefined reference to `_imp__DeleteDC@4'| C:\Cpp\_LIBS\freeglut\lib\libfreeglut_static.a(freeglut_window.o):freeglut_window.c|| undefined reference to `_imp__GetDeviceCaps@8'| C:\Cpp\_LIBS\freeglut\lib\libfreeglut_static.a(freeglut_window.o):freeglut_window.c|| undefined reference to `_imp__ChoosePixelFormat@8'| C:\Cpp\_LIBS\freeglut\lib\libfreeglut_static.a(freeglut_window.o):freeglut_window.c|| undefined reference to `_imp__DeleteDC@4'| C:\Cpp\_LIBS\freeglut\lib\libfreeglut_static.a(freeglut_window.o):freeglut_window.c|| undefined reference to `_imp__SetPixelFormat@12'| C:\Cpp\_LIBS\freeglut\lib\libfreeglut_static.a(freeglut_window.o):freeglut_window.c|| undefined reference to `_imp__CreateDCA@16'| C:\Cpp\_LIBS\freeglut\lib\libfreeglut_static.a(freeglut_window.o):freeglut_window.c|| undefined reference to `_imp__SetPixelFormat@12'| C:\Cpp\_LIBS\freeglut\lib\libfreeglut_static.a(freeglut_display.o):freeglut_display.c|| undefined reference to `_imp__SwapBuffers@4'| C:\Cpp\_LIBS\freeglut\lib\libfreeglut_static.a(freeglut_state.o):freeglut_state.c|| undefined reference to `_imp__GetPixelFormat@4'| ||=== Build finished: 11 errors, 0 warnings (0 minutes, 2 seconds) ===|
Zostawiłem ścieżki w logu żeby było widać że to nie moje pliki zgłaszają błędy... |
|
pekfos |
» 2015-08-09 21:32:45 Niestety próba utworzenia okna GLUT w wątku skończyła się tak: :) |
Na moje oko, to tu żadnej próby nie było, bo program nie został wygenerowany. Nie linkujesz gdzieś gdi32. Taką informację można znaleźć w google w 5 sekund. |
|
Monika90 |
» 2015-08-09 21:42:16 Powinno się to dać zrobić bez wątku, komunikaty Windows można obsługiwać w którymś z callbacków gluta (może glutIdleFunc?), używając nieblokującej funkcji, czyli PeekMessage.
Zresztą to nawet nie musi być potrzebne, bo być może glut sam roześle komunikaty do odpowiednich okien, (sprawdź w kodzie źródłowym gluta). |
|
Cansisti Temat założony przez niniejszego użytkownika |
» 2015-08-09 23:02:09 Hmm, glutIdleFunc() może zadziałać. Udało mi się utworzyć kolejne okno za pomocą glutCreateWindow() (Nie spodziewałem się że obsłuży dwa okna, a okazuje się że ma nawet mechanizm przełączania się między oknami) Dzięki wszystkim za pomoc, popróbuję wspomagając się manual'em gluta i może coś się uda :) (Nie wiedziałem że glut tyle może, tak bym od razu sięgnął po manual) |
|
Kaikso |
» 2015-08-10 00:38:26 Nie spodziewałem się że obsłuży dwa okna, a okazuje się że ma nawet mechanizm przełączania się między oknami |
Tak jak myślałem. Całość działa dlatego że FreeGLUT na Windows-a jest napisany własnie w WinAPI (sprawdzałem w kodzie źródłowym) i to WinAPI zajmuje się kontrolą pętli i zdarzeń które przekazuje do FreeGLUT. Funkcja która tworzy okno w FreeGLUT na Windowsie: void fgPlatformOpenWindow( SFG_Window * window, const char * title, GLboolean positionUse, int x, int y, GLboolean sizeUse, int w, int h, GLboolean gameMode, GLboolean isSubWindow ) { WNDCLASS wc; DWORD flags = 0; DWORD exFlags = 0; BOOL atom; atom = GetClassInfo( fgDisplay.pDisplay.Instance, _T( "FREEGLUT" ), & wc ); FREEGLUT_INTERNAL_ERROR_EXIT( atom, "Window Class Info Not Found", "fgOpenWindow" ); if( gameMode ) { FREEGLUT_INTERNAL_ERROR_EXIT( window->Parent == NULL, "Game mode being invoked on a subwindow", "fgOpenWindow" ); flags = WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE; } else { flags = WS_CLIPSIBLINGS | WS_CLIPCHILDREN; if( window->IsMenu ) { flags |= WS_POPUP; exFlags |= WS_EX_TOOLWINDOW; } #if defined(_WIN32_WCE) #else else if( window->Parent == NULL ) fghGetDefaultWindowStyle( & flags ); #endif else flags |= WS_CHILD; } if( gameMode ) { int xoff = 0, yoff = 0; get_display_origin( & xoff, & yoff ); x += xoff; y += yoff; } if( !positionUse ) { x = CW_USEDEFAULT; y = CW_USEDEFAULT; } if( !sizeUse ) { w = CW_USEDEFAULT; h = CW_USEDEFAULT; } #if !defined(_WIN32_WCE) else { RECT windowRect; windowRect.left = x; windowRect.top = y; windowRect.right = x + w; windowRect.bottom = y + h; fghComputeWindowRectFromClientArea_UseStyle( & windowRect, flags, exFlags, TRUE ); w = windowRect.right - windowRect.left; h = windowRect.bottom - windowRect.top; } #endif #if defined(_WIN32_WCE) { wchar_t * wstr = fghWstrFromStr( title ); window->Window.Handle = CreateWindow( _T( "FREEGLUT" ), wstr, WS_VISIBLE | WS_POPUP, 0, 0, 240, 320, NULL, NULL, fgDisplay.pDisplay.Instance, ( LPVOID ) window ); free( wstr ); SHFullScreen( window->Window.Handle, SHFS_HIDESTARTICON ); SHFullScreen( window->Window.Handle, SHFS_HIDESIPBUTTON ); SHFullScreen( window->Window.Handle, SHFS_HIDETASKBAR ); MoveWindow( window->Window.Handle, 0, 0, 240, 320, TRUE ); ShowWindow( window->Window.Handle, SW_SHOW ); UpdateWindow( window->Window.Handle ); } #else window->Window.Handle = CreateWindowEx( exFlags, _T( "FREEGLUT" ), title, flags, x, y, w, h, ( HWND ) window->Parent == NULL ? NULL : window->Parent->Window.Handle ,( HMENU ) NULL , fgDisplay.pDisplay.Instance ,( LPVOID ) window ); #endif if( !( window->Window.Handle ) ) fgError( "Failed to create a window (%s)!", title ); window->State.pWState.WindowTitle = strdup( title ); #if !defined(_WIN32_WCE) SetWindowLong( window->Window.Handle, GWL_STYLE, flags ); SetWindowPos( window->Window.Handle, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED ); #endif if( window->IsMenu || gameMode ) SetWindowPos( window->Window.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE ); #ifdef WM_TOUCH if( fghRegisterTouchWindow ==( pRegisterTouchWindow ) 0xDEADBEEF ) fghRegisterTouchWindow =( pRegisterTouchWindow ) GetProcAddress( GetModuleHandle( "user32" ), "RegisterTouchWindow" ); if( fghRegisterTouchWindow ) fghRegisterTouchWindow( window->Window.Handle, TWF_FINETOUCH | TWF_WANTPALM ); #endif #if defined(_WIN32_WCE) ShowWindow( window->Window.Handle, SW_SHOW ); #else if( !window->IsMenu ) { BOOL iconic = fgState.ForceIconic && !gameMode && !isSubWindow; ShowWindow( window->Window.Handle, iconic ? SW_SHOWMINIMIZED: SW_SHOWNORMAL ); } #endif ShowCursor( TRUE ); }
Funkcja glutCreateWindow zwraca wskaźnik na SFG_Window, a to możesz wykorzystać do większej kontroli nad oknem. SFG_Window: struct tagSFG_Window { SFG_Node Node; int ID; SFG_Context Window; SFG_WindowState State; SFG_Proc CallBacks[ TOTAL_CALLBACKS ]; void * UserData; SFG_Menu * Menu[ FREEGLUT_MAX_MENUS ]; SFG_Menu * ActiveMenu; SFG_Window * Parent; SFG_List Children; GLboolean IsMenu; };
SFG_Context: struct tagSFG_Context { SFG_WindowHandleType Handle; SFG_WindowContextType Context; SFG_PlatformContext pContext; int DoubleBuffered; GLint attribute_v_coord; GLint attribute_v_normal; GLint attribute_v_texture; };
A SFG_WindowHandlType to typedef HWND SFG_WindowHandleType; Czyli wszystko co ci potrzebne do kontroli okna FreeGLUT przez interfejs WinAPI. |
|
Cansisti Temat założony przez niniejszego użytkownika |
» 2015-08-10 14:47:38 A masz może pomysł jak napisać funkcję zwrotną dla glutIdleFunc() tak żeby odbierała komunikaty od kontrolek? (np. naciśnięcie przycisku)
EDIT: Widzę że post został oznaczony jako rozwiązany więc tworzę nowy |
|
1 « 2 » |