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

时间:2014-11-01 05:10:48

标签: c++ linux macos user-interface fltk

我正在使用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);

1 个答案:

答案 0 :(得分:0)

以下是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);