当前位置: 首页 > 面试题库 >

Xlib如何在启动画面中绘制字符串

龙学
2023-03-14
问题内容

这是我的代码,我无法跳出while(!done)函数

使用XFlush(d)可以显示显示窗体缓冲区,并且在XCloseDisplay(d)之前不会消失

我想像这样画画线

g ++ -o youname youcppname -lX11

#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(void)
{
    Display *d;
    Window w;
    XEvent e;
    const char *msg = "Hello, World!";
    int s;
    bool done = false;

    /* open connection with the server */
    d = XOpenDisplay(NULL);
    if (d == NULL)
    {
        fprintf(stderr, "Cannot open display\n");
        exit(1);
    }
    s = DefaultScreen(d);

    /* create window */
    w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 480, 320, 0,BlackPixel(d, s), WhitePixel(d, s));
    Atom type = XInternAtom(d,"_NET_WM_WINDOW_TYPE", False);
    Atom value = XInternAtom(d,"_NET_WM_WINDOW_TYPE_SPLASH", False);
    XChangeProperty(d, w, type, XA_ATOM, 32, PropModeReplace, reinterpret_cast<unsigned char*>(&value), 1);
    /* register interest in the delete window message */
    Atom wmDeleteMessage = XInternAtom(d, "WM_DELETE_WINDOW", False);
    XSetWMProtocols(d, w, &wmDeleteMessage, 1);

    /* select kind of events we are interested in */
    XSelectInput(d, w, ExposureMask | KeyPressMask | StructureNotifyMask);

    /* map (show) the window */
    XMapWindow(d, w);
    /* event loop */
    while (!done)
    {
        XNextEvent(d, &e);
        /* draw or redraw the window */
        if (e.type == Expose)
        {
            XDrawString(d, w, DefaultGC(d, s), 50, 50, msg, strlen(msg));
        }

        /* exit on key press */
        switch(e.type)
        {
        case KeyPress:
            XDestroyWindow(d, w);

        break;

        case DestroyNotify:
            done = true;
        break;

        case ClientMessage:
            if (e.xclient.data.l[0] == wmDeleteMessage)
            {
                done = true;
            }
        break;
        }
    }
    /* close connection to server */
    XCloseDisplay(d);

    return 0;
}

问题答案:

我不太确定为什么XFlush不起作用,但这是事件循环和冲洗的混合体。它等待暴露事件,绘制字符串并退出循环。

5秒钟后,它将取消映射窗口,然后5秒钟后退出。

#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(void)
{
    Display *d;
    Window w;
    XEvent e;
    const char *msg = "Hello, World!";
    int s;
    bool done = false;

    /* open connection with the server */
    d = XOpenDisplay(NULL);
    if (d == NULL)
    {
        fprintf(stderr, "Cannot open display\n");
        exit(1);
    }
    s = DefaultScreen(d);

    /* create window */
    w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 480, 320, 0,BlackPixel(d, s), WhitePixel(d, s));
    Atom type = XInternAtom(d,"_NET_WM_WINDOW_TYPE", False);
    Atom value = XInternAtom(d,"_NET_WM_WINDOW_TYPE_SPLASH", False);
    XChangeProperty(d, w, type, XA_ATOM, 32, PropModeReplace, reinterpret_cast<unsigned char*>(&value), 1);
    /* register interest in the delete window message */
    Atom wmDeleteMessage = XInternAtom(d, "WM_DELETE_WINDOW", False);
    XSetWMProtocols(d, w, &wmDeleteMessage, 1);

    /* select kind of events we are interested in */
    XSelectInput(d, w, ExposureMask);

    /* map (show) the window */
    XMapWindow(d, w);

    /* event loop */
    while (!done)
    {
        XNextEvent(d, &e);
        /* draw or redraw the window */
        if (e.type == Expose)
        {
            XDrawString(d, w, DefaultGC(d, s), 50, 50, msg, strlen(msg));
            done = true;
        }
    }
    XFlush(d);
    sleep(5);
    XUnmapWindow(d,w);
    XFlush(d);
    printf("unmapped\n");
    sleep(5);
    /* close connection to server */
    XCloseDisplay(d);

    return 0;
}


 类似资料:
  • 问题内容: 嗨,我是Java GUI的新手,正试图使启动屏幕或图像显示3秒钟。然后,它将进入我的主程序。是否有人有想法做到这一点,或者可以将我链接到任何教程? 到目前为止,我已经做到了这一点,但不确定从何而来。 问题答案: 最简单的方法是创建并添加您的内容,然后使用 试试这个代码: 或者, 您可以使用 SplashScreen 类创建一个启动画面 ****

  • 我编写了这段代码,可以在JavaFX画布上绘制。它可以很好地工作,但我不知道如何重新绘制画布(比如在Swing中),以便在新画布上重新开始绘制。这是我的代码,非常感谢你的帮助!马里奥

  • 虽然canvas的API并未直接提供支持动画的方法,但就其本身而言,在canvas中实现动画效果也很简单:只需要持续的更新并重绘画布就行了。这种持续的更新并重绘就叫做动画循环,它是所有动画的核心逻辑。 在canvas中实现动画,首先需要初始化画布上的对象。然后,启动一个动画循环来更新画布、清除画布、重绘画布,再请求下一个新的动画帧。Canvas动画的基本原理如图 4‑36 所示: 图4-36 ca

  • 本文向大家介绍C# Winform中如何绘制动画示例详解,包括了C# Winform中如何绘制动画示例详解的使用技巧和注意事项,需要的朋友参考一下 前言 这里介绍一个.net自身携带的类ImageAnimator,这个类类似于控制动画的时间轴,使用ImageAnimator.CanAnimate可以判断一个图片是否为动画,调用ImageAnimator.Animate可以开始播放动画,即每经过一帧

  • 问题内容: 我知道这是一个简单的概念,但是我在字体指标方面苦苦挣扎。水平居中不太困难,但垂直居中似乎有点困难。 我试过以各种组合使用FontMetrics的getAscent,getLeading,getXXXX方法,但是无论我尝试过什么,文本总是偏离几个像素。有没有一种方法可以测量文本的确切高度,以使其准确居中。 问题答案: 注意,您 确实 需要仔细考虑垂直居中的含义。 字体呈现在基线上,沿着文

  • 问题内容: 我想按画布画圆。这是我的代码: [MyActivity.java]: [View.java]: 所以我只有黑屏,没有圆圈。为什么不起作用?如何解决? 问题答案: 您可以覆盖视图的onDraw方法并绘制圆。 有关绘制自定义视图的更好参考,请查看官方的Android文档。 http://developer.android.com/training/custom-views/custom-