SDL 实现透明悬浮窗
2024-10-14 11:12:55
最近一直想用SDL实现弹幕功能,但是一直没法实现悬浮窗和透明背景功能。
在一个老外的博客上发现了思路:EthioProgrammer: Applying transparency using win32 api, C++/SDL code
就是通过SDL_GetWindowWMInfo函数获取到窗口的HWND句柄,然后调用win32 api设置窗口的属性即可。
在别的平台也一样,调用系统api设置窗体属性。
有一点需要注意,目测只能用Surface,不能用Renderer,不然无法通过窗体colorKey实现透明背景。
代码如下:
#include <SDL2/SDL.h>
#include <SDL2/SDL_syswm.h>
#include <SDL2/SDL_video.h>
#include <windows.h> int main(int argc, char *argv[])
{
SDL_Window *window;
SDL_Renderer *renderer;
SDL_Surface *winSurface;
SDL_Event event;
int quit = ;
SDL_Rect rectRect = {,,,};
SDL_Rect backRect = {};
SDL_SysWMinfo info;
HWND hwnd; SDL_Init(SDL_INIT_EVERYTHING); window = SDL_CreateWindow("Test",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,,,SDL_WINDOW_SHOWN|SDL_WINDOW_BORDERLESS);
SDL_VERSION(&info.version);
if(SDL_GetWindowWMInfo(window,&info))
{
hwnd = info.info.win.window;
}
/*设置窗口colorkey*/
SetWindowLong( hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE)|WS_EX_LAYERED);
SetLayeredWindowAttributes( hwnd, RGB(,,),, LWA_COLORKEY);
/*设置窗口为悬浮窗 */
SetWindowPos ( hwnd, HWND_TOPMOST, , , , , SWP_NOMOVE|SWP_NOSIZE);
/*--------------*/
winSurface = SDL_GetWindowSurface(window);
SDL_GetWindowSize(window,&backRect.w,&backRect.h);
UINT32 keyColor = SDL_MapRGB(winSurface->format,,,);
SDL_SetSurfaceBlendMode(winSurface,SDL_BLENDMODE_NONE); while(!quit){
while(SDL_PollEvent(&event))
{
if(event.type == SDL_QUIT)
quit = ;
}
SDL_FillRect(winSurface,&backRect,keyColor);
rectRect.x+=;
SDL_FillRect(winSurface,&rectRect,SDL_MapRGB(winSurface->format,0xff,0x00,0x00));
SDL_UpdateWindowSurface(window);
SDL_Delay(/);
}
SDL_Quit();
return ;
}
效果图:
最新文章
- 网页访问全过程剖析[转].md
- SDN与NFV技术在云数据中心的规模应用探讨
- window下安装wamp环境
- css浏览器窗口大小
- 在redhat上搭建redmine
- 《高性能MySQL》
- MyBatis开发Dao
- [BZOJ 3626] [LNOI2014] LCA 【树链剖分 + 离线 + 差分询问】
- 优质办公体验,掌上OA一机hold住全场
- 转 json数组对象和对象数组
- 解决若要安装 Microsoft Office 2010,需要MSXML 版本 6.10.1129的问题
- python中strip函数的用法
- remove Nth Node from linked list从链表中删除倒数第n个元素
- 隐藏WIN10资源管理器中的3D对象文件夹
- Vue 2.3、2.4 知识点小结
- hdu 3068 最长回文(manacher&;amp;最长回文子串)
- class类的使用
- py-day1-3 python基本数据类型
- 【CAS单点登录视频教程】 第02集 -- 安装CAS
- 使用js命名空间进行模块式开发