我正在使用FLTK 1.3.2在C++中编写应用程序。这是我使用,使在Windows 7的主窗口透明代码或8:如何使用FLTK在Windows,Mac OS X和Linux中使窗口透明?
// 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);
然后创建我,可可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
And 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碳。关于OS X,Carbon API(FLTK使用的)已经过时了很长一段时间。你需要标记一个有经验的老灰胡子。 – Darren 2014-11-01 06:13:07
谢谢,达伦。我自己找到了OS X解决方案,但我会发布一个关于Linux的单独问题。 – Remy 2014-11-01 23:32:40
这与GTK +有什么关系? – ntd 2014-11-02 08:52:27