//初始化SDL2和创建一个窗口,并且将屏幕绘制成大红色
#include <iostream>
extern "C"
{
#include <SDL.h>
}
//Refresh Event
#define REFRESH_EVENT (SDL_USEREVENT + 1)
#define BREAK_EVENT (SDL_USEREVENT + 2)
bool thread_exit = false;
int threadFunc(void *opaque)
{
thread_exit = false;
while (!thread_exit)
{
SDL_Event event;
event.type = REFRESH_EVENT;
SDL_PushEvent(&event);
SDL_Delay(40);
}
thread_exit = true;
//Break
SDL_Event event;
event.type = BREAK_EVENT;
//发送一个事件
SDL_PushEvent(&event);
return 0;
}
int main(int argc, char* argv[])
{
SDL_Window *windowScreen = NULL; //窗口
SDL_Surface *windowSurface = NULL;//窗口表面
SDL_Thread *refresh_thread; //SDL线程
SDL_Event event; //SDL事件
//初始化SDL2
if (SDL_Init(SDL_INIT_VIDEO) == -1)
{
std::cout << SDL_GetError() << std::endl;
return -1;
}
/* 创建窗口
*第一个参数是窗口的标题
*第二、三个参数指明了窗口的位置信息
*第四、五个参数是窗口的大小(宽、高)
*第六个参数是窗口的状态
*SDL_WINDOW_SHOWN--显示窗口
*SDL_WINDOW_BORDERLESS--显示无边框窗口
*/
windowScreen = SDL_CreateWindow("title", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 240, 400, SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);
if (!windowScreen)
{
std::cout << SDL_GetError() << std::endl;
return -1;
}
//创建线程
refresh_thread = SDL_CreateThread(threadFunc, NULL, NULL);
if (refresh_thread == NULL)
{
std::cout << SDL_GetError() << std::endl;
return -1;
}
//事件(消息)循环
while (true)
{
//等待一个事件(类似于WIN32里的GetMessage)
SDL_WaitEvent(&event);
if (event.type == REFRESH_EVENT)
{
/*填充窗口
*第一个参数是填充的目标表面
*第二个是填充的矩形区域(NULL则表示默认全部填充)
*第三个参数是填充矩形用的颜色
*/
SDL_FillRect(windowSurface, NULL, SDL_MapRGB(windowSurface->format, 0xFF, 0x00, 0x00));
//将窗口表面加载到窗口
SDL_UpdateWindowSurface(windowScreen);
}
else if (event.type == SDL_QUIT)
{
thread_exit = true;
}
else if (event.type == SDL_WINDOWEVENT)
{
// 获取窗口的表面
windowSurface = SDL_GetWindowSurface(windowScreen);
if (!windowSurface)
{
std::cout << SDL_GetError() << std::endl;
return -1;
}
}
else if (event.type == BREAK_EVENT)
{
break;
}
}
SDL_FreeSurface(windowSurface);
SDL_DestroyWindow(windowScreen);
SDL_Quit();
return 0;
}
/*配置
1.VC++目录 include lib dll
2.链接器->输入->附加依赖项 SDL2.lib SDL2main.lib
3.链接器->系统->子系统 窗口 (/SUBSYSTEM:WINDOWS) 控制台 (/SUBSYSTEM:CONSOLE)
4.C++->代码生成->运行库 /MD
编译
cl /MD /c c.cpp
链接
link /SUBSYSTEM:CONSOLE c.obj SDL2.lib SDL2main.lib
*/
SDL多线程显示更新窗口
最新推荐文章于 2024-09-15 07:08:54 发布