如何使用 FLTK 在 Windows、Mac OS X 和 Linux 中使窗口透明?

Posted

技术标签:

【中文标题】如何使用 FLTK 在 Windows、Mac OS X 和 Linux 中使窗口透明?【英文标题】:How can I make a window transparent in Windows, Mac OS X, and Linux using FLTK? 【发布时间】:2014-11-01 05:10:48 【问题描述】:

我正在使用 FLTK 1.3.2 用 C++ 编写应用程序。这是我用来在 Windows 7 或 8 上使主窗口透明的代码:

// Given:
// Fl_Window *my_fltk_window;
// bool is_transparent;

HWND hwnd = fl_xid(my_fltk_window);
LONG_PTR exstyle = GetWindowLongPtr(hwnd, GWL_EXSTYLE);
if (!(exstyle & WS_EX_LAYERED)) 
    SetWindowLongPtr(hwnd, GWL_EXSTYLE, exstyle | WS_EX_LAYERED);

SetLayeredWindowAttributes(hwnd, 0, is_transparent ? 192 : 255, LWA_ALPHA);

它工作得很好:我将该代码放在一个回调函数中,将它分配给一个按钮或菜单项,然后单击它来切换窗口透明度。但是,我希望这是跨平台的,但没有使用 OS X 或 Linux API 的经验。 Windows代码的效果应该怎么做?


编辑:我让它在 OS X 中工作。主文件调用这个函数:

#include "my-cocoa-wrappers.h"

setWindowTransparency(my_fltk_window, is_transparent ? 0.75 : 1.0);

然后我创建了 my-cocoa-wrappers.h

#ifndef MY_COCOA_WRAPPERS_H
#define MY_COCOA_WRAPPERS_H

#include <FL/x.H>
#include <FL/Fl_Window.H>

void setWindowTransparency(Fl_Window *w, double alpha);

#endif

还有 my-cocoa-wrappers.mm

#import <Cocoa/Cocoa.h>

#include "my-cocoa-wrappers.h"

void setWindowTransparency(Fl_Window *w, double alpha) 
    [fl_xid(w) setAlphaValue:alpha];

Makefile 已经负责将 my-cocoa-wrappers.mm 编译为 Objective-C 而不是 C++。


编辑 2:这是一个 Linux by Sanel Zukan 的解决方案,它只依赖于 X11,而不是我预期的 GTK+:

Atom atom = XInternAtom(fl_display, "_NET_WM_WINDOW_OPACITY", False);
uint32_t opacity = is_transparent ? 0xC0000000 : 0xFFFFFFFF;
XChangeProperty(fl_display, fl_xid(my_fltk_window), atom, XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&opacity, 1);

【问题讨论】:

您可能应该将其拆分为两个问题:一个针对 X11/XLib,另一个针对 Mac OS Carbon。关于 OS X,Carbon API(FLTK 使用的)已经过时了一段时间。你需要举报一个有这方面经验的老灰胡子。 谢谢,达伦。我自己找到了 OS X 解决方案,但我将发布一个关于 Linux 的单独问题。 这和 GTK+ 有什么关系? 【参考方案1】:

这是Mac OS X的解决方案。主文件调用这个函数:

#include "my-cocoa-wrappers.h"

setWindowTransparency(my_fltk_window, is_transparent ? 0.75 : 1.0);

然后我创建了 my-cocoa-wrappers.h

#ifndef MY_COCOA_WRAPPERS_H
#define MY_COCOA_WRAPPERS_H

#include <FL/x.H>
#include <FL/Fl_Window.H>

void setWindowTransparency(Fl_Window *w, double alpha);

#endif

还有 my-cocoa-wrappers.mm

#import <Cocoa/Cocoa.h>

#include "my-cocoa-wrappers.h"

void setWindowTransparency(Fl_Window *w, double alpha) 
    [fl_xid(w) setAlphaValue:alpha];

Makefile 已经负责将 my-cocoa-wrappers.mm 编译为 Objective-C 而不是 C++。


这是一个 Linux by Sanel Zukan 的解决方案,它只依赖于 X11,而不是我预期的 GTK+:

Atom atom = XInternAtom(fl_display, "_NET_WM_WINDOW_OPACITY", False);
uint32_t opacity = is_transparent ? 0xC0000000 : 0xFFFFFFFF;
XChangeProperty(fl_display, fl_xid(my_fltk_window), atom, XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&opacity, 1);

【讨论】:

以上是关于如何使用 FLTK 在 Windows、Mac OS X 和 Linux 中使窗口透明?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 上安装 FLTK?

在 Mac 10.8.3 上安装 fltk

FLTK - Mac iOS 图像未显示

如何使用代码块安装 fltk

Windows下使用VS2017搭建FLTK开发环境

FLTK:窗口聚焦在 MacOS 上时的事件