1

XLibに基づいたGUIアプリケーションプログラミングを直接研究し始め、画面の中央にウィンドウを作成しようとしています。私はこれを達成するために使用される通常の技術を知りません。私のコード(動作しません)はこれです(私は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が、何か間違ったことをしているようです。あるいは、OS関連の問題であるに違いありません。
ご協力いただきありがとうございます!

更新
X(左の位置)を100、y(上の位置)を100変更しましたが、ウィンドウの位置は変更されません。ですから、私の問題は、ウィンドウの位置が何であっても変更できないことです。

4

2 に答える 2

5
  1. 重力は、親ウィンドウ内の位置ではなく、ウィンドウ自体のコンテンツと子に適用されます。
  2. ウィンドウマネージャーは、トップレベルのウィンドウ位置要求をオーバーライドできます。XMoveWindow 通話後に使用しXMapWindowます。
于 2012-09-17T19:38:32.237 に答える
1

ウィンドウを作成する関数では、画面内のウィンドウの開始x、y座標を計算する必要があります。

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

その後、ウィンドウを中央に配置するための計算(... / 2 + win.size.x ....など)を行う必要があります。

于 2017-03-29T13:21:48.720 に答える