我正在努力学习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;
}
谢谢你的帮助!
答案 0 :(得分:5)
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或GTK或Qt 等SDL。
原始X11编程太难了(当你学习它时将会过时,例如Wayland),特别是因为X11应用程序需要是ICCCM&amp;符合EWMH。请注意,整个X11文档需要近一万页。
另见https://tronche.com/gui/x/xlib/
BTW,大多数Linux GUI应用程序都在绘制pixmap客户端并将其发送到X11服务器。阅读compositing window managers。像XDrawString
这样的绘图请求在实践中不再使用了。最近的字体相关库(如libfontconfig
,libXft
等)正在客户端方面工作。