C ++和Xlib – 中心窗口

我已经开始直接学习基于XLib的GUI应用程序编程,并且试图在屏幕上创build一个居中的窗口。 我不知道用来达到这个目的的常用技术。 我的代码(这是行不通的)是这样的(我使用CodeBlocks)

#include <stdio.h> #include <stdlib.h> #include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/Xos.h> #include <X11/Xatom.h> #include <X11/keysym.h> #include <GL/glew.h> #include <GL/freeglut.h> int screen; Display *display; XSetWindowAttributes window_attributes; Window mainwindow; XEvent events; int main(int argc, char** argv) { display = XOpenDisplay(NULL);screen = DefaultScreen(display); window_attributes.background_pixel = XWhitePixel(display, screen); window_attributes.border_pixel = XBlackPixel(display, screen); window_attributes.win_gravity = SouthWestGravity; mainwindow = XCreateWindow(display, RootWindow(display, screen), 1, 1, 600, 400, 0, CopyFromParent, InputOutput, CopyFromParent, CWBackPixel|CWBorderPixel, &window_attributes ); XMapWindow(display, mainwindow); XFlush(display); XSelectInput(display, mainwindow, ExposureMask|KeyPressMask|ButtonPressMask); while (1) { XNextEvent(display, &events); switch (events.type) { case Expose: // Lots of code that doesn't matter for my problem break; } } return 0; } 

所以,我认为window_attributes.win_gravity会做的伎俩,但似乎我做错了什么或它必须是一个操作系统相关的问题。
谢谢你的帮助!

UPDATE
我已经将X(左边的位置)改变了100,y(顶部的位置)改变了100,但窗口的位置没有改变。 所以,我的问题是窗口的位置不能改变,不pipe它是什么。

Solutions Collecting From Web of "C ++和Xlib – 中心窗口"

  1. 重力适用于窗口自己的内容和子项,而不是在父窗口中的位置。
  2. 窗口管理者可以并且可以覆盖顶层的窗口位置请求。 在XMapWindow调用之后使用XMoveWindow

在你创建窗口的函数中,你应该计算窗口在屏幕上的起始x,y坐标:

 XDisplayWidth(dpy, sreen); XDisplayHeight(dpy, sreen); 

之后,你应该使你的计算(如… / 2 + win.size.x ….)来居中你的窗口。