Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
 SFML + WINAPI. помогите корректно закрыть программу  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1036
Мне надо совсем немного : нужно окно с несколькими стандартными кнопками Windows и SFML-экран, в этом окне где я буду рисовать. взял стандартный пример SFML (win32) и почти всё что надо получилось . Игр не пишу ! Анимация так просто осталась. Проблема только в закрытии приложения. ну не могу заставить корректно закрыться : нажимаю на крестик окна-оно закрывается , но приложение не закрывается. При этом в консоли выскакивает в зацикливании : Failed to activate the window's context Failed to activate OpenGL context: .
в цикле я условие всегда сделал истинным иначе нажатие на мои кнопки сразу же закрывает программу, а необходимо продолжение работы. раньше там стояло так : while (message.message != WM_QUIT). Другого способа я не нашёл, а этот способ как раз даёт такую побочку что я и имею.

исходник вот :
#include <SFML/Graphics.hpp>
#include <windows.h>
#include <cmath>
#include <iostream>


HWND button;

INT B = 100;


LRESULT CALLBACK onEvent(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    static HWND hStatic = 0;
    switch (msg)
    {

    case WM_CREATE: {
        HWND hbtn1 = CreateWindow(L"BUTTON", L"this btn1",
            WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 0, 0, 150, 35, hwnd, reinterpret_cast<HMENU>(1),
            NULL, NULL
        );
        HWND hbtn2 = CreateWindow(L"BUTTON", L"this btn2",
            WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 0, 100, 150, 35, hwnd, reinterpret_cast<HMENU>(2),
            NULL, NULL
        );

        hStatic = CreateWindow(L"static", L"This text",
            WS_CHILD | WS_VISIBLE, 300, 300, 150, 20, hwnd, NULL,
            NULL, NULL
        );


        break;
    }

    case WM_COMMAND: {
        switch (LOWORD(wparam))
        {
        case 1: {
            B = 10;
            SetWindowText(hStatic, L"10");
            //MessageBox(NULL, L"press btn1", L"App", MB_OK); break;
            break;
        }
        case 2: { B = 100;  SetWindowText(hStatic, L"100");  }
              //default:
              //    break;
        }
    }
    case WM_CLOSE:
    {
        PostQuitMessage(0);
        break;
    }

    // Quit when we click the "quit" button
    case WM_DESTROY: {PostQuitMessage(0); break; }
    }

    return DefWindowProc(hwnd, msg, wparam, lparam);
}



int main()
{
    HINSTANCE instance = GetModuleHandle(NULL);


    WNDCLASS windowClass;
    windowClass.style = 0;
    windowClass.lpfnWndProc = &onEvent;
    windowClass.cbClsExtra = 0;
    windowClass.cbWndExtra = 0;
    windowClass.hInstance = instance;
    windowClass.hIcon = NULL;
    windowClass.hCursor = 0;
    windowClass.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_BACKGROUND);
    windowClass.lpszMenuName = NULL;
    windowClass.lpszClassName = TEXT("SFML App");
    RegisterClass(&windowClass);


    HWND window = CreateWindow(TEXT("SFML App"), TEXT("SFML Win32"), WS_SYSMENU | WS_VISIBLE, 200, 200, 660, 520, NULL, NULL, instance, NULL);

    // Add a button for exiting
    button = CreateWindow(TEXT("BUTTON"), TEXT("Quit"), WS_CHILD | WS_VISIBLE, 560, 440, 80, 40, window, NULL, instance, NULL);

    // Let's create two SFML views
    HWND view1 = CreateWindow(TEXT("STATIC"), NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, 20, 20, 300, 400, window, NULL, instance, NULL);
    HWND view2 = CreateWindow(TEXT("STATIC"), NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, 340, 20, 300, 400, window, NULL, instance, NULL);
    sf::RenderWindow SFMLView1(view1);
    sf::RenderWindow SFMLView2(view2);

    // Load some textures to display
    sf::Texture texture1, texture2;
    if (!texture1.loadFromFile("pica/image1.jpg") || !texture2.loadFromFile("pica/image2.jpg"))
        return EXIT_FAILURE;
    sf::Sprite sprite1(texture1);
    sf::Sprite sprite2(texture2);
    sprite1.setOrigin(sf::Vector2f(texture1.getSize()) / 2.f);
    sprite1.setPosition(sprite1.getOrigin());

    // Create a clock for measuring elapsed time
    sf::Clock clock;

    // Loop until a WM_QUIT message is received
    MSG message;
    message.message = static_cast<UINT>(~WM_QUIT);
    while (true)
    {
        if (PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
        {
            // If a message was waiting in the message queue, process it
           TranslateMessage(&message);
           DispatchMessage(&message);
           
        }

       else
        {
            
            float time = clock.getElapsedTime().asSeconds();
            
            // Clear views
            SFMLView1.clear();
            SFMLView2.clear();

            // Draw sprite 1 on view 1
            sprite1.setRotation(time * 100);
            SFMLView1.draw(sprite1);

            // Draw sprite 2 on view 2
            sprite2.setPosition(std::cos(time) * 100.f, 0.f);
            SFMLView2.draw(sprite2);

            // Display each view on screen
            SFMLView1.display();
            SFMLView2.display();
        }
        std::cout << "test" << std::endl;
    }
    std::cout << "****" << std::endl;
    // Destroy the main window (all its child controls will be destroyed)
   DestroyWindow(window);

    // Don't forget to unregister the window class
    UnregisterClass(TEXT("SFML App"), instance);

    return EXIT_SUCCESS;
}
13 мар 21, 11:13    [22293898]     Ответить | Цитировать Сообщить модератору
 Re: SFML + WINAPI. помогите корректно закрыть программу  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
andron81,
Общие подходы
- убирать то что написал пока не заработает
- сделать демку из двух окон без рисовали и отработать только винсообщения
13 мар 21, 13:35    [22293950]     Ответить | Цитировать Сообщить модератору
 Re: SFML + WINAPI. помогите корректно закрыть программу  [new]
vAH_O6Vg
Member

Откуда:
Сообщений: 13
andron81, Перед case WM_CLOSE: воткни break а то case WM_COMMAND: проваливается в него. И верни обратно while (message.message != WM_QUIT)
13 мар 21, 14:01    [22293959]     Ответить | Цитировать Сообщить модератору
 Re: SFML + WINAPI. помогите корректно закрыть программу  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1036
vAH_O6Vg
andron81, Перед case WM_CLOSE: воткни break а то case WM_COMMAND: проваливается в него. И верни обратно while (message.message != WM_QUIT)


круто ! помогли , спасибо большое ! :)
только вот я не понял , что я сделал. непонятно к чему относится этот "break" ? к какой ветке ?
13 мар 21, 14:38    [22293972]     Ответить | Цитировать Сообщить модератору
 Re: SFML + WINAPI. помогите корректно закрыть программу  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6422
andron81
vAH_O6Vg
andron81, Перед case WM_CLOSE: воткни break а то case WM_COMMAND: проваливается в него. И верни обратно while (message.message != WM_QUIT)


круто ! помогли , спасибо большое ! :)
только вот я не понял , что я сделал. непонятно к чему относится этот "break" ? к какой ветке ?

http://easy-code.ru/lesson/switch-case-cpp или
https://ravesli.com/urok-65-operator-switch/

Сообщение было отредактировано: 14 мар 21, 18:17
14 мар 21, 18:23    [22294325]     Ответить | Цитировать Сообщить модератору
 Re: SFML + WINAPI. помогите корректно закрыть программу  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1036
Siemargl
andron81
пропущено...


круто ! помогли , спасибо большое ! :)
только вот я не понял , что я сделал. непонятно к чему относится этот "break" ? к какой ветке ?

http://easy-code.ru/lesson/switch-case-cpp или
https://ravesli.com/urok-65-operator-switch/


синтаксис switch - case я в курсе и как работает тоже. я не уловил к какому блоку относится этот break подсказка по которому была дана(break был выставлен перед case WM_CLOSE: ). break должен относится к какой-нибудь метке, либо к default. к какой метке он тут относится ???

LRESULT CALLBACK onEvent(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    static HWND hStatic = 0;
    switch (msg)
    {

    case WM_CREATE: {
        HWND buttonsimpleline = CreateWindow(L"BUTTON", L"__",
            WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 0, 0, 150, 35, hwnd, reinterpret_cast<HMENU>(0),
            NULL, NULL
        );
        HWND buttondottedline = CreateWindow(L"BUTTON", L"_ _",
            WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 155, 0, 150, 35, hwnd, reinterpret_cast<HMENU>(1),
            NULL, NULL
        );
        HWND buttondottedpointline = CreateWindow(L"BUTTON", L"_ . ",
            WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 310, 0, 150, 35, hwnd, reinterpret_cast<HMENU>(2),
            NULL, NULL
        );

        HWND buttonSelect = CreateWindow(L"BUTTON", L"SELECT",
            WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 470, 0, 150, 35, hwnd, reinterpret_cast<HMENU>(3),
            NULL, NULL
        );


        hStatic = CreateWindow(L"static", L"Current mode: ",
            WS_CHILD | WS_VISIBLE, 1300, 0, 500, 20, hwnd, NULL,
            NULL, NULL
        );
        break;
    }
    case WM_COMMAND: {
        ButtonPressID = LOWORD(wparam);
        ispointActive = false;
        switch (LOWORD(wparam))
        {
        case 0: {
            SetWindowText(hStatic, L"Current mode: __");
            break;
        }
        case 1: { ButtonPressID=1;
            SetWindowText(hStatic, L"Current mode: _ _");   break;
        }
        case 2: { 
          SetWindowText(hStatic, L"Current mode: _._");  break;
        }

        case 3: {
        SetWindowText(hStatic, L"Current mode: \"SELECT\"");  break;
        }

        }
    }
                   break;
    case WM_CLOSE:
    {
        PostQuitMessage(0);
        break;
    }
    case WM_DESTROY: {
        PostQuitMessage(0); break;
    }
    }
    return DefWindowProc(hwnd, msg, wparam, lparam);
}
14 мар 21, 18:33    [22294327]     Ответить | Цитировать Сообщить модератору
 Re: SFML + WINAPI. помогите корректно закрыть программу  [new]
petrav
Member

Откуда:
Сообщений: 2861
andron81
Siemargl
пропущено...

http://easy-code.ru/lesson/switch-case-cpp или
https://ravesli.com/urok-65-operator-switch/


синтаксис switch - case я в курсе и как работает тоже. я не уловил к какому блоку относится этот break подсказка по которому была дана(break был выставлен перед case WM_CLOSE: ). break должен относится к какой-нибудь метке, либо к default. к какой метке он тут относится ???

К ветке "case WM_COMMAND:". Но лучше сделать однотипно. Т.е. поднять на одну строчку вверх.
14 мар 21, 19:02    [22294333]     Ответить | Цитировать Сообщить модератору
 Re: SFML + WINAPI. помогите корректно закрыть программу  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1036
petrav
andron81
пропущено...


синтаксис switch - case я в курсе и как работает тоже. я не уловил к какому блоку относится этот break подсказка по которому была дана(break был выставлен перед case WM_CLOSE: ). break должен относится к какой-нибудь метке, либо к default. к какой метке он тут относится ???

К ветке "case WM_COMMAND:". Но лучше сделать однотипно. Т.е. поднять на одну строчку вверх.


вот так работает. странно,что если на строчку ниже (как я публиковал ранее) работало

    case WM_COMMAND: {
        ButtonPressID = LOWORD(wparam);
        ispointActive = false;
        switch (LOWORD(wparam))
        {
        case 0: {
            SetWindowText(hStatic, L"Current mode: __");
            break;
        }
        case 1: { ButtonPressID=1;
            SetWindowText(hStatic, L"Current mode: _ _");   break;
        }
        case 2: { 
          SetWindowText(hStatic, L"Current mode: _._");  break;
        }

        case 3: {
        SetWindowText(hStatic, L"Current mode: \"SELECT\"");  break;
        }

        }
        break;
    }


Сообщение было отредактировано: 14 мар 21, 19:16
14 мар 21, 19:22    [22294336]     Ответить | Цитировать Сообщить модератору
 Re: SFML + WINAPI. помогите корректно закрыть программу  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

andron81
странно,что на строчку ниже работало

Ты точно знаешь синтаксис switch? Он не требует фигурных скобок в ветках.

Posted via ActualForum NNTP Server 1.5

14 мар 21, 19:24    [22294338]     Ответить | Цитировать Сообщить модератору
 Re: SFML + WINAPI. помогите корректно закрыть программу  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1036
Dimitry Sibiryakov,

теперь понятней )
14 мар 21, 19:32    [22294342]     Ответить | Цитировать Сообщить модератору
 Re: SFML + WINAPI. помогите корректно закрыть программу  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6422
Dimitry Sibiryakov

andron81
странно,что на строчку ниже работало

Ты точно знаешь синтаксис switch Cи? Он не требует фигурных скобок в ветках.

Поправил

Сообщение было отредактировано: 14 мар 21, 20:22
14 мар 21, 20:28    [22294364]     Ответить | Цитировать Сообщить модератору
 Re: SFML + WINAPI. помогите корректно закрыть программу  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1036
Siemargl, Синтаксиса Си не знаю. У вас тут только умные в клубе вопросы задавать можно ?
тупых нельзя что ли ???
не факт, что даже указав ты на доки я верно пойму что имел ввиду.

Сообщение было отредактировано: 14 мар 21, 20:46
14 мар 21, 20:51    [22294367]     Ответить | Цитировать Сообщить модератору
 Re: SFML + WINAPI. помогите корректно закрыть программу  [new]
mayton
Member

Откуда: loopback
Сообщений: 51017
andron81,

дружище. Спокойнее. Нормальная дискуссия идет.
14 мар 21, 22:39    [22294398]     Ответить | Цитировать Сообщить модератору
 Re: SFML + WINAPI. помогите корректно закрыть программу  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6422
andron81
Siemargl, Синтаксиса Си не знаю. У вас тут только умные в клубе вопросы задавать можно ?
тупых нельзя что ли ???
не факт, что даже указав ты на доки я верно пойму что имел ввиду.
Пролистай учебник по Си, он короткий. Ты сильно облегчишь себе жизнь. И глупых вопросов станет на 50% меньше.

Пока что ты лезешь в сложное болото, не понимая базовых вещей. Далеко ты не зайдешь так.
14 мар 21, 22:50    [22294399]     Ответить | Цитировать Сообщить модератору
 Re: SFML + WINAPI. помогите корректно закрыть программу  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

andron81
У вас тут только умные в клубе вопросы задавать можно ?

Да, весьма желательно. Форум - он для обмена, а не игры в одни ворота.

Posted via ActualForum NNTP Server 1.5

14 мар 21, 22:55    [22294402]     Ответить | Цитировать Сообщить модератору
Все форумы / C++ Ответить