Гость
Форумы / C++ [игнор отключен] [закрыт для гостей] / SFML + WINAPI. помогите корректно закрыть программу / 15 сообщений из 15, страница 1 из 1
13.03.2021, 11:13
    #40053108
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SFML + WINAPI. помогите корректно закрыть программу
Мне надо совсем немного : нужно окно с несколькими стандартными кнопками Windows и SFML-экран, в этом окне где я буду рисовать. взял стандартный пример SFML (win32) и почти всё что надо получилось . Игр не пишу ! Анимация так просто осталась. Проблема только в закрытии приложения. ну не могу заставить корректно закрыться : нажимаю на крестик окна-оно закрывается , но приложение не закрывается. При этом в консоли выскакивает в зацикливании : Failed to activate the window's context Failed to activate OpenGL context: .
в цикле я условие всегда сделал истинным иначе нажатие на мои кнопки сразу же закрывает программу, а необходимо продолжение работы. раньше там стояло так : while (message.message != WM_QUIT). Другого способа я не нашёл, а этот способ как раз даёт такую побочку что я и имею.

исходник вот :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
#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;
}
...
Рейтинг: 0 / 0
13.03.2021, 13:35
    #40053135
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SFML + WINAPI. помогите корректно закрыть программу
andron81,
Общие подходы
- убирать то что написал пока не заработает
- сделать демку из двух окон без рисовали и отработать только винсообщения
...
Рейтинг: 0 / 0
13.03.2021, 14:01
    #40053141
vAH_O6Vg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SFML + WINAPI. помогите корректно закрыть программу
andron81, Перед case WM_CLOSE: воткни break а то case WM_COMMAND: проваливается в него. И верни обратно while (message.message != WM_QUIT)
...
Рейтинг: 0 / 0
13.03.2021, 14:38
    #40053146
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SFML + WINAPI. помогите корректно закрыть программу
vAH_O6Vg
andron81, Перед case WM_CLOSE: воткни break а то case WM_COMMAND: проваливается в него. И верни обратно while (message.message != WM_QUIT)


круто ! помогли , спасибо большое ! :)
только вот я не понял , что я сделал. непонятно к чему относится этот "break" ? к какой ветке ?
...
Рейтинг: 0 / 0
14.03.2021, 18:23
    #40053349
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SFML + WINAPI. помогите корректно закрыть программу
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/
...
Рейтинг: 0 / 0
14.03.2021, 18:33
    #40053351
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SFML + WINAPI. помогите корректно закрыть программу
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. к какой метке он тут относится ???

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
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);
}
...
Рейтинг: 0 / 0
14.03.2021, 19:02
    #40053355
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SFML + WINAPI. помогите корректно закрыть программу
andron81


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

К ветке "case WM_COMMAND:". Но лучше сделать однотипно. Т.е. поднять на одну строчку вверх.
...
Рейтинг: 0 / 0
14.03.2021, 19:22
    #40053357
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SFML + WINAPI. помогите корректно закрыть программу
petrav
andron81
пропущено...


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

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


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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
    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;
    }
...
Рейтинг: 0 / 0
14.03.2021, 19:24
    #40053358
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SFML + WINAPI. помогите корректно закрыть программу
andron81странно,что на строчку ниже работало

Ты точно знаешь синтаксис switch? Он не требует фигурных скобок в ветках.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.03.2021, 19:32
    #40053362
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SFML + WINAPI. помогите корректно закрыть программу
Dimitry Sibiryakov,

теперь понятней )
...
Рейтинг: 0 / 0
14.03.2021, 20:28
    #40053376
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SFML + WINAPI. помогите корректно закрыть программу
Dimitry Sibiryakov

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

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

Поправил
...
Рейтинг: 0 / 0
14.03.2021, 20:51
    #40053378
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SFML + WINAPI. помогите корректно закрыть программу
Siemargl, Синтаксиса Си не знаю. У вас тут только умные в клубе вопросы задавать можно ?
тупых нельзя что ли ???
не факт, что даже указав ты на доки я верно пойму что имел ввиду.
...
Рейтинг: 0 / 0
14.03.2021, 22:39
    #40053395
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SFML + WINAPI. помогите корректно закрыть программу
andron81,

дружище. Спокойнее. Нормальная дискуссия идет.
...
Рейтинг: 0 / 0
14.03.2021, 22:50
    #40053396
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SFML + WINAPI. помогите корректно закрыть программу
andron81
Siemargl, Синтаксиса Си не знаю. У вас тут только умные в клубе вопросы задавать можно ?
тупых нельзя что ли ???
не факт, что даже указав ты на доки я верно пойму что имел ввиду.
Пролистай учебник по Си, он короткий. Ты сильно облегчишь себе жизнь. И глупых вопросов станет на 50% меньше.

Пока что ты лезешь в сложное болото, не понимая базовых вещей. Далеко ты не зайдешь так.
...
Рейтинг: 0 / 0
14.03.2021, 22:55
    #40053398
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SFML + WINAPI. помогите корректно закрыть программу
andron81У вас тут только умные в клубе вопросы задавать можно ?

Да, весьма желательно. Форум - он для обмена, а не игры в одни ворота.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / SFML + WINAPI. помогите корректно закрыть программу / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]