powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / SFML + WINAPI. помогите корректно закрыть программу
15 сообщений из 15, страница 1 из 1
SFML + WINAPI. помогите корректно закрыть программу
    #40053108
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне надо совсем немного : нужно окно с несколькими стандартными кнопками 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
SFML + WINAPI. помогите корректно закрыть программу
    #40053135
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81,
Общие подходы
- убирать то что написал пока не заработает
- сделать демку из двух окон без рисовали и отработать только винсообщения
...
Рейтинг: 0 / 0
SFML + WINAPI. помогите корректно закрыть программу
    #40053141
vAH_O6Vg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andron81, Перед case WM_CLOSE: воткни break а то case WM_COMMAND: проваливается в него. И верни обратно while (message.message != WM_QUIT)
...
Рейтинг: 0 / 0
SFML + WINAPI. помогите корректно закрыть программу
    #40053146
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vAH_O6Vg
andron81, Перед case WM_CLOSE: воткни break а то case WM_COMMAND: проваливается в него. И верни обратно while (message.message != WM_QUIT)


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


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

К ветке "case WM_COMMAND:". Но лучше сделать однотипно. Т.е. поднять на одну строчку вверх.
...
Рейтинг: 0 / 0
SFML + WINAPI. помогите корректно закрыть программу
    #40053357
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
SFML + WINAPI. помогите корректно закрыть программу
    #40053358
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81странно,что на строчку ниже работало

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

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

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

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

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

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

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

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


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