最近一直想用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 ;
}

效果图:

最新文章

  1. 网页访问全过程剖析[转].md
  2. SDN与NFV技术在云数据中心的规模应用探讨
  3. window下安装wamp环境
  4. css浏览器窗口大小
  5. 在redhat上搭建redmine
  6. 《高性能MySQL》
  7. MyBatis开发Dao
  8. [BZOJ 3626] [LNOI2014] LCA 【树链剖分 + 离线 + 差分询问】
  9. 优质办公体验,掌上OA一机hold住全场
  10. 转 json数组对象和对象数组
  11. 解决若要安装 Microsoft Office 2010,需要MSXML 版本 6.10.1129的问题
  12. python中strip函数的用法
  13. remove Nth Node from linked list从链表中删除倒数第n个元素
  14. 隐藏WIN10资源管理器中的3D对象文件夹
  15. Vue 2.3、2.4 知识点小结
  16. hdu 3068 最长回文(manacher&amp;amp;最长回文子串)
  17. class类的使用
  18. py-day1-3 python基本数据类型
  19. 【CAS单点登录视频教程】 第02集 -- 安装CAS
  20. 使用js命名空间进行模块式开发

热门文章

  1. 对c++服务端进行覆盖率统计
  2. 【C语言】重定向和文件
  3. java 转html为pdf
  4. Chain of Responsibility
  5. NSURLSession -- 实际开发中运用
  6. Junit 源码剖析(二)
  7. SqlServer 允许保存对数据库中表结构的修改
  8. iOS:实现表格填充和选择操作
  9. 提升网站用户体验—WebP 图片的高效使用
  10. 使用mysql-proxy代理实现msyql数据库读写分离