Как сделать окно прозрачным в Windows, Mac OS X и Linux с помощью FLTK?

Я пишу приложение на 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);

person Remy    schedule 01.11.2014    source источник
comment
Вероятно, вам следует разделить это на два вопроса: один для X11/XLib и один для Mac OS Carbon. Что касается OS X, API-интерфейсы Carbon (которые использует FLTK) уже давно устарели. Вам нужно будет остановить старого седобородого, у которого есть опыт в этом деле.   -  person Darren    schedule 01.11.2014
comment
Спасибо, Даррен. Я сам нашел решение для OS X, но я задам отдельный вопрос о Linux.   -  person Remy    schedule 02.11.2014
comment
Какое это имеет отношение к GTK+?   -  person ntd    schedule 02.11.2014


Ответы (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 от 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);
person Remy    schedule 03.11.2014