0
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

COBOLでGUIプログラミングもどき

いろいろ勉強不足でした、またまたウンコードしか書けませんでした。

そうそうたる面々の中でネタ記事すら書くことができなくてごめんなさい。
FUN Advent Calendar 23日目担当のnRiokiです。
(ちなみに先日はmashaさんでした。http://mashaencount.hatenablog.jp/entry/2016/12/22/164606)
んで、やろうとしたことはタイトルの通りでCOBOLでウィンドウ表示してチョメチョメしたかったんです。
結果は全然でした。ちーん。
でもまぁ一応""COBOLから""ウィンドウを生成することに成功(?)したので備忘録の如く書いてみます。
ちなみにOpen COBOL 1.1.0を用いてます。

COBOLでウィンドウを表示してみよう

できました。
af.png

       identification division.
       program-id. CALL-TEST.
       data division.
       working-storage section.
       01 numeri PIC 9(4). 
       procedure division.
           move 0721 to numeri.
           call 'sub1' using by value numeri.
           display "Hello After C".
           stop run.
//http://7ujm.net/X/XSTEP1.html いなば様より拝借 一部改変
#include<X11/Xlib.h>
#include<X1C1/Xutil.h>
#include<math.h>
//描画
void paint(Display*d,Window w,int screen,GC gc){
    XClearWindow(d,w);
    XDrawString( d, w, gc, 1, 10, "Hello", 5);
    XFlush( d );
}

void sub1(int numeri){
    Display *d;
    Window  w;
    int screen;
    XSetWindowAttributes attr;
    GC gc;
    int width = 2;
    int height = 10;
    printf("%04d\n", numeri);

    d = XOpenDisplay( NULL );//Xサーバーに接続する
    screen=DefaultScreen(d);
    //ウインドウの作成
    w = XCreateSimpleWindow( d, RootWindow(d,screen),
                        0, 0, 100, 100,//ウインドウのサイズ
                        1,BlackPixel(d,screen),//枠の設定
                        WhitePixel(d,screen));//背景色の色番号

    //ウィンドウの内容を記憶
    attr.backing_store = WhenMapped;
    XChangeWindowAttributes( d, w, CWBackingStore, &attr); 

    //ウインドウ名の設定
    XStoreName(d, w, "test Window");
    XSetIconName(d, w, "test Window");

    //グラフィックコンテキストを取得
    gc = XCreateGC( d, RootWindow( d,screen ), 0, 0); 

    XEvent event;
    //イベントマスクを登録
    XSelectInput( d, w,ButtonPressMask | ExposureMask ); 

    //マップして表示
    XMapWindow( d, w );
    XFlush( d );

    while(1){
        XNextEvent( d, &event );
        switch(event.type){
            case ButtonPress://画面上でマウスのボタンが押された時
                XDestroyWindow( d, w);//終了処理
                XCloseDisplay( d );
                exit(0);            
                break;
            case Expose://再描画要求               
                paint(d,w,screen,gc);//再描画    
                break;
            default:
                break;
        }
    }
}

はい、誰がなんというとCOBOLからウィンドウが生成されましたね。

まとめ

あまりの出来に酒でも飲まないとこんな記事書いてられません。
やってみたかったことではありますが、記事にして公開するには大分中身のないものになってしまいました。
ライブラリの場所の指定さえ間違わなければGUIに限らずCで使えるものであればなんでもできそうです。
今回はそれがわかっただけでも良しとします。させてください…
正直時間までに間に合わなかった感は否めない(warningでたままとか)ので今後の課題とさせてください。
来年こそはCOBOLでゲームやらGUIツールてきなものを作ります。
明日はクリスマスイブですね、shield-9様
http://www.adventar.org/calendars/1350#list-2016-12-24
よろしくお願いします。

参考元

COBOL2002 使用の手引 手引編,http://itdoc.hitachi.co.jp/manuals/3000/30003D0800/GD080001.HTM ,日立製作所様
プログラミング色々,http://7ujm.net/ ,いなば様

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
0
Help us understand the problem. What are the problem?