【发布时间】:2017-06-10 18:16:50
【问题描述】:
我正在努力学习X11。这对我来说很难,因为我没有在 Linux 上使用窗口应用程序的经验。
我写了一些简单的代码,我无法解决这个不可见的文本问题。
当我尝试使用 DrawRectangle 函数绘制矩形时,一切可能都运行良好。
代码如下:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <X11/Xlib.h>
int main()
{
Display* myDisplay;
Window myWindow;
int myScreen;
GC myGC;
XEvent myEvent;
unsigned long black, white;
char* hello = "Hello world!";
XFontStruct* myFont;
if((myDisplay = XOpenDisplay(NULL)) == NULL)
{
puts("Error in conneting to X Server!");
return -1;
}
myScreen = DefaultScreen(myDisplay);
black = BlackPixel(myDisplay, myScreen);
white = WhitePixel(myDisplay, myScreen);
myWindow = XCreateSimpleWindow(myDisplay, RootWindow(myDisplay, myScreen), 0, 0, 640, 320, 5, black, white);
XSelectInput(myDisplay, myWindow, ExposureMask);
XClearWindow(myDisplay, myWindow);
XMapWindow(myDisplay, myWindow);
myGC = XCreateGC(myDisplay, myWindow, 0, 0);
XSetForeground(myDisplay, myGC, black);
XSetBackground(myDisplay, myGC, white);
myFont = XLoadQueryFont(myDisplay, "-Misc-Fixed-Medium-R-Normal--7-70-75-75-C-50-ISO10646-1");
XSetFont(myDisplay, myGC, myFont->fid);
while(1)
{
XNextEvent(myDisplay, &myEvent);
if(myEvent.type == Expose)
{
XClearWindow(myDisplay, myWindow);
// HERE I DONT KNOW WHY IT DOESNT WORK!
XDrawString(myDisplay, myWindow, myGC, 0, 0, hello, strlen(hello));
}
}
XFreeGC(myDisplay, myGC);
XDestroyWindow(myDisplay, myWindow);
XCloseDisplay(myDisplay);
return 0;
}
感谢您的帮助!
【问题讨论】:
-
附带说明:您知道 X11 目前正在被 Wayland 取代吗? (es,我知道这需要数年,如果不是数十年)我不想说服您,但是学习更现代的图形系统不是更好吗?
-
@Olaf Ooo,很高兴知道。但是我看到很多应用程序是用X11写的,大概是linux窗口编程的基础,我想学习一下。你看到我的问题解决了吗?
-
今天,X11 已经很少使用这种方式了。在实践中,工具包(如 GTK 或 Qt)在客户端绘制像素图,并将该像素图传输到 X11 服务器。
-
顺便说一句,我猜你的字体路径(
XLoadQueryFont的参数)不正确。请与xlsfonts联系。您应该处理各种事件,包括错误事件 (XErrorEvent) -
@Davey:正如其他人指出的那样,X11 很难直接编程。使用工具包(我可以推荐 QT,其他人更喜欢 GTK)。它们从图形系统中抽象出来,例如 QT。在 Windows、Mac 和 Linux/Framebuffer 上运行(在嵌入式设备上很典型)。顺便说一句:这也包括 Wayland。另请注意,这些工具包不使用 X11 的绘图原语。进行更多研究是个好主意。