最近一直想用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. Git中从远程的分支获取最新的版本到本地

    Git中从远程的分支获取最新的版本到本地有这样2个命令: 1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge    git fetch origin mastergit l ...

  2. OC语言-03NSString

    /* 1. @"kite" 这是一个OC字符串,OC的字符串也是一个对象, 由NSString类(继承于NSObject) 创建 2. 输出时使用 %@ 3. 对象方法 [对象名 ...

  3. hg vs git :这个世界除了svn还有别的

    最近想用版本控制软件来保存汉化文件,但又觉得SVN太麻烦,于是想到了最近较为流行的分布式版本控制工具.而Git和Mercurial(意思为水银的,于是经常缩写为Hg)自然是其中最为流行的工具.大名鼎鼎 ...

  4. 如何用 React Native 创建一个iOS APP?

    诚然,React Native 结合了 Web 应用和 Native 应用的优势,可以使用 JavaScript 来开发 iOS 和 Android 原生应用.在 JavaScript 中用 Reac ...

  5. C语言常用数学函数及其用法

    转自:http://blog.sina.com.cn/s/blog_8b5a0d0001011779.html 三角函数:(所有参数必须为弧度)  1.acos 函数申明:acos  (double ...

  6. [wikioi]数字三角形

    http://wikioi.com/problem/1220/ 最基本经典的DP题目,唯一有点意思的是,自底向上计算会更简洁.另外对这种+方式累计的DP,可以直接把原来的存进去,然后再加,本质是不用在 ...

  7. css学习笔记二之inline-block

    1.inline-block是CSS2.1中新增的盒类型,在div中将display属性设定为"inline-block",则div显示效果与设置display属性为"i ...

  8. Oracle 日期处理

    select * from dt where dw_data=to_date(to_char(sysdate-1,'YYYY-MM-DD'),'YYYY-MM-DD') ---取前一天日期 SQL&g ...

  9. 如何将Java源代码文件的编码从GBK转为UTF-8?

    有时候看到有意思的demo,在头痛导入项目的编码和workspace的编码不一样的时候 我试着将 笔记本打开一个类一个类的复制, demo的类比较少的时候 可以忍受,demo的类多的时候 除了靠之外 ...

  10. 字符串(后缀数组):HAOI2016 找相同子串

    [HAOI2016]找相同子串 [题目描述] 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两个子串中有一个位置不同. [输入格式] 两行,两个字符 ...