• 締切済み

X11に関して質問です。ウィンドウの属性の情報。

ウィンドウの属性の情報を知るプログラムを教えてください。 参考ページ:http://xjman.dsl.gr.jp/man/man3/XGetWindowAttributes.3x.html XGetWindowAttributes関数の使い方がよくわかりません。 XWindowAttributes構造体の一つ目のメンバの値を端末に表示するにはどうすればいいでしょうか? #include <X11/Xlib.h> #include <X11/Xutil.h> #include <stdio.h> #include <stdlib.h> int main() { Display *display; Window w; GC gc; XEvent event; XWindowAttributes *window_attributes_return; /* ディスプレイ・サーバに接続 */ display = XOpenDisplay(NULL); if(display == NULL){ fprintf(stderr, "Cannot open display.\n"); exit(1); } /* ウィンドウを生成 */ w = XCreateSimpleWindow(display, DefaultRootWindow(display), 50, 50, 400, 300, 1, BlackPixel(display, 0), WhitePixel(display, 0)); XSelectInput(display, w, ExposureMask); XMapWindow(display, w); /* GCの生成 */ gc = XCreateGC(display, w, 0, 0); /* リクエスト送信 */ XFlush(display); /* イベントループ */ while(1){ XNextEvent(display, &event); switch(event.type){ case Expose: XDrawLine(display, w, gc, 0, 0, 300, 300); /* ウィンドウの属性の情報を知る?? */ XGetWindowAttributes(display, w, window_attributes_return); printf("%d", window_attributes_return.x); break; } } /* Xサーバとの接続を解除 */ XCloseDisplay(display); return 0; }

みんなの回答

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.1

そもそもコンパイル通るのか疑問ですが、少なくとも XWindowAttributes window_attributes_return; XGetWindowAttributes(display, w, &window_attributes_return); でないとおかしいです。またリファレンスマニュアルの見方も理解できてないように思えます。*_return となってるポインタ引数は、呼び出しサイドでメモリ確保するのが前提です。

purogu2017
質問者

お礼

回答有難うございます。

関連するQ&A

  • X11に関して質問です。ウィンドウIDの表示。

    /* ウィンドウIDを表示 */ printf("%d\n", w); の部分でウィンドウID(XCreateSimpleWindow関数が返す値)を表示したいのですがエラーが出ます。 表示するにはどうすればよいでしょうか? #include <X11/Xlib.h> #include <X11/Xutil.h> #include <stdio.h> #include <stdlib.h> int main() { Display *display; Window w; /* ディスプレイ・サーバに接続 */ display = XOpenDisplay(NULL); if(display == NULL){ fprintf(stderr, "Cannot open display.\n"); exit(1); } /* ウィンドウを生成 */ w = XCreateSimpleWindow(display, DefaultRootWindow(display), 50, 50, 400, 300, 1, BlackPixel(display, 0), WhitePixel(display, 0)); /* ウィンドウIDを表示 */ printf("%d\n", w); return 0; } ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー エラー内容 ウィンドウ生成要求.c: In function ‘main’: ウィンドウ生成要求.c:24:2: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘Window’ [-Wformat=] printf("%d\n", w);

  • グラフィックスの出力ができません(Xlib,FreeBSD,KDE)

    Xのクライアントアプリケーションを作成しています。 線を描画したいと思い、 #include <X11/Xlib.h> #include <X11/Xutil.h> #include <stdio.h> main(){ Display *display; Window window; GC gc; unsigned long foreground,background; display = XOpenDisplay(NULL); foreground = BlackPixel(display,0); background = WhitePixel(display,0); window = XCreateSimpleWindow(display,RootWindow(display,0),0,0,500,400,0,0,background); XMapWindow(display,window); gc = XCreateGC(display,window,0,0); XSetForeground(display,gc,foreground); XSetBackground(display,gc,background); XSetLineAttributes(display,gc,10,LineSolid,CapRound,JoinRound); XDrawLine(display,window,gc,0,0,500,400); XFlush(display); getchar(); } のようなプログラムを書きました。 しかし、実行してもウィンドウは表示されるのですが肝心の線が描画されません。 ccからは何もいわれませんでした。 gccで試しても駄目でした。 その他、円も長方形もすべて表示できません。 ネットから拾ってきたサンプルプログラムでは表示されますので、このソースのどこかが 間違っているのでは?、と思いここで質問させていただくことにしました。 環境はFreeBSS5.4 KDE です。 どうして線が描画できないのでしょうか。おしえてください。

  • Xlibでウィンドウを作る

    https://ja.wikipedia.org/wiki/Xlibに載っているプログラムで質問です。 ただウィンドウを表示させたい場合に /*イベントループ*/ の部分は必要なのでしょうか? この部分をなくすとウィンドウが表示されません。 イベントループがなくてもウィンドウを表示させることはできますか? /* ウィンドウに四角形を描画する簡単な Xlib アプリケーション */ #include <X11/Xlib.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { Display *d; int s; Window w; XEvent e; /* サーバとのコネクションを開く */ d=XOpenDisplay(NULL); if(d==NULL) { printf("Cannot open display\n"); exit(1); } s=DefaultScreen(d); /* ウィンドウ生成 */ w=XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 100, 100, 1, BlackPixel(d, s), WhitePixel(d, s)); /* 受け付けるイベントの種類を選択 */ XSelectInput(d, w, ExposureMask | KeyPressMask); /* ウィンドウを可視化 */ XMapWindow(d, w); /* イベントループ */ while(1) { XNextEvent(d, &e); /* ウィンドウの描画と再描画 */ if(e.type==Expose) { XFillRectangle(d, w, DefaultGC(d, s), 20, 20, 10, 10); XDrawString(d, w, DefaultGC(d, s), 50, 50, "Hello, World!",strlen("Hello, World!")); } /* キー押下で終了 */ if(e.type==KeyPress) break; } /* サーバとのコネクションを閉じる */ XCloseDisplay(d); return 0; }

  • vine Linux4.2 X-windowのコンパイルについて

    vine Linux4.2を利用しており、X-Windowを使ってコンパイルを行ったところ エラーが多発してコンパイルできません。何か考えられる原因、あるいは解決策を御教授願えませんでしょうか。 プログラム sample.c #include <X11/Xlib.h> #define WIN_W 400 /* ウィンドウの幅 */ #define WIN_H 300 /* ウィンドウの高さ */ #define WIN_X 100 /* ウィンドウ表示位置(X) */ #define WIN_Y 100 /* ウィンドウ表示位置(Y) */ #define BORDER 2 /* ボーダの幅 */ int main( void ) { Display* dpy; /* ディスプレイ ( X サーバのこと) */ Window root; /* ルートウィンドウ ( デスクトップ ) */ Window win; /* 表示するウィンドウ */ int screen; /* スクリーン */ unsigned long black, white; /* 黒と白のピクセル値 */ XEvent evt; /* イベント構造体変数 */ /* Xサーバと接続する */ dpy = XOpenDisplay( "" ); /* ディスプレイ変数の取得 */ root = DefaultRootWindow( dpy ); screen = DefaultScreen( dpy ); /* 白、黒のピクセル値を取得 */ white = WhitePixel( dpy, screen ); black = BlackPixel( dpy, screen ); /* ウィンドウを作成する。この時点ではまだ画面に表示されない。*/ win = XCreateSimpleWindow( dpy, root, WIN_X, WIN_Y, WIN_W, WIN_H, BORDER, black, white); /* Xサーバから通知してもらうイベントを指定 ここではキー押下イベントを選択している */ XSelectInput( dpy, win, KeyPressMask ); /* ウィンドウを画面に表示する(マップする)。 */ XMapWindow( dpy, win ); /* XMoveWindow( dpy, win, WIN_X, WIN_Y ); */ /* Xサーバへのリクエストバッファをフラッシュする。 */ /* XFlush( dpy ); */ /* Xサーバからイベントを読みこんで随時処理していくイベントループ */ while( 1 ) { XNextEvent( dpy, &evt ); switch ( evt.type ) { case KeyPress: /* リソースの解放 */ XDestroyWindow( dpy, win ); XCloseDisplay( dpy ); return 0; } } } コンパイルコマンドについては gcc -I /usr/X11R6/include -L /usr/X11R6/lib -o sample sample.c -lX11 で行いました。 エラーについては /usr/X11R6/include/X11/Xlib.h:1083: 警告: data definition has no type or storage class /usr/X11R6/include/X11/Xlib.h:1085: error: 文法エラー before '*' token /usr/X11R6/include/X11/Xlib.h:1085: error: conflicting types for `font' /usr/X11R6/include/X11/Xlib.h:231: error: previous declaration of `font' /usr/X11R6/include/X11/Xlib.h:1085: 警告: data definition has no type or storage class /usr/X11R6/include/X11/Xlib.h:1085: error: 文法エラー before '}' token /usr/X11R6/include/X11/Xlib.h:1085: 警告: data definition has no type or storage class のような感じで大量にでてきています。よろしくお願いします。プログラムはネットから取ってきたものなので間違ってはいないと思います・・・。

  • ダイアログのOKボタンを押してウィンドウを生成する方法は?

    ダイアログのOKボタンを押すとウィンドウが生成する方法を教えてください。 MFCでプログラミングしてメインウィンドウをダイアロボックスにしています //アプリケーション class CMyApp : public CWinApp { public: virtual BOOL InitInstance(); }; //メインダイアログ class CMyDlg : public CDialog { public: CMyDlg(CWnd *pParentWnd=NULL); protected: virtual void OnOK(); virtual void OnCancel(); }; #include <afxwin.h> #include <afxdlgs.h> #include <string.h> #include "dlg.h" #include "resource.h" CMyApp myApp; BOOL CMyApp::InitInstance(){ m_pMainWnd = new CMyDlg; m_pMainWnd ->ShowWindow(m_nCmdShow); m_pMainWnd ->UpdateWindow(); return TRUE; } CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/) { Create("MYDLG"); } としています。 ダイアログはできるのですが、ここからウィンドウを生成する方法を教えてください

  • C言語のwin32に関する質問(

    以下のコードは、ウィンドウを表示し、そのウィンドウを閉じるとアプリケーションが終わると言うプログラムなのですが、これを実行しウィンドウを閉じると、パソコンがビジー状態になってしまいます このプログラムをどう書き換えれば正常に動いてくれのでしょうか,解る方が居たら教えてください ↓がそのプログラムのソースです #include <windows.h> #include<stdlib.h> LRESULT CALLBACK WndProc(HWND window,UINT msg,WPARAM wpalam,LPARAM lpalam) { switch (msg){ case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(window,msg,wpalam,lpalam); }; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow){ HWND window; MSG uketori; WNDCLASS usuary; usuary.style=CS_HREDRAW|CS_VREDRAW; usuary.lpfnWndProc= WndProc; usuary.cbClsExtra=0; usuary.cbWndExtra=0; usuary.hInstance=hInstance; usuary.hIcon=LoadIcon(NULL,IDI_APPLICATION); usuary.hCursor=LoadCursor(NULL,IDC_ARROW); usuary.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); usuary.lpszMenuName=NULL; usuary.lpszClassName=TEXT("testtest"); RegisterClass(&usuary); window= CreateWindow(TEXT("testtest"),TEXT("testtest"),WS_OVERLAPPEDWINDOW|WS_VISIBLE,5,8,500,500,NULL,NULL,hInstance,NULL); while(GetMessage(&uketori,window,0,0)){ DispatchMessage(&uketorri) }; return uketori.wParam; };

  • ウィンドウが閉じない

    お世話になります。 Adobe Illustratorは起動時にポップアップウィンドウを表示してプラグインを読み込む処理をリアルタイムに見せていますが、それに似た処理をしたいと思っています。 WinMain関数でポップアップウィンドウを生成した後メインウィンドウを生成し、メインウィンドウのWM_CREATEの最後でポップアップウィンドウを消すため ShowWindow(hhwnd, SW_HIDE); や DestroyWindow(hhwnd); を入れました。 ですが、ポップアップウィンドウが消えてくれません。 ポップアップウィンドウは winc.style = CS_HREDRAW | CS_VREDRAW; winc.lpfnWndProc = sWndProc; winc.cbClsExtra = winc.cbWndExtra = 0; winc.hInstance = hInst; winc.hIcon = NULL; winc.hCursor = LoadCursor(NULL, IDC_ARROW); winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); winc.lpszMenuName = NULL; winc.lpszClassName = TEXT("START"); HWND hhwnd = CreateWindowEx(  WS_EX_TOOLWINDOW,  "START", "",  WS_POPUP | WS_VISIBLE | WS_BORDER ,  0 , 0 , 1 , 1 , NULL , NULL ,  hInst , NULL ); で生成し、ウィンドウプロシージャ内は HDC hdc; PAINTSTRUCT ps; static RECT re; int w = 600; int h = 30; switch (msg) { case WM_CREATE:  MoveWindow(hWnd,   (GetSystemMetrics(SM_CXSCREEN)-w)/2,   (GetSystemMetrics(SM_CYSCREEN)-h)/2,   w, h, 1);  InvalidateRect(hWnd, NULL, 1);  break; case WM_PAINT:  hdc = BeginPaint(hWnd, &ps);  SetTextColor(hdc, RGB(0, 0, 0));  if (DrawText(hdc, str, -1, &re, DT_SINGLELINE | DT_CENTER | DT_VCENTER) == 0)   MessageBox(NULL, "err", "", NULL);  EndPaint(hWnd, &ps);  return 0; case WM_SIZE:  GetClientRect(hWnd, &re);  break; } return DefWindowProc(hWnd, msg, wp, lp); のようになっています。ポップアップウィンドウが消えないのはなぜでしょうか。。。

  • ウィンドウが開きません

     自分のホームページ上にテストを作って、その結果を別のウィンドウで出すようにしたいのですが、出ません。そのまま強引にアップロードして、そのページのソースを見てみたら、入れてないスクリプトが表示されました。 <script language="JavaScript"><!--function Symerror() {return true;}window.onerror = SymError; var SymRealWinOpen = window.open;function SymWinOpen(url,name,attributes){return(new Object());} window.open = SymWinOpen;//--></script> 見難くてすみませんが、これはウインドウが開かない理由がかかれているのでしょうか。どうやったらウインドウが表示されるでしょうか。ちなみにホームページ作成には本舗というDionのものを使っています。また、同じプログラムでマイドキュメント内ではちゃんと表示されます。

  • OpenCVでのプログラミングについての質問です

    Visual Studio2013でOpenCVを使えるようにし、現在USBカメラの映像をキャプチャする簡単なプログラムを作っています。 今は、 #include <opencv2/opencv.hpp> #include <opencv2/opencv_lib.hpp> #include <ctype.h> void Mouse( int event, int x, int y, int flags ,void *param); //マウス宣言 int main( int argc, char **argv) { // カメラからのビデオキャプチャを初期化する CvCapture *videoCapture = cvCreateCameraCapture( 1 ); cvSetCaptureProperty(videoCapture,CV_CAP_PROP_FRAME_WIDTH,1920); cvSetCaptureProperty(videoCapture,CV_CAP_PROP_FRAME_HEIGHT,1080); if( videoCapture == NULL ) { return -1; } // ウィンドウを作成する char windowName[] = "キャプチャ"; cvNamedWindow( windowName, CV_WINDOW_NORMAL|CV_WINDOW_FREERATIO ); // 何かキーが押下されるまで、ループをくり返す while( cvWaitKey( 1 ) == -1 ) { // カメラから1フレーム取得する IplImage *image = cvQueryFrame( videoCapture ); // ウィンドウに画像を表示する cvShowImage( windowName, image ); cvSetMouseCallback(windowName, Mouse); //マウスのコールバック関数登録 } // ビデオキャプチャを解放する cvReleaseCapture( &videoCapture ); // ウィンドウを破棄する cvDestroyWindow( windowName ); return 0; } void Mouse( int event, int x, int y, int flags ,void *param = NULL) // コールバック関数 { switch(event) { case CV_EVENT_LBUTTONDOWN: std::cout << x << "," << y << "\n"; //マウスの左クリックがされたときにその座標を読み込む break; default: break; } } このように記述し、新しいウィンドウにキャプチャしている映像を取得し、そのウィンドウ上でクリックされた座標を取得する、というプログラムになっています。 これを、 「クリックされた周辺一定範囲の映像を拡大して表示する」 というものにしたいのですが、プログラミング経験が浅く、調べながらいろいろ試行錯誤しても上手く動くプログラムを書くことができません。 どなたかアドバイスをいただけないでしょうか?

  • プログラミングで質問です。言語はC++です。

    いま、 While文でループし、Enterキーを おすとループから抜けます。 そこで、上矢印キー↑を押すと マウスカーソルがそれに応じて動くようなプログラムを while文でループさせたいのですが やり方がわかりません。 途中まで書いてみたのですが動きません。 詳しく教えていただけると嬉しいです。 #include <stdio.h> #include <windows.h> #include <Windows.h> int main( void ) { printf("roop in\n"); POINT po; while(1){ po.x=0; po.y=0; if( GetAsyncKeyState(VK_RETURN)) break; if(GetAsyncKeyState(VK_UP)&0x8000 <0) po.x+=7; Sleep(500); } printf("roop out\n"); return 0; }

専門家に質問してみよう