四、xlib区域

X Window 系统的窗口显示原理 简介:本文介绍 X Window 系统的窗口显示原理。从一个简单的 X 客户端程序入手,介绍了窗口的创建接口 XCreateWindow 和显示接口 XMapWindow 的实现,并结合窗口管理器介绍了 X Server、X Client 和窗口管理器三部分交互的原理。 X Window 系统介绍 X Window 系统是一个基于网络的图形界面系统,它于 1984 年在麻省理工学院开发,有将近 20 年的应用历史。X Window 系统广泛的应用于桌面 Linux(如 Fedora、Debian、Ub. 阅读详情

系列文章目录

本系列文章记录在Linux操作系统下,如何在不依赖QT、GTK等开源GUI库的情况下,基于x11窗口系统(xlib)图形界面应用程序开发。之所以使用x11进行窗口开发,是在开发一个基于duilib跨平台的界面库项目,使用gtk时,发现基于gtk的开发,依赖的动态库太多,发布时太麻烦,gtk不支持静态库编译发布。所以我们决定使用更底层的xlib接口。在此记录下linux系统下基于xlib接口的界面开发

一、xlib创建窗口
二、xlib事件
三、xlib窗口图元
四、xlib区域
五、xlib绘制按钮控件
六、绘制图片
七、xlib窗口渲染
八、实现编辑框控件
九、异形窗口
十、基于xlib实现定时器
十一、xlib绘制编辑框-续
十二、Linux实现截屏小工具



在前一篇文章中,我们描述了如何利用xlib提供的接口以及Xft库进行文字渲染,图形基本元素(点,线,矩形,弧形)的绘制。但是我们并没有限制文本绘制的范围。在前面的例子中如果我们给了一个非常长的字符串,则字符串会一直显示,直到填满整个窗口的宽度。在实际开发中比如我们所使用的Labe控件,后面一般都会跟着一个编辑框控件,这样如果不对Label控件可绘制文本的范围进行限制,文本多时就会覆盖到后面编辑框控件中的内容。当然在xlib窗口系统中除了窗口和提供的绘制图形基本元素之外,xlib窗口系统没有Label、编辑框、按钮这些控件的概念,在xlib窗口系统中如果我们需要这些“控件”都需要我们自己编码实现,也许这就是为什么我每次让通义千问大模型给我使用xlib实现一些简单控件时,它总是让我使用gtk或是Qt这样高级库来实现。后面也会记录一些使用xlib实现button,编辑框这样的"控件"。

先来看一个简单的示例程序

#include <clocale>
#include <cstring>
#include <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xft/Xft.h>

void DoPaint(Display *display, Window window) {
    char drawText[] = "Draw Text...";
    char utf8String[] = "这是一个示例,我们将使用xlib和Xft库来实现文本的渲染。";
    int screen = DefaultScreen(display);
    XftColor    xftColor;
    xftColor.color.alpha=0xffff;
    xftColor.color.red = 0xffff;
    xftColor.color.green = 0;
    xftColor.color.blue = 0;
    XftFont *font = XftFontOpenName(display, screen, "文泉驿微米黑-20");
    XftDraw *xftDraw = XftDrawCreate(display,window,DefaultVisual(display,screen),DefaultColormap(display,screen));
    XftDrawStringUtf8(xftDraw,&xftColor,font,30,50,reinterpret_cast<const FcChar8*>(drawText),strlen(drawText));
    XftDrawStringUtf8(xftDraw,&xftColor,font,30,120,reinterpret_cast<const FcChar8*>(utf8String),strlen(utf8String));
    XftFontClose(display,font);
    XftDrawDestroy(xftDraw);
}


int main() {
    Display *display;
    Window window;
    int screen;
    XEvent event;

    display = XOpenDisplay(NULL);
    if (display == NULL) {
        fprintf(stderr, "无法打开X显示器\n");
        exit(1);
    }

    screen = DefaultScreen(display);
    window = XCreateSimpleWindow(display, RootWindow(display, screen), 10, 10, 400, 300, 1,
                                 BlackPixel(display, screen), WhitePixel(display, screen));

    /* 选择要接收的事件类型 */
    XSelectInput(display, window, ExposureMask);
    XMapWindow(display, window);

    while (1) {
        XNextEvent(display, &event);
        if (event.type == Expose) {
            DoPaint(display,window);
        }
    }

    XDestroyWindow(display, window);
    XCloseDisplay(display);

    return 0;
}

编译运行以上程序,我们需要安装X11和Xft的开发库,并且在编译时链接X11和Xft库。运行结果如下:

在这里插入图片描述

以上程序会一直向窗口中输出文本,直到整个文本占满整个窗口的宽度。如果上下两行都是Label我们下面显示的文字宽度与上面的Draw Text…对齐。对于多于的文本暂时并不想显示。我们可以设置绘制图形的有效区域来实现该功能。

1.矩形区域

在xlib窗口系统中可以通过XCreateRegion,以及XUnionRectWithRegion创建一个区域。区域创建后,我们还需要将其应用到某绘图上下文下才能实现我们想要的效果,如我们使用XftDraw系统绘制文本功能,则需要调用XftDrawSetClip来设置有效的绘制区域。当我们调用XDrawString、XDrawLine、XDrawRectangle、XDrawArc、XFill系列函数进行绘图时,需要调用XSetRegion函数来设置这些函数有效工作区域。以下是对上面的程序进行修改,设置有效绘制区域的代码

void DoPaint(Display *display, Window window) {
    char drawText[] = "Draw Text...";
    char utf8String[] = "这是一个示例,我们将使用xlib和Xft库来实现文本的渲染。";
    int screen = DefaultScreen(display);
    XftColor    xftColor;
    xftColor.color.alpha=0xffff;
    xftColor.color.red = 0xffff;
    xftColor.color.green = 0;
    xftColor.color.blue = 0;
    XftFont *font = XftFontOpenName(display, screen, "文泉驿微米黑-20");

    XftDraw *xftDraw = XftDrawCreate(display,window,DefaultVisual(display,screen),DefaultColormap(display,screen));
    XRectangle rectangle{30,20,150,120};
    Region region = XCreateRegion();
    XUnionRectWithRegion(&rectangle,region,region);
    XftDrawSetClip(xftDraw,region);
    XftDrawStringUtf8(xftDraw,&xftColor,font,30,50,reinterpret_cast<const FcChar8*>(drawText),strlen(drawText));
    XftDrawStringUtf8(xftDraw,&xftColor,font,30,120,reinterpret_cast<const FcChar8*>(utf8String),strlen(utf8String));
    XftFontClose(display,font);
    XDestroyRegion(region);
    XftDrawDestroy(xftDraw);
}

这里我们不再给出所有的代码,只给出绘制函数的代码。编译以上程序,运行效果如下:

在这里插入图片描述

这里通过设置有效工作区域,进行文本绘制时,在有效区域外的文本没有被显示到窗口中。

在xlib窗口系统中,和区域有关的函数有以下几个XCreateRegion、XPolygonRegion、XUnionRectWithRegion、XIntersectRegion、XSubtractRegion、XDestroyRegion.其中XCreateRegion用于创建一个区域,初始创建的区域没有有效区域的概念,所以我们创建一个区域后一般使用XUnionRectWithRegion来设置一个区域的左上角坐标和大小。XPolygonRegion给出多个顶点创建一个多边形的区域。XIntersectRegion用于计算两个区域交集区域,XSubtractRegion用于从一个有效区域中减少另一个有效区域。XDestroyRegion销毁区域。利用区域我们不仅可以设置绘制文本,图形元素的有效区域,还可以利用区域和xlib的Shape扩展结合实现一些异形窗口的绘制,后续我们将会展示如何利用区域实现圆角矩形窗口、圆形渐变窗口以及五角形窗口。

2.多边形区域

在xlib接口函数有绘制弧形、矩形的接口,但是如果我想创建一个弧形的区域。xlib就没有相关的接口函数了,如我想创建一个圆形的区域。我们就需要使用XPolygonRegion来近似一个圆形区域。这里我们实现过程使用通义千问大模型帮我们实现了个模拟圆形反锯齿功能,我们对大模型给出的代码进行了整理,并根据需要实现一个创建圆形区域的功能,下面给出实现代码,以下实现在测试的过程中发现给出的圆形仍然存在一定的锯齿情况。

#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

enum CircleCorner{
    TopLeft,
    TopRight,
    BottomRight,
    BottomLeft
};

static bool IsPointExistsInVector(vector<XPoint> &points, XPoint point){
    return std::find_if(points.begin(),points.end(),[&](const XPoint &iter){
        return iter.x == point.x && iter.y == point.y;
    }) != points.end();
}

#define DISTANCE() \
        sqrt(((px)-(cx))*((px)-(cx)) + ((py)-(cy))*((py)-(cy)))



#define TopLeft1()                         \
        do{                                             \
             px =    (cx) - (x) + (i);                        \
             py =    (cy) - (y) + (j);                        \
             point.x = px;                              \
             point.y = py;                              \
             double dist = DISTANCE(); \
             coverage = fmax(0, fmin(1, 0.5 - fabs(dist - r)));\
        }while(0);


#define TopLeft2()                         \
        do{                                             \
              px =       (cx) - (y) + (i);                    \
              py =       (cy) - (x) + (j);                    \
              point.x  = px;                            \
              point.y =  py;                            \
              double dist = DISTANCE();      \
              coverage = fmax(0, fmin(1, 0.5 - fabs(dist - r))); \
        }while(0);


//{cx + x + i, cy - y + j}, // 右-上-下
//                        {cx + y + i, cy - x + j}, // 右-上-上

#define TopRight1()                    \
        do{                                         \
              px = (cx) + (x) + (i);                \
              py = (cy) - (y) + (j);                \
              point.x = px;                         \
              point.y = py;                         \
              double dist = DISTANCE();  \
              coverage = fmax(0, fmin(1, 0.5 - fabs(dist - r)));\
        }while(0)


#define TopRight2()                            \
        do{                                                 \
             px = cx+y+i;                                   \
             py = cy-x+j;                                   \
             point.x = px;                                  \
             point.y = py;                                      \
             double dist = DISTANCE();               \
             coverage = fmax(0, fmin(1, 0.5 - fabs(dist - r))); \
        }while(0)


//{cx + x + i, cy + y + j}, // 右-下-下
//                        {cx + y + i, cy + x + j}, // 右-下-上

#define BottomRight1()              \
        do{                         \
            px = cx+x+i;            \
            py = cy+y+j;            \
            point.x = px;              \
            point.y = py;              \
            double dist = DISTANCE(); \
            coverage = fmax(0, fmin(1, 0.5 - fabs(dist - r)));\
        }while(0)


#define BottomRight2()              \
        do{                         \
            px = cx + y + i;         \
            py = cy + x + j;         \
            point.x = px;              \
            point.y = py;              \
            double dist = DISTANCE(); \
            coverage = fmax(0, fmin(1, 0.5 - fabs(dist - r)));\
        }while(0)


//{cx - x + i, cy + y + j}, // 左-下-下
//                        {cx - y + i, cy + x + j} // 左-下-上

#define BottomLeft1() \
        do{                         \
            px = cx -x + i;         \
            py = cy + y +j;         \
            point.x = px;              \
            point.y = py;              \
            double dist = DISTANCE(); \
            coverage = fmax(0, fmin(1, 0.5 - fabs(dist - r)));\
        }while(0)

#define BottomLeft2()           \
        do{                         \
            px = cx -y +i;         \
            py = cy + x +j;         \
            point.x = px;              \
            point.y = py;              \
            double dist = DISTANCE(); \
            coverage = fmax(0, fmin(1, 0.5 - fabs(dist - r)));\
        }while(0)   \


#define CONCAT(x,y) x ## y

#define CreateCorner(CornerType) \
        CONCAT(CornerType,1)();    \
        if(coverage>=0.30 && (!IsPointExistsInVector(circlePoints,point))){ \
            circlePoints.push_back(point);                    \
        }                                                                      \
        CONCAT(CornerType,2)();                                               \
        if(coverage>=0.30 && (!IsPointExistsInVector(circlePoints,point))){   \
            circlePoints.push_back(point);                                    \
        }


void GetRoundCornerPoints(int cx, int cy, int r, CircleCorner cornerType, vector<XPoint> &circlePoints){
    int x = 0, y = r;
    int d = 1 - r;
    int deltaE = 3, deltaSE = -2 * r + 5;

    while (x <= y) {
        // 处理当前点及其对称点
        for (int i = -1; i <= 1; i++) {
            for (int j = -1; j <= 1; j++) {

                int px,py;
                XPoint point;
                double coverage = 0.0;
                if(cornerType == TopLeft){
                    CreateCorner(TopLeft);
                }else if(cornerType == TopRight){
                    CreateCorner(TopRight);
                }else if(cornerType == BottomRight){
                    CreateCorner(BottomRight);
                }else if(cornerType == BottomLeft){
                    CreateCorner(BottomLeft);
                }
            }
        }

        // 更新决策变量
        if (d < 0) {
            d += deltaE;
            deltaE += 2;
            deltaSE += 2;
        } else {
            d += deltaSE;
            deltaE += 2;
            deltaSE += 4;
            y--;
        }
        x++;
    }
}

static Region CreateCircleRegion(int cx, int cy, int r) {
    vector<XPoint>   topLeftPoints;
    vector<XPoint>   topRightPoints;
    vector<XPoint>   bottomRightPoints;
    vector<XPoint>   bottomLeftPoints;

    GetRoundCornerPoints(cx,cy, r, TopLeft, topLeftPoints);
    GetRoundCornerPoints(cx,cy, r, TopRight, topRightPoints);
    GetRoundCornerPoints(cx,cy, r, BottomRight,  bottomRightPoints);
    GetRoundCornerPoints(cx,cy, r, BottomLeft, bottomLeftPoints);

    //左上角的四分之一圆,点按照x轴增大,y轴增大的方式排序
    std::sort(topLeftPoints.begin(),topLeftPoints.end(),[&](const XPoint &a,const XPoint &b){
        if(a.x == b.x){
            return a.y < b.y;
        }
        return a.x < b.x;
    });

    //右上角四分之一圆点,按照x轴增大,y轴减少的方式排序。
    std::sort(topRightPoints.begin(),topRightPoints.end(),[&](const XPoint &a, const XPoint &b){
        if(a.x == b.x){
            return a.y > b.y;
        }
        return a.x < b.x;
    });

    //右下角四分之上圆点,按照x轴减小,y轴增大方式排序
    std::sort(bottomRightPoints.begin(),bottomRightPoints.end(),[&](const XPoint &a, const XPoint &b){
        if(a.x == b.x){
            return a.y < b.y;
        }
        return a.x > b.x;
    });

    //左下角四分之一圆点,按照x轴减少,y轴减少排序
    std::sort(bottomLeftPoints.begin(), bottomLeftPoints.end(), [&](const XPoint &a, const XPoint &b){
        if(a.x == b.x){
            return a.y > b.y;
        }
        return a.x > b.x;
    });

    vector<XPoint> circlePoints;
    circlePoints.reserve(topLeftPoints.size() + topRightPoints.size() + bottomRightPoints.size() + bottomLeftPoints.size());
    std::copy(topLeftPoints.begin(),topLeftPoints.end(),std::back_inserter(circlePoints));
    std::copy(topRightPoints.begin(),topRightPoints.end(),std::back_inserter(circlePoints));
    std::copy(bottomRightPoints.begin(), bottomRightPoints.end(), std::back_inserter(circlePoints));
    std::copy(bottomLeftPoints.begin(), bottomLeftPoints.end(), std::back_inserter(circlePoints));

    return XPolygonRegion(circlePoints.data(), circlePoints.size(), EvenOddRule);
}

以上程序代码中的CreateCircleRegion就是创建一个圆形的区域。

结合DoPaint代码我们可以设置一个圆形区域,让文字只在这个圆形区域中显示,代码如下

void DoPaint(Display *display, Window window) {
    char line1[] = "line1 text in circle region";
    char line2[] = "Draw Text...";
    char line3[] = "这是一个示例,我们将使用xlib和Xft库来实现文本的渲染。";
    char line4[] = "line4 show the text,may be can't be seen";
    int screen = DefaultScreen(display);
    XftColor    xftColor;
    xftColor.color.alpha=0xffff;
    xftColor.color.red = 0xffff;
    xftColor.color.green = 0;
    xftColor.color.blue = 0;
    XftFont *font = XftFontOpenName(display, screen, "文泉驿微米黑-20");

    XftDraw *xftDraw = XftDrawCreate(display,window,DefaultVisual(display,screen),DefaultColormap(display,screen));
    Region region = CreateCircleRegion(100,100,80);

    XftDrawSetClip(xftDraw,region);

    XftDrawStringUtf8(xftDraw,&xftColor,font,30,50,reinterpret_cast<const FcChar8*>(line1),strlen(line1));
    XftDrawStringUtf8(xftDraw,&xftColor,font,30,80,reinterpret_cast<const FcChar8*>(line2),strlen(line2));
    XftDrawStringUtf8(xftDraw,&xftColor,font,30,120,reinterpret_cast<const FcChar8*>(line3),strlen(line3));
    XftDrawString8(xftDraw,&xftColor,font,30,150,reinterpret_cast<const FcChar8*>(line4),strlen(line4));
    XftFontClose(display,font);
    XDestroyRegion(region);
    XftDrawDestroy(xftDraw);
}

编译以上程序,这里我们用到了stl库,所以使用g++编译。运行结果示例如下:

在这里插入图片描述

通过结果我们可以看到只有在圆形区域的文字才被显示了出来。

最小二乘法(看完即会) 其中,X是数据矩阵,每一行是一个数据点,每一列是一个自变量(包括截距项),Y是观测值向量,β是待求的系数向量。为了找到使S最小的a和b的值,我们需要对S求关于a和b的偏导数,并令它们等于零。最小二乘法的数学公式通常用于线性回归问题,其中目标是找到一条直线(或更高维度的超平面),使得这条直线与给定数据点的误差平方和最小。同样地,通过求偏导数和令偏导数等于零,我们可以得到一个线性方程组,解这个方程组可以找到最优的b_0, b_1, …+ b_m*x_m,其中b_0是截距,b_1到b_m是各个自变量的系数。 阅读详情

相关推荐

从零开始构建AURIX TC397开发环境:硬件选型与IDE配置全攻略

本文详细介绍了如何从零开始构建AURIX TC397开发环境,涵盖硬件选型、IDE配置及外设驱动开发等关键步骤。针对TriCore架构的高性能特性,提供了开发板选型建议、AURIX Development Studio(ADS)安装配置指南,以及GPIO和CAN FD驱动的实战代码示例,帮助开发者快速上手TC397系列微控制器的开发工作。

7up55的博客 205

五、xlib绘制按钮控件

本文简单介绍了在linux操作系统如何不使用qt、gtk库的情况下,创建GUI程序,并在窗口中绘制按钮控件。xlib没有提供控件这类高级概念,我们可以通过直接在主窗口中绘制,或是子窗口的方式实现按钮控件绘制;直接绘制和子窗口方式绘制本质上没有区别,只是对于事件处理逻辑不同。这种绘制控件的思想与具体操作系统、或界面库无关,只要提供基本绘图元素和鼠标事件处理接口,我们可以在任意操作系统下,使用任意UI绘制控件。通过按钮控件的绘制我们提示了gtk、QT这样的UI库事件循环、高级控件的基本原理。

mxway的专栏 1298

数字电路实验避坑指南:如何正确搭建主从JK触发器测试电路(附Proteus仿真)

本文详细解析了主从JK触发器的工作原理及实验搭建指南,重点解决了常见的Catching Problem现象,并提供了Proteus仿真优化方案。通过元器件选型、电路连接步骤和常见错误排查,帮助读者正确搭建测试电路,确保数字电路实验的稳定性和可靠性。

weixin_30790841的博客 470

十、基于xlib实现定时器

本文介绍了如何在Xlib中实现定时器功能。由于Xlib本身不提供定时器支持,文章通过结合网络异步事件模型和Xlib的文件描述符,使用C++、最小堆和poll机制来实现定时器功能。首先,定义了一个定时器基类Timeout,包含定时器ID、过期时间、执行间隔等属性。接着,使用最小堆来管理定时器事件,确保最早过期的事件优先执行,并详细描述了最小堆的上移(ShiftUp)和下移(ShiftDown)操作。最后,在Xlib事件循环中,通过XPending和poll结合的方式,实现了非阻塞的事件处理与定时器触发。

mxway的专栏 872

SmartFusion从FPGA到ARM(九)——串口命令解析器的实现

系列教程:SmartFusion从FPGA到ARM系列教程 前面两节介绍了MSS_UART和CoreUARTapb的使用: MSS_UART的使用 CoreUARTapb的使用 MSS_UART和CoreUARTapb都支持中断和轮询方式获取串口接收的数据,对于串口中断服务函数,有时我们需要通过不同的串口指令去执行不同的动作,下面以CoreUARTapb为例,来实现一个简单的串口命令解析器。固定串口数据帧格式,帧长度不定。 串口数据帧格式:* + 数据 + #,对于数据中为参数的,可以自定义处理函数。例

whik1194的博客 1536

PostgreSQL:十五. 性能优化

十五. 性能优化 优化简介: PostgreSQL优化一方面是找出系统的瓶颈,提高PostgreSQL数据库整体的性能; 另一方面,需要合理的结构设计和参数调整,以提高用户操作响应的速度; 同时还要尽可能的节省系统资源,以便系统可以提供更大负荷的服务。 PostgreSQL数据库优化是多方面的,原则是减少系统的瓶颈,减少资源的占用,增加系统的反应速度。例如: 通过优化文件系统,提高磁盘IO的读写速度; 通过优化操作系统调度策略,提高PostgreSQL的在高负荷情况下负载能力; 优化表结构、索引、查询

数据知道的博客 4万+

一. xlib 创建窗口

本文介绍了如何在Linux操作系统下使用xlib创建GUI应用程序,并记录了将duilib移植到Linux下的过程。xlib是X Window System的C语言库,用于创建窗口、绘制图形和管理用户输入。文章详细讲解了如何使用xlib编写一个简单的图形应用程序,包括打开与X服务器的连接、创建窗口、处理事件以及销毁窗口等步骤。此外,还介绍了如何在Ubuntu系统下编译xlib程序,并对比了xlib与GTK、QT等现代界面框架的差异。

mxway的专栏 1618

【WiFi】T830 MT7992 WMM测试修改操作说明

WiFi WMM(Wi-Fi Multimedia)是Wi-Fi联盟推出的一项技术,用于优化无线网络中的多媒体内容传输。WMM通过优先处理不同类型的数据流来改善网络性能,特别是在网络拥堵时。:WMM通过提供服务质量支持,确保语音、视频和其他多媒体应用在无线网络中获得优先处理。这有助于减少延迟和抖动,改善用户体验。:WMM将数据流分为四个优先级队列:语音、视频、最佳效果(Best Effort)和背景(Background)。语音和视频流通常被赋予更高的优先级,以确保它们在网络中得到及时传输。

wgl307293845的博客 1021

十一、xlib绘制编辑框-续

本文介绍了如何进一步完善编辑框功能,包括实现插入光标眨眼、支持键盘左右键移动光标、鼠标选择显示插入光标点、从插入光标处插入和删除文字等功能。具体实现中,通过继承定时器基类 Timeout,创建 EditTimeout 类来处理编辑框的定时器事件,控制光标的显示与隐藏。通过 ShowCaret 函数实现光标的闪烁效果,并在 DoPaint 函数中清除编辑框区域以避免残留光标。最后,通过事件循环和非阻塞接口处理定时器超时事件,确保光标闪烁的流畅性。

mxway的专栏 1486

21天教你学会PCIe专栏(21)--总结和展望

回顾整个课程的主要内容和知识点总结PCIe技术的发展历程和现状展望PCIe技术的未来发展趋势和应用方向分享学习心得和实践经验1.1 课程回顾基础知识:了解了PCIe的基本概念、发展历程、标准和规范。分层结构:学习了PCIe的物理层、数据链路层和事务层的结构和功能。功能和特性:掌握了PCIe的热插拔、电源管理、多功能设备等高级功能。高速接口技术:学习了PCIe 4.0、5.0和未来趋势。实际案例分析:分析了GPU加速器和存储设备的PCIe设计和优化。常见问题和解决方案。

xiaoheshang_123的博客 672

YOLOv5改进 | 低照度检测 | 2024最新改进CPA-Enhancer链式思考网络(适用低照度、图像去雾、雨天、雪天)

本文给大家带来的2024.3月份最新改进机制,由CPA-Enhancer: Chain-of-Thought Prompted Adaptive Enhancer for Object Detection under Unknown Degradations论文提出的CPA-Enhancer链式思考网络CPA-Enhancer通过引入链式思考提示机制,实现了对未知退化条件下图像的自适应增强。该方法的核心在于能够利用CoT提示对图像退化进行动态分析和适应,从而显著提升物体检测性能。

Snu77的博客 2222

三、xlib窗口图元

本文介绍了如何在xlib窗口系统中绘制文本和图形元素。本文使用最简洁的代码展示了如何在xlib窗口系统中渲染文本。使用Xft库绘制特效文字。在xlib窗口系统中如何绘制点线、矩形、弧形。以及如何在xlib窗口系统使用颜色对一些特定区域进行填充。

mxway的专栏 898

18、地下矿山中人工智能在区分真实微震事件与噪声信号的应用

本文提出一种基于遗传编程(GP)的新型经验模型,用于地下矿山中真实微震事件与噪声信号(特别是爆破信号)的自动区分。针对传统方法和常见机器学习算法存在的黑箱问题、过拟合及准确性不足等局限,GP模型通过符号回归和进化机制生成可解释的数学表达式,具备自动特征选择能力,有效提升了分类准确率。研究使用包含100个样本的真实数据库,结合敏感性分析优化模型参数,并与线性判别分析(LDA)进行对比,结果表明GP模型在分类性能上更具优势。该模型可应用于实时微震监测系统,提高矿山安全生产水平,降低误判带来的成本开销,具有良好的

assembly8low的博客 95

七、xlib窗口渲染

本文介绍了如何在X Window系统中使用XRender扩展渲染带有透明度的PNG图片。由于默认的24位颜色深度窗口无法正确处理PNG的alpha通道,导致图片显示为黑色背景。解决这一问题有两种方法:一是创建支持32位颜色的窗口,二是使用XRender扩展。XRender不仅支持透明度绘制,还能实现图片混合和渐变窗口等复杂效果。文章提供了使用XRender渲染PNG图片的代码示例,包括加载PNG文件、创建Pixmap和Picture对象,并通过XRenderComposite函数将图片绘制到窗口上。

mxway的专栏 1269

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

XLib编程手册 ---- 简介

Xlib - C语言的X接口是一个参考指南,以低层C语言接口的X窗口系统协议。它既不是编写X Window系统的教程,也不是用户指南。相反,它提供了库中每个函数的详细描述以及相关背景信息的讨论。Xlib - C语言X Interface假定对图形窗口系统和C编程语言有基本的了解。其他高级抽象(例如,由工具包为X提供的抽象)构建在Xlib库之上。有关这些高级库的更多信息,请参阅适当的工具包文档。X ...

Linux应用程序开发的博客 8021

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Xlib 窗口属性

 引用 Xlib窗口属性       所有的 InputOutput窗口都可以有零个或者多个像素的边框宽度,一个可选的背景,一个事件压制掩码(它压制来自孩子的事件传播),和一个 property列表。窗口的边框和背景可以是一个实心颜色或者是一个称为平铺的调色板。除了根窗口之外的所有的窗口都有父亲并且都是由它们的父亲所裁剪。如果一个窗口是在压栈压在

osala的专栏 4029

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Xlib 学习笔记

Xlib 学习笔记 分类: XWindow 2011-06-07 09:42 2053人阅读 评论(0) 收藏 举报 protocolsserver图形deletebuffer网络 Xlib学习笔记 第一章 1.2X Window System概念 display:由键盘,鼠标和一个或多个屏幕组成的一个工作站 screen:一个display可以有多

middilestep的专栏 1774

Xlib/XWindow/X11关于输入法定位的资料说明

从描述来看,此处意思是:如果输入法初始化不是XIMPreeditPosition,就忽略XNSpotLocation。在WINDOWS上,候选框的坐标好像是屏幕上的;而LINUX上则是相对当前窗口的。两个关键字:XNSpotLocation、XIMPreeditPosition。从定义来看,各占一位,应该是可以共存(当然某些情形是冲突的)。这意思是说,如果设置了这个标志,就要求提供坐标。此处意思是使用哪个窗口的位置。如果使用了这个参数,可以不需要预编辑值就工作。这个开关跟别的都冲突?

柳鲲鹏 655

XLib编程注意事项

编程注意事项 主要的编程考虑事项是: X中的坐标和大小实际上是16位的量。这个决定是为了最小化给定性能级别所需的带宽。坐标通常在接口中声明为int。大于16位的值将被无声地截断。尺寸(宽度和高度)被声明为无符号量。 键盘是不同制造商工作站之间最大的变量。如果你想要你的程序是可移植的,你应该特别保守。 许多显示系统的离屏内存有限。如果可以,应该尽量减少使用Pixmap和缓存。 用户应该控制他的屏幕区...

Linux应用程序开发的博客 525

二、xlib事件

在Xlib窗口系统中,窗口创建后可以接收鼠标点击、键盘输入、窗口位置和大小改变等操作,这些操作由X Server以事件形式处理。客户端程序通过XPending和XNextEvent等C语言函数查询和处理事件。XPending以非阻塞方式立即返回待处理事件的数量,而XNextEvent会阻塞程序直到有事件发生。示例程序展示了如何使用XSelectInput设置窗口接收的事件类型(如ExposureMask和KeyPressMask),并通过事件循环处理Expose和KeyPress事件。

mxway的专栏 1186

十二、Linux实现截屏小工具

本文介绍了如何在Linux操作系统下基于xlib实现一个屏幕截图工具,详细介绍说明了如何创建一个能够覆盖全屏的窗口;获取屏幕桌面像素并保存为BMP图片,在实现过程中我们结合前面文章介绍的XRender扩展功能实现复杂效果的界面。在应对绘制时出现的闪烁现象,详细介绍如何使用集合运算来解决该问题。

mxway的专栏 1391

八、实现编辑框控件

在GUI应用程序中,实现编辑框控件需要处理复杂的键盘和鼠标事件。与使用高级UI库(如QT、GTK)不同,使用xlib开发需要手动组合底层接口来实现控件功能。本文介绍了如何在xlib下实现编辑框控件,重点包括接收输入法输入(支持中英文混合输入)、显示输入光标以及响应Backspace键。文章还提到了一些关键函数,如XOpenIM、XSetLocaleModifiers、XCreateIC等,用于处理输入法和文本渲染。此外,文章详细描述了编辑框的绘制过程,并提供了一个结构体UIEdit来存储编辑框的基本信息。

mxway的专栏 1336

六、绘制图片

本文介绍了如何在Linux系统下使用Xlib接口在窗口中绘制图片,并通过示例代码展示了两种不同的图片绘制方式。第一部分通过手动生成红色块图片,展示了如何分配内存并设置像素颜色,最终将图片绘制到窗口中。第二部分则演示了如何加载24位的BMP图片,并将其转换为适合Xlib显示的格式。通过这个示例,读者可以了解Xlib处理图片的基本原理,为后续更复杂的图像处理打下基础。

mxway的专栏 1227

九、异形窗口

文章摘要:本文介绍了如何在Xlib中创建非矩形窗口,特别是如何移除窗口的标题栏并实现窗口的移动功能。通过使用XCreateSimpleWindow创建窗口,并结合XChangeProperty移除窗口装饰,可以创建无标题栏的窗口。为了处理键盘事件,程序监听KeyPress事件,并在按下Esc键时退出。此外,通过XSendEvent发送ClientMessage事件,实现了窗口的拖动功能。文章还详细解释了operateCode参数的含义,用于控制窗口的移动和大小调整。

mxway的专栏 963

第八章 图形功能

8.1Clear and copy areas 8.1 清理和拷贝一个区域 Xlib provides functions that you can use to clear an area or the entire window. Because pixmaps do not have defined backgrounds, they cannot be filled by using the functions described in this section. Instead, to ac.

啊渊的专栏 556
上一篇: 三、xlib窗口图元
下一篇: 五、xlib绘制按钮控件
mxway
博客等级 码龄17年 370粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值