2014-11-01 113 views
1

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

你或許應該拆分這分成兩個問題:一個是X11/XLib和一個Mac OS碳。關於OS X,Carbon API(FLTK使用的)已經過時了很長一段時間。你需要標記一個有經驗的老灰鬍子。 – Darren 2014-11-01 06:13:07

+0

謝謝,達倫。我自己找到了OS X解決方案,但我會發佈一個關於Linux的單獨問題。 – Remy 2014-11-01 23:32:40

+0

這與GTK +有什麼關係? – ntd 2014-11-02 08:52:27

回答

0

這裏是Mac 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 

而且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);