【发布时间】:2020-06-04 16:15:59
【问题描述】:
我正在尝试使用 X11/Xlib 创建一个 Hello World 程序,但是当我调用 XDrawString() 时,它不会绘制“Hello world!”在窗口中。我需要改变什么才能做到这一点?
编辑: 我的完整代码如下。当问题描述是“主要是代码”时,StackOverflow 不会让我提交问题,所以我还将在代码下方解释程序打算做什么。
代码:
#include <X11/Xlib.h>
#include <X11/keysym.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
//Open default display
Display *display = XOpenDisplay(NULL);
if(display != NULL)
{
//Get default screen
Screen *screen = DefaultScreenOfDisplay(display);
if(screen != NULL)
{
//Initialize window
Window window = XCreateSimpleWindow(display, RootWindowOfScreen(screen), 0, 0, WidthOfScreen(screen), HeightOfScreen(screen), 0, BlackPixelOfScreen(screen), BlackPixelOfScreen(screen));
XSelectInput(display, window, KeyPressMask || ExposureMask);
XStoreName(display, window, "Hello World!");
XMapRaised(display, window);
//Initialize graphics context
GC graphics_context = DefaultGCOfScreen(screen);
//Event handling loop
XEvent event;
while(1)
{
XNextEvent(display, &event);
if(event.type == KeyPress)
{
//KeyPress event
if(event.xkey.keycode == XKeysymToKeycode(display, XK_Escape))
{
XDestroyWindow(display, window);
XCloseDisplay(display);
exit(EXIT_SUCCESS);
}
}
else if(event.type == Expose)
{
//Expose event (window is visible)
char *msg = "Hello world!";
XDrawString(display, window, DefaultGCOfScreen(screen), 0, 0, msg, strlen(msg));
}
}
XDestroyWindow(display, window);
}
XCloseDisplay(display);
}
exit(EXIT_FAILURE);
}
此代码旨在
打开默认显示;
获取此显示器的默认屏幕
在默认显示上创建一个简单窗口作为屏幕根窗口的子窗口,x 和 y 归零,宽度和高度分别等于屏幕的默认宽度和高度,0 宽度边框,边框和窗口背景都用屏幕黑色像素的颜色着色
选择曝光事件和按键作为窗口接受的输入
存储名称“Hello World!”在窗口中
映射并升起窗口
获取屏幕的默认图形上下文
在无限循环中处理事件,当用户按下 Escape 键或绘制“Hello world!”时以成功状态退出到窗口曝光窗口
如果打开显示器失败或显示器默认屏幕为NULL,则以失败状态退出
【问题讨论】:
-
请张贴所有代码,以便我们重现您正在做的事情。你有类似geeks3d.com/20120102/… 的东西吗?
-
@pifor 我最初尝试将我使用的所有代码添加到描述中,但 StackOverflow 阻止我这样做,因为我的问题是“主要是代码”。我可以尝试编辑问题描述以添加我正在使用的所有代码并更彻底地注释它
-
@pifor 我已经提交了所有代码