SFML ничего не извлекает из другого потока, и может ли SFML сосуществовать с GDI?

#c #multithreading #mfc #sfml

#c #многопоточность #mfc #sfml

Вопрос:

Я пишу тестовое приложение SFML с MFC. Следующий код выполняется внутри бесконечного цикла в другом потоке, запущенном функцией AfxBeginThread() . (Потому что я хочу использовать SFML, как в чистом приложении WinAPI)

 // SFML Window and View were initialized using CView's HWND
// Use SFML to draw
sf::Color back(255, 255, 0); // a yellow background
_psfwnd->clear(back);
_psfwnd->display();

// Then use MFC GDI functions to draw
CWnd* pwnd;
pwnd = CWnd::FromHandle(_psfwnd->getSystemHandle()); // It seems that the HWND is valid
CPaintDC dc(pwnd);
CRect r(10, 10, 100, 100);
CBrush b(0xFF000000);
dc.FillRect(amp;r, amp;b);    // draw a black rectangle
  

Результатом является белый фон с черным прямоугольником. Кажется, что SFML ничего не извлекает, кроме MFC.

Тот же код выше. Теперь я помещаю его в обработчик команд MFC (поэтому приведенный выше код рисует один кадр, когда я нажимаю кнопку один раз).

На этот раз фон окна желтый, а черный прямоугольник MFC исчез.

Теперь я совсем запутался. У меня два вопроса:

  1. Почему SFML не выводится с первого раза? Это из-за потоковой обработки или инициализации?

  2. Почему MFC не рисует, когда это делает SFML?

Комментарии:

1. IDK, если ЭТО ТАК, придерживается политики в отношении мультипостинга на нескольких сайтах, но вот тот же вопрос в другом месте: en.sfml-dev.org/forums/index.php?topic=15541.0

Ответ №1:

Не используйте CPaintDC. Он специализирован для использования только в обработчике сообщений WM_PAINT. Вместо этого вы можете использовать CClientDC.

Комментарии:

1. Большое вам спасибо. На этот раз они оба что-то рисуют.