Я пишу приложение на C++, используя FLTK 1.3.2. Это код, который я использую, чтобы сделать главное окно прозрачным в 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);
Он отлично работает: я помещаю этот код в функцию обратного вызова, назначаю его кнопке или пункту меню, и щелчок по нему переключает прозрачность окна. Тем не менее, я бы хотел, чтобы это было кросс-платформенным, но у меня нет опыта работы с API-интерфейсами OS X или Linux. Что я должен сделать, чтобы соответствовать эффекту кода 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 от 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);