【问题标题】:X11 Why I can't draw any text?X11 为什么我不能画任何文字?
【发布时间】: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 的绘图原语。进行更多研究是个好主意。

标签: c linux text x11


【解决方案1】:

您对XLoadQueryFont字体路径参数错误(在我的 Linux/Debian 桌面上)。使用xlsfonts 命令检查正确的(它们都是小写的)。

  myFont = XLoadQueryFont 
      (myDisplay,
        "-misc-fixed-medium-r-normal--9-90-75-75-c-60-iso10646-1");

它可以工作得更好。也可以试试"lucidasanstypewriter-bold-14"

最重要的是传递给XDrawString 的坐标是错误的。请记住,它们是您的文本基线的坐标。而 x=0, y=0 是窗口的左上角,y 正在向下 增长,x 正在增长到 em>对。因此,您的文本被绘制在窗口之外,在其顶部上方。所以 y 应该是正数并且大于字体高度。

试试

  XDrawString (myDisplay, myWindow, myGC, 15, 20, hello,
           strlen (hello));

正如我所说,您需要处理 很多 更多事件。


我没有使用 Linux 上的窗口应用程序的经验。

并且要了解 GUI 编程,我强烈建议首先使用一些 toolkit,例如 GTKQtSDL

原始的 X11 编程太难了(到你学习的时候它会过时,例如 Wayland),特别是因为 X11 应用程序需要是 ICCCM &EWMH 兼容。请注意,整个 X11 文档需要将近一万页。

另见https://tronche.com/gui/x/xlib/

顺便说一句,大多数 Linux GUI 应用程序都在绘制像素图客户端并将其发送到 X11 服务器。阅读compositing window managers。在实践中不再使用像XDrawString 这样的绘图请求。最近与字体相关的库,如 libfontconfiglibXft 等正在 client 端工作。

【讨论】:

  • 非常感谢!你说得对,我应该先学API的窗口编程
  • PS:现在可以使用更改的参数,也无需更改字体
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
相关资源
最近更新 更多