diff --git a/FPSCounter.cpp b/FPSCounter.cpp new file mode 100644 index 0000000..61144c3 --- /dev/null +++ b/FPSCounter.cpp @@ -0,0 +1,24 @@ +#include +#include + +class FPSCounter { +public: + FPSCounter() : frameCount(0), lastTime(std::chrono::high_resolution_clock::now()) {} + + void update() { + frameCount++; + auto currentTime = std::chrono::high_resolution_clock::now(); + std::chrono::duration elapsed = currentTime - lastTime; + + if (elapsed.count() >= 1.0) { + double fps = frameCount / elapsed.count(); + std::cout << "FPS: " << fps << std::endl; + frameCount = 0; + lastTime = currentTime; + } + } + +private: + int frameCount; + std::chrono::time_point lastTime; +}; diff --git a/grafikaKBT.vcxproj b/grafikaKBT.vcxproj index e8089fa..28784d3 100644 --- a/grafikaKBT.vcxproj +++ b/grafikaKBT.vcxproj @@ -121,6 +121,7 @@ + diff --git a/grafikaKBT.vcxproj.filters b/grafikaKBT.vcxproj.filters index 7b94c6c..2f91739 100644 --- a/grafikaKBT.vcxproj.filters +++ b/grafikaKBT.vcxproj.filters @@ -33,10 +33,7 @@ Source Files - - Source Files - - + Source Files @@ -68,4 +65,4 @@ Source Files - \ No newline at end of file + diff --git a/main.cpp b/main.cpp index 3519a2a..2610920 100644 --- a/main.cpp +++ b/main.cpp @@ -33,7 +33,8 @@ #include "timeh.hpp" #include "texture.hpp" #include "shader.hpp" - +#include "FPSCounter.cpp" +#include using namespace glm; @@ -79,8 +80,8 @@ int monitormodecounter = 0; std::time_t monitormodehelper; //Zmienne do ruchu ############################################## - -float Foward = 0.0f; // Pozycja łazika w przód/tył +/* +float Foward = 0.0f; // Pozycja łazika w przód/tył float Sides = 0.0f; // Pozycja łazika w lewo/prawo float Rotation = 0.0f; // Rotacja łazika (w stopniach) @@ -113,6 +114,131 @@ void RotateRoverAndCamera(float angle) { if (Rotation >= 360.0f) Rotation -= 360.0f; if (Rotation < 0.0f) Rotation += 360.0f; } +*/ +//Zmienne do ruchu ##############################################^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +FPSCounter fpsCounter; +static const int targetFPS = 144; // Celowany FPS +//Fps counter +void LimitFPS(int targetFPS) { + static auto lastTime = std::chrono::high_resolution_clock::now(); + auto currentTime = std::chrono::high_resolution_clock::now(); + std::chrono::duration elapsed = currentTime - lastTime; + + // Jeśli upłynęło za mało czasu, aby osiągnąć target FPS, czekamy + double frameTime = 1.0 / targetFPS; // Czas na jedną klatkę w sekundach + if (elapsed.count() < frameTime) { + std::this_thread::sleep_for(std::chrono::duration(frameTime - elapsed.count())); + } + + lastTime = std::chrono::high_resolution_clock::now(); +} +bool keyWPressed = false; +bool keySPressed = false; +bool keyAPressed = false; +bool keyDPressed = false; + +float Foward = 0.0f; // Pozycja łazika w przód/tył +float Sides = 0.0f; // Pozycja łazika w lewo/prawo +float Rotation = 0.0f; // Rotacja łazika (w stopniach) + +float CameraHeight = 50.0f; // Wysokość kamery +float MoveSpeed = 1.0f; // Prędkość poruszania się + + +float velocity = 0.0f; // Aktualna prędkość łazika +const float friction = 0.1f; // Współczynnik tarcia (μ) +const float maxSpeed = 3.0f; // Maksymalna prędkość łazika +const float acceleration = 0.1f; +float rotationVelocity = 0.0f; // Prędkość obrotu łazika +const float rotationAcceleration = 0.1f; // Przyspieszenie obrotu +const float rotationFriction = 0.05f; // Współczynnik tarcia obrotu +const float maxRotationSpeed = 5.0f; // Maksymalna prędkość obrotu + + + + +// Funkcja do poruszania łazikiem +void MoveRover(bool forward) { + // Zamieniamy kąt na radiany + float radRotation = Rotation * GL_PI / 180.0f; + + // Wektor ruchu w kierunku przód/tył (kierunek łazika) + float moveX = cos(radRotation); + float moveZ = sin(radRotation); + + // Ruch w przód + if (forward) { + Sides -= MoveSpeed * moveX; + Foward -= MoveSpeed * moveZ; + } + // Ruch w tył + else { + Sides += MoveSpeed * moveX; + Foward += MoveSpeed * moveZ; + } +} + +// Funkcja do obracania łazika wokół osi Y +void RotateRoverAndCamera(float angle) { + Rotation += angle; + if (Rotation >= 360.0f) Rotation -= 360.0f; + if (Rotation < 0.0f) Rotation += 360.0f; +} + +void UpdateRover() { + // Przyspieszanie w przód + if (keyWPressed) { + velocity += acceleration; + if (velocity > maxSpeed) velocity = maxSpeed; + } + // Przyspieszanie w tył + else if (keySPressed) { + velocity -= acceleration; + if (velocity < -maxSpeed) velocity = -maxSpeed; + } + // Hamowanie (wytracanie prędkości z powodu tarcia) + else { + if (velocity > 0) { + velocity -= friction; + if (velocity < 0) velocity = 0; + } + else if (velocity < 0) { + velocity += friction; + if (velocity > 0) velocity = 0; + } + } + + // Obracanie + if (keyAPressed) { + rotationVelocity += rotationAcceleration; + if (rotationVelocity > maxRotationSpeed) rotationVelocity = maxRotationSpeed; + } + else if (keyDPressed) { + rotationVelocity -= rotationAcceleration; + if (rotationVelocity < -maxRotationSpeed) rotationVelocity = -maxRotationSpeed; + } + else { + // Hamowanie obrotu (wytracanie prędkości z powodu tarcia) + if (rotationVelocity > 0) { + rotationVelocity -= rotationFriction; + if (rotationVelocity < 0) rotationVelocity = 0; + } + else if (rotationVelocity < 0) { + rotationVelocity += rotationFriction; + if (rotationVelocity > 0) rotationVelocity = 0; + } + } + + // Aktualizacja pozycji na podstawie prędkości + float radRotation = Rotation * GL_PI / 180.0f; + Sides -= velocity * cos(radRotation); + Foward -= velocity * sin(radRotation); + + // Aktualizacja kąta obrotu + Rotation += rotationVelocity; + if (Rotation >= 360.0f) Rotation -= 360.0f; + if (Rotation < 0.0f) Rotation += 360.0f; +} // Change viewing volume and viewport. Called when window is resized void ChangeSize(GLsizei w, GLsizei h) { @@ -648,7 +774,7 @@ void SetupRC() { // do przepisania kodu na podobny do tego stąd: // https://github.com/opengl-tutorials/ogl/blob/master/tutorial07_model_loading/tutorial07.cpp timestampedCout("Inicjalizowanie GLFW3..."); - if(!glfwInit()) { + if (!glfwInit()) { timestampedCout("Failed to initialize GLFW"); } timestampedCout("Zainicjalizowano GLFW3."); @@ -672,10 +798,11 @@ void SetupRC() { glfwSwapInterval(1); //glClearColor(0.0f, 0.0f, 0.4f, 0.0f); + } void RenderScene(void) { - + //float normal[3]; // Storage for calculated surface normal // Save the matrix state and do the rotations @@ -730,11 +857,11 @@ void RenderScene(void) { //Sterowanie //############################################################################################ gluLookAt( - Foward - 50.0f * sin((Rotation + 180.0f) * GL_PI / 180.0f), // Pozycja kamery wokół łazika (w poziomie) - CameraHeight, // Wysokość kamery - Sides - 50.0f * cos((Rotation + 180.0f) * GL_PI / 180.0f), // Kamera wzdłuż osi X i Z - Foward, 0.0f, Sides, // Punkt, na który patrzy kamera (łazik) - 0.0f, 1.0f, 0.0f // Wektor "góry" + Foward - 100.0f * sin((Rotation + 180.0f) * GL_PI / 180.0f), // Pozycja kamery wokół łazika (w poziomie) + CameraHeight, // Wysokość kamery + Sides - 100.0f * cos((Rotation + 180.0f) * GL_PI / 180.0f), // Kamera wzdłuż osi X i Z + Foward, 0.0f, Sides, // Punkt, na który patrzy kamera (łazik) + 0.0f, 1.0f, 0.0f // Wektor "góry" ); // Rysowanie mapy (nie porusza się) @@ -746,10 +873,12 @@ void RenderScene(void) { // Rysowanie łazika (porusza się i obraca) glPushMatrix(); + glTranslatef(Foward, 0.0f, Sides); // Translacja łazika na jego pozycję glRotatef(Rotation, 0.0f, 1.0f, 0.0f); // Obrót łazika wokół własnej osi glColor3f(1.0, 0.0, 0.0); // Czerwony kolor dla łazika user.draw(); + UpdateRover(); glPopMatrix(); //skrzynka(50); @@ -767,6 +896,10 @@ void RenderScene(void) { //glColor3f(0.0, 1.0, 0.0); //mapa.draw(); //glColor3f(0.0, 0.0, 0.0); + fpsCounter.update(); + + // Zamiana buforów (double buffering) + // Swap buffers //glfwSwapBuffers(window); @@ -853,66 +986,85 @@ HPALETTE GetOpenGLPalette(HDC hDC) { // Return the handle to the new palette return hRetPal; } - -int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { - - MSG msg; // Windows message structure - WNDCLASS wc; // Windows class structure - HWND hWnd; // Storeage for window handle - - hInstance = hInst; - - // Register Window style - wc.style = CS_HREDRAW | CS_VREDRAW; - wc.lpfnWndProc = (WNDPROC)WndProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = NULL; - wc.hCursor = LoadCursor(NULL, IDC_ARROW); - - // No need for background brush for OpenGL window - wc.hbrBackground = NULL; - - wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU); - wc.lpszClassName = lpszAppName; - - // Register the window class - if (RegisterClass(&wc) == 0) return FALSE; - - - // Create the main application window - hWnd = CreateWindow( - lpszAppName, - lpszAppName, - - // OpenGL requires WS_CLIPCHILDREN and WS_CLIPSIBLINGS - WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, - - // Window position and size - 50, 50, - 400, 400, - NULL, - NULL, - hInstance, - NULL); - - // If window was not created, quit - if (hWnd == NULL) return FALSE; - - - // Display the window - ShowWindow(hWnd, SW_SHOW); - UpdateWindow(hWnd); - - // Process application messages until the application closes - while (GetMessage(&msg, NULL, 0, 0)) { - TranslateMessage(&msg); - DispatchMessage(&msg); +void CreateConsole() { + // Tworzenie nowej konsoli + if (AllocConsole()) { + // Przekierowanie standardowych strumieni do konsoli + FILE* conin; + FILE* conout; + FILE* conerr; + freopen_s(&conin, "conin$", "r", stdin); + freopen_s(&conout, "conout$", "w", stdout); + freopen_s(&conerr, "conout$", "w", stderr); + } + else { + MessageBox(NULL, "Nie udało się utworzyć konsoli.", "Błąd", MB_OK | MB_ICONERROR); } - - return msg.wParam; } + int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { + CreateConsole(); + MSG msg; // Windows message structure + WNDCLASS wc; // Windows class structure + HWND hWnd; // Storeage for window handle + + + hInstance = hInst; + + // Register Window style + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.lpfnWndProc = (WNDPROC)WndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = hInstance; + wc.hIcon = NULL; + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + + // No need for background brush for OpenGL window + wc.hbrBackground = NULL; + + wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU); + wc.lpszClassName = lpszAppName; + + // Register the window class + if (RegisterClass(&wc) == 0) return FALSE; + + + // Create the main application window + hWnd = CreateWindow( + lpszAppName, + lpszAppName, + + // OpenGL requires WS_CLIPCHILDREN and WS_CLIPSIBLINGS + WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, + + // Window position and size + 50, 50, + 800, 800, + NULL, + NULL, + hInstance, + NULL); + + // If window was not created, quit + if (hWnd == NULL) return FALSE; + + + const WORD ID_TIMER = 1; + SetTimer(hWnd, ID_TIMER, 100, NULL); + // Display the window + + + ShowWindow(hWnd, SW_SHOW); + UpdateWindow(hWnd); + + // Process application messages until the application closes + while (GetMessage(&msg, NULL, 0, 0)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + return msg.wParam; + } // Window procedure, handles all messages for this program @@ -920,18 +1072,23 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) static HGLRC hRC; // Permenant Rendering context static HDC hDC; // Private GDI Device context -float radRotation = Rotation * GL_PI / 180.0f; + float radRotation = Rotation * GL_PI / 180.0f; switch (message) { // Window creation, setup for OpenGL - case WM_CREATE: - // Store the device context - hDC = GetDC(hWnd); + case WM_CREATE: + // Store the device context + hDC = GetDC(hWnd); - // Select the pixel format - SetDCPixelFormat(hDC); + // Select the pixel format + SetDCPixelFormat(hDC); - // Create palette if needed - hPalette = GetOpenGLPalette(hDC); + // Create palette if needed + hPalette = GetOpenGLPalette(hDC); + + // Create the rendering context and make it current + hRC = wglCreateContext(hDC); + wglMakeCurrent(hDC, hRC); + SetupRC(); // Create the rendering context and make it current hRC = wglCreateContext(hDC); @@ -1053,149 +1210,168 @@ float radRotation = Rotation * GL_PI / 180.0f; else InvalidateRect(hWnd, NULL, FALSE); break; - // Windows is telling the application that it may modify - // the system palette. This message in essance asks the - // application for a new palette. - case WM_QUERYNEWPALETTE: - // If the palette was created. - if (hPalette) { - int nRet; + // Limit FPS + LimitFPS(targetFPS); - // Selects the palette into the current device context - SelectPalette(hDC, hPalette, FALSE); + // Update FPS counter + fpsCounter.update(); + break; + case WM_QUERYNEWPALETTE: + // If the palette was created. + if (hPalette) { + int nRet; - // Map entries from the currently selected palette to - // the system palette. The return value is the number - // of palette entries modified. - nRet = RealizePalette(hDC); + // Selects the palette into the current device context + SelectPalette(hDC, hPalette, FALSE); - // Repaint, forces remap of palette in current window - InvalidateRect(hWnd, NULL, FALSE); + // Map entries from the currently selected palette to + // the system palette. The return value is the number + // of palette entries modified. + nRet = RealizePalette(hDC); - return nRet; - } - break; + // Repaint, forces remap of palette in current window + InvalidateRect(hWnd, NULL, FALSE); + + return nRet; + } + break; // This window may set the palette, even though it is not the // currently active window. - case WM_PALETTECHANGED: - // Don't do anything if the palette does not exist, or if - // this is the window that changed the palette. - if ((hPalette != NULL) && ((HWND)wParam != hWnd)) { - // Select the palette into the device context - SelectPalette(hDC, hPalette, FALSE); + case WM_PALETTECHANGED: + // Don't do anything if the palette does not exist, or if + // this is the window that changed the palette. + if ((hPalette != NULL) && ((HWND)wParam != hWnd)) { + // Select the palette into the device context + SelectPalette(hDC, hPalette, FALSE); - // Map entries to system palette - RealizePalette(hDC); + // Map entries to system palette + RealizePalette(hDC); - // Remap the current colors to the newly realized palette - UpdateColors(hDC); - return 0; - } + // Remap the current colors to the newly realized palette + UpdateColors(hDC); + return 0; + } + break; + case WM_KEYUP: + switch (wParam) { + case 'W': + keyWPressed = false; + break; + case 'S': + keySPressed = false; + break; + case 'A': + keyAPressed = false; + break; + case 'D': + keyDPressed = false; + break; + // Obsługa innych klawiszy + } + break; + + + case WM_KEYDOWN: + + + + switch (wParam) { + + case VK_UP: + xRot -= 5.0f; break; - // Key press, check for arrow keys to do cube rotation. - case WM_KEYDOWN: - - switch (wParam) { - case VK_UP: - xRot -= 5.0f; - break; - - case VK_DOWN: - xRot += 5.0f; - break; - - case VK_LEFT: - yRot -= 5.0f; - break; - - case VK_RIGHT: - yRot += 5.0f; - break; - - case 'Q': - zRot += 5.0f; - break; - - case 'E': - zRot -= 5.0f; - break; - - case 'R': - xRot = 0; - yRot = 0; - zRot = 0; - break; - - case ' ': // 32 - polygonmode = !polygonmode; - if (polygonmode) timestampedCout("Uwaga! Tryb wireframe jest niewydajny i powinien sluzyc tylko do debugowania!"); - break; - - case 'W': // Ruch w przód - MoveRover(true); - break; - case 'S': // Ruch w tył - MoveRover(false); - break; - - case 'A': // Obrót w lewo - RotateRoverAndCamera(5.0f); // Obrót łazika i kamery w lewo - break; - case 'D': // Obrót w prawo - RotateRoverAndCamera(-5.0f); // Obrót łazika i kamery w prawo - break; - - case 'J': // Obrót w lewo (wokół własnej osi) - Rotation += 5.0f; - if (Rotation > 360.0f || Rotation < 0.0f) Rotation -= 360.0f; - break; - case 'K': // Obrót w prawo (wokół własnej osi) - Rotation -= 5.0f; - if (Rotation > 360.0f || Rotation < 0.0f) Rotation += 360.0f; - break; - - case 114: // F3 - monitormode = !monitormode; - if (monitormode) { - monitormodehelper = std::time(nullptr) - 1; - timestampedCout("Wlaczono tryb monitorowania wydajnosci."); - } - if (!monitormode) timestampedCout("Wylaczono tryb monitorowania wydajnosci."); - break; - - default: - timestampedCout("Nacisnieto nierozpoznany klawisz: " << (int)wParam); - } - - xRot = (const int)xRot % 360; - yRot = (const int)yRot % 360; - zRot = (const int)zRot % 360; - - InvalidateRect(hWnd, NULL, FALSE); + case VK_DOWN: + xRot += 5.0f; break; + case VK_LEFT: + yRot -= 5.0f; + break; + + case VK_RIGHT: + yRot += 5.0f; + break; + + case 'Q': + zRot += 5.0f; + break; + + case 'E': + zRot -= 5.0f; + break; + + case 'R': + xRot = 0; + yRot = 0; + zRot = 0; + break; + + case ' ': // 32 + polygonmode = !polygonmode; + if (polygonmode) timestampedCout("Uwaga! Tryb wireframe jest niewydajny i powinien sluzyc tylko do debugowania!"); + break; + + case 'W': + keyWPressed = true; + break; + case 'S': + keySPressed = true; + break; + case 'A': + keyAPressed = true; + break; + case 'D': + keyDPressed = true; + break; + + case 114: // F3 + monitormode = !monitormode; + if (monitormode) { + monitormodehelper = std::time(nullptr) - 1; + timestampedCout("Wlaczono tryb monitorowania wydajnosci."); + } + if (!monitormode) timestampedCout("Wylaczono tryb monitorowania wydajnosci."); + break; + + default: + timestampedCout("Nacisnieto nierozpoznany klawisz: " << (int)wParam); + } + + xRot = (const int)xRot % 360; + yRot = (const int)yRot % 360; + zRot = (const int)zRot % 360; + + InvalidateRect(hWnd, NULL, FALSE); + break; + // A menu command - case WM_COMMAND: + case WM_COMMAND: - switch (LOWORD(wParam)) { + switch (LOWORD(wParam)) { - // Exit the program - case ID_FILE_EXIT: - DestroyWindow(hWnd); - break; - - // Display the about box - case ID_HELP_ABOUT: - DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG_ABOUT), hWnd, (DLGPROC)AboutDlgProc); - break; - - } + // Exit the program + case ID_FILE_EXIT: + DestroyWindow(hWnd); break; - default: // Passes it on if unproccessed - return (DefWindowProc(hWnd, message, wParam, lParam)); + // Display the about box + case ID_HELP_ABOUT: + DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG_ABOUT), hWnd, (DLGPROC)AboutDlgProc); + break; + + } + break; + case WM_TIMER: + + RenderScene(); + SwapBuffers(hDC); + ValidateRect(hWnd, NULL); + break; + + default: // Passes it on if unproccessed + return (DefWindowProc(hWnd, message, wParam, lParam)); } return (0L); @@ -1206,48 +1382,48 @@ BOOL APIENTRY AboutDlgProc(HWND hDlg, UINT message, UINT wParam, LONG lParam) { switch (message) { // Initialize the dialog box - case WM_INITDIALOG: - int i; - GLenum glError; + case WM_INITDIALOG: + int i; + GLenum glError; - // glGetString demo - SetDlgItemText(hDlg, IDC_OPENGL_VENDOR, reinterpret_cast(glGetString(GL_VENDOR))); - SetDlgItemText(hDlg, IDC_OPENGL_RENDERER, (LPCSTR)glGetString(GL_RENDERER)); - SetDlgItemText(hDlg, IDC_OPENGL_VERSION, (LPCSTR)glGetString(GL_VERSION)); - SetDlgItemText(hDlg, IDC_OPENGL_EXTENSIONS, (LPCSTR)glGetString(GL_EXTENSIONS)); + // glGetString demo + SetDlgItemText(hDlg, IDC_OPENGL_VENDOR, reinterpret_cast(glGetString(GL_VENDOR))); + SetDlgItemText(hDlg, IDC_OPENGL_RENDERER, (LPCSTR)glGetString(GL_RENDERER)); + SetDlgItemText(hDlg, IDC_OPENGL_VERSION, (LPCSTR)glGetString(GL_VERSION)); + SetDlgItemText(hDlg, IDC_OPENGL_EXTENSIONS, (LPCSTR)glGetString(GL_EXTENSIONS)); - // gluGetString demo - SetDlgItemText(hDlg, IDC_GLU_VERSION, (LPCSTR)gluGetString(GLU_VERSION)); - SetDlgItemText(hDlg, IDC_GLU_EXTENSIONS, (LPCSTR)gluGetString(GLU_EXTENSIONS)); + // gluGetString demo + SetDlgItemText(hDlg, IDC_GLU_VERSION, (LPCSTR)gluGetString(GLU_VERSION)); + SetDlgItemText(hDlg, IDC_GLU_EXTENSIONS, (LPCSTR)gluGetString(GLU_EXTENSIONS)); - // Display any recent error messages - i = 0; - do { - glError = glGetError(); - SetDlgItemText(hDlg, IDC_ERROR1 + i, (LPCSTR)gluErrorString(glError)); - i++; - } while (i < 6 && glError != GL_NO_ERROR); + // Display any recent error messages + i = 0; + do { + glError = glGetError(); + SetDlgItemText(hDlg, IDC_ERROR1 + i, (LPCSTR)gluErrorString(glError)); + i++; + } while (i < 6 && glError != GL_NO_ERROR); - return (TRUE); + return (TRUE); - break; + break; // Process command messages - case WM_COMMAND: + case WM_COMMAND: - // Validate and Make the changes - if (LOWORD(wParam) == IDOK) EndDialog(hDlg, TRUE); - break; + // Validate and Make the changes + if (LOWORD(wParam) == IDOK) EndDialog(hDlg, TRUE); + break; // Closed from sysbox - case WM_CLOSE: + case WM_CLOSE: - EndDialog(hDlg, TRUE); - break; + EndDialog(hDlg, TRUE); + break; } return FALSE; -} \ No newline at end of file +}