gpt4 book ai didi

c - 如何在 XLib 中创建半透明的白色窗口

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:24 25 4
gpt4 key购买 nike

我想在 XLib 中创建一个半透明的白色窗口,但该窗口不是半透明的,它仍然是完全不透明的。我用的是compton compositor,系统有透明窗口,所以问题出在代码上:

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
Display* display = XOpenDisplay(NULL);

XVisualInfo vinfo;

XMatchVisualInfo(display, DefaultScreen(display), 32, TrueColor, &vinfo);

XSetWindowAttributes attr;
attr.colormap = XCreateColormap(display, DefaultRootWindow(display), vinfo.visual, AllocNone);
attr.border_pixel = 0;
attr.background_pixel = 0x80ffffff;

Window win = XCreateWindow(display, DefaultRootWindow(display), 0, 0, 300, 200, 0, vinfo.depth, InputOutput, vinfo.visual, CWColormap | CWBorderPixel | CWBackPixel, &attr);
XSelectInput(display, win, StructureNotifyMask);
GC gc = XCreateGC(display, win, 0, 0);

Atom wm_delete_window = XInternAtom(display, "WM_DELETE_WINDOW", 0);
XSetWMProtocols(display, win, &wm_delete_window, 1);

XMapWindow(display, win);

int keep_running = 1;
XEvent event;

while (keep_running) {
XNextEvent(display, &event);

switch(event.type) {
case ClientMessage:
if (event.xclient.message_type == XInternAtom(display, "WM_PROTOCOLS", 1) && (Atom)event.xclient.data.l[0] == XInternAtom(display, "WM_DELETE_WINDOW", 1))
keep_running = 0;

break;

default:
break;
}
}

XDestroyWindow(display, win);
XCloseDisplay(display);
return 0;
}

最佳答案

X11 需要预乘 颜色,即真正的不透明颜色需要乘以 alpha 值(并相应地缩放,即当 channel 宽度为 8 位时除以 256)。当您需要组合多个级别时,这种格式更容易使用。见公式here .当一切都预乘时,计算量更少。

因此,您需要将每个 R、G 和 B channel 乘以 alpha 值 (0x80),然后除以 256。

将背景设置为 0x80808080 会得到所需的结果:

注意结果与@patthoyts 的建议不同:这里只有窗口本身是半透明的,WM 装饰保持不透明;窗口本身和装饰都由 WM 透明化(并且 WM 进行必要的颜色混合)。

关于c - 如何在 XLib 中创建半透明的白色窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39505100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com