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

效果图:

SDL 实现透明悬浮窗的更多相关文章

  1. WindowManager 实现悬浮窗 详解

    WindowManager 实现悬浮窗 详解 一:对于想直接看效果的,可以看看我的demo app. 链接:http://sj.qq.com/myapp/detail.htm?apkName=com. ...

  2. Android悬浮窗实现 使用WindowManager

    Android悬浮窗实现 使用WindowManager WindowManager介绍 通过Context.getSystemService(Context.WINDOW_SERVICE)可以获得  ...

  3. 简易的可拖动的桌面悬浮窗效果Demo

    首先,我们需要知道,悬浮窗分为两种:Activity级别的悬浮窗,系统级别的悬浮窗 Activity级别的悬浮窗跟随所属Activity的生命周期而变化,而系统级别的悬浮窗则可以脱离Activity而 ...

  4. ANDROID 通过监听来电去电,并弹出悬浮窗

    要监听android打电话和接电话,有一种的是通过新建一个Receiver继承自BroadcastReceiver. 还有一种也可通过PhoneStateListener来实现.今天就说说后面一种,废 ...

  5. 微信网页悬浮窗交互效果的web实现

    一.微信的悬浮窗交互效果 微信更新后,发现多了个悬浮窗功能.公众号阅读,网页浏览回退后默认会出现.再点击,可以回到刚才阅读的地方.于是,再也不会遇到回复老婆的信息,再切换回来重新找刚才阅读东西的麻烦了 ...

  6. Android悬浮框,在Service中打开悬浮窗;在Service中打开Dialog;

    文章介绍了如何在Service中显示悬浮框,在Service中弹出Dialog,在Service中做耗时的轮询操作: 背景需求: 公司的项目现在的逻辑是这样的:发送一个指令,然后3秒一次轮询去查询这个 ...

  7. Android WindowManager实现悬浮窗效果 (一)——与当前Activity绑定

    最近有学生做毕业设计,想使用悬浮窗这种效果,其实很简单,我们可以通过系统服务WindowManager来实现此功能,本章我们来试验一下在当前Activity之上创建一个悬浮的view. 第一步:认识W ...

  8. Android仿腾讯手机管家实现桌面悬浮窗小火箭发射的动画效果

    功能分析: 1.小火箭游离在activity之外,不依附于任何activity,不管activity是否开启,不影响小火箭的代码逻辑,所以小火箭的代码逻辑是要写在服务中: 2.小火箭挂载在手机窗体之上 ...

  9. 手机QQ后台清理不掉的秘密——anddroid悬浮窗

    问题来自于一篇文章:手机QQ后台为何清不掉?MIUIproject师:全靠1像素的页面保命 出于好奇,想知道这一像素究竟是啥东西,用手机安全管家控制QQ的悬浮窗权限: 关闭QQ的悬浮窗权限,通过后台一 ...

随机推荐

  1. 练习2 J题 - 多项式求和

      Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   Description 多项式 ...

  2. 【关于JavaScript】常见表单用户名、密码不能为空

    在论坛等系统的用户注册功能中,如果用户忘记填写必填信息,如用户名.密码等,浏览器会弹出警告框,提示用户当前有未填信息. 这个典型的应用就是通过JavaScript实现的.如图所示是一个简单的用户注册页 ...

  3. ASP.NET(C#)常用数据加密和解密方法汇总

    一.            数据加密的概念 1.  基本概念 2.  基本功能 3.  加密形式 二.            数据加密的项目应用和学习 1.  媒体加密:DRM 2.  文件加密:文本 ...

  4. MATLAB中的结构数组

    MATLAB中的结构数组 结构数组: 结构是包含一组记录的数据类型,而记录则是存储在相应的字段中.结构的字段可以是任意一种MATLAB数据类型的变量或者对象.结构类型的变量也可以是一维的.二维的或多维 ...

  5. German Collegiate Programming Contest 2013:E

    数值计算: 这种积分的计算方法很好,学习一下! 代码: #include <iostream> #include <cmath> using namespace std; ; ...

  6. 解读Hashtable

    http://perhaps.cnblogs.com/archive/2006/01/06/312335.html 昨天看到了叶漂兄的Post:<Hashtable的烦恼!>,文中提出有关 ...

  7. insert时出现主键冲突的处理方法【转载】

    原文出处:http://hi.baidu.com/ytjwt/blog/item/1ccc2c26022b0608908f9d8c.html 使用"insert into"语句进行 ...

  8. java or spring +jython +python (Error:python.home,Determine if the following attributes are correct:)

    最近更新 :16年3月10日更 首先你在用JAVA,你需要运行Python,于是你找了Jython,我不介绍什么是Jythyon了 如何在Java中调用Python的方法,一百度一大堆, 如下:是一种 ...

  9. vs2008 提示msdbg.dll未正确安装的解决办法

    开始-->运行-->输入: regsvr32.exe "%ProgramFiles(x86)%\Common Files\Microsoft Shared\VS7Debug\ms ...

  10. WIA

    一台扫描仪,实际上就是一个Device对象,因此,我们可以通过DeviceManager来“获取”这台设备的“引用”,然后通过得到的Device对象,执行相应的扫描工作.从而跳过了使用ShowAcqu ...