SFML + WINAPI. помогите корректно закрыть программу
в общем WINApi не владею от слова совсем. но и мне надо то от него совсем немного : нужно окно со стандартными кнопками и SFML-экран в этом окне где я буду рисовать. взял стандартный пример SFML и почти всё что надо получилось . Игр не пишу ! Анимация так просто осталась. Проблема только в закрытии приложения. ну не могу заставить корректно закрыть : нажимаю на крестик окна-оно закрывается , но приложение не закрывается. При закрытии в консоли выскакивает в зацикливании : Failed to activate the window's context Failed to activate OpenGL context: .
#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;
}
использую Viual Studio. в компоновщике подсистему выбрал Windows (/SUBSYSTEM:WINDOWS) . Может надо другое что-то ?
Ответы (1 шт):
Нет выхода из цикла обработки сообщений. Надо добавить выход по WM_QUIT:
// Loop until a WM_QUIT message is received
MSG message;
while (true)
{
if (PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
{
if (message.message == WM_QUIT)
break;
// If a message was waiting in the message queue, process it
TranslateMessage(&message);
DispatchMessage(&message);
}
Непонятно зачем нужна строчка
message.message = static_cast<UINT>(~WM_QUIT);
первый аргумент PeekMessage выходной, т.е. она записывает в него данные полученного сообщения и не читает из него.