[当なアプリケーションを作ってみる]
-窓でも出してみるかの巻-

111113:初版
  1. Haiku OS α3だー

    ※自鯖に置いてた奴を引っ張ってきました。

    やあ。Haiku OSのα3版ですってよ?むかーしBeOS触ってた時を思い出しますな。アプリケーションしか触ってなかったけどな!あの当時は最も素敵なOSでしたよ…。そんな過去を思い出すような中々素敵なOSに仕上がってます。現状でもそこそこ使えますね。いやでもWindows(しかも色々カスタマイズ)に慣れまくってしまった体にはUIの違いは中々に厳しいw

  2. 窓だー

    では少し遊んでみましょう(遊ぶ = プログラムを組む)。とりあえず窓を出してみましょうかね。コンソールから文字列を指定して表示させます。

    #include<Application.h>
    #include<Window.h>
    #include<Rect.h>
    #include<View.h>
    #include<Font.h>
    
    class MyWindow;
    class MyView;
    
    class MyApplication : public BApplication {
    public:
    	MyApplication(int argc, char **argv);
    private:
    	MyWindow *w;
    };
    
    class MyWindow : public BWindow {
    public:
    	MyWindow(BRect frame, const char *title, window_type type, uint32 flags, int argc, char **argv);
    	virtual bool QuitRequested();
    private:
    	MyView *v;
    };
    
    class MyView : public BView {
    public:
    	MyView(BRect frame, const char *name, uint32 resizemode, uint32 flags, int aegc, char **argv);
    	virtual void Draw(BRect uodaterect);
    private:
    	char *ptr;
    };
    

    ここまで定型処理。includeも処理毎にすっきり。必要なクラスはBApplication、BWindow、BView。それぞれ派生クラスにしときます。

    MyApplication::MyApplication(int argc, char **argv) : BApplication("application/x-vnd.mokomoko"){
    	if(argc != 2){
    		exit(1);
    	}
    
    	w = new MyWindow(BRect(100, 100, 600, 180), "てすとー", B_TITLED_WINDOW, 0, argc, argv);
    	w->SetFlags(B_NOT_RESIZABLE | B_NOT_ZOOMABLE);
    	w->Show();
    }
    

    アプリケーションクラスのコンストラクタ。"てすとー"って言うタイトルのウィンドウを出してリサイズ/拡大縮小不可で表示します。引き渡しパラメータとしてargcとargv取ってます。一応こんな使い方も出来るのね。ベンダーIDは適当w

    MyWindow::MyWindow(BRect frame, const char *title, window_type type, uint32 flags, int argc, char **argv) : BWindow(frame, title, type, flags){
    	frame.OffsetTo(0, 0);
    	font_height height;
    	v = new MyView(frame, "Title", B_FOLLOW_NONE, B_WILL_DRAW, argc, argv);
    	AddChild(v);
    	v->GetFontHeight(&height);
    	ResizeTo(v->StringWidth(argv[1]), height.ascent + height.descent);
    }
    

    ウィンドウクラスのコンストラクタ。OffsetToで座標を合わせてるんだったか…忘れました。ビューを作成してウィンドウの子供として登録します。フォント高さを取り出してそれに合わせてWindowをリサイズします。

    bool MyWindow::QuitRequested(){
    	be_app->PostMessage(B_QUIT_REQUESTED);
    	return true;
    }
    

    windowクラスのQuitメッセージを処理です。これは定型処理。

    MyView::MyView(BRect frame, const char *title, uint32 resizemode, uint32 flags, int argc, char **argv) : BView(frame, title, resizemode, flags){
    	SetViewColor(128, 128, 128);
    	SetHighColor(128, 255, 128);
    	SetLowColor(0, 0, 0);
    	SetFontSize(40);
    	SetDrawingMode(B_OP_OVER);
    	ptr = argv[1];
    }
    

    ビュークラスのコンストラクタ。背景色やら表示色やらフォントサイズやらを設定しています。最初フォントの縁が超汚かったのですが、

    SetDrawingMode(B_OP_OVER);
    

    webで見つけた↑これ入れたら普通にアンチエイリアス掛かるようになりました。…標準のフォント描画モードがおかしい?詳細な事情はよく分かりませんが、とりあえずこれで見栄えよく描画できました。あとさりげなくパラメータ保存。

    void MyView::Draw(BRect update){
    	font_height height;
    	this->GetFontHeight(&height);
    	MovePenTo(0, height.ascent);
    	DrawString(ptr);
    }
    

    そしてViewクラスの描画処理。フォント描画はペンをフォントのascentまで移動させないと上方向に偏って描画されます。英語を手書きで書くときの下の線が描画の基準点のようです。これは知らないと面食らうね。で、後は引き渡された文字列の描画。

    int main(int argc, char **argv){
    	MyApplication a(argc, argv);
    	a.Run();
    	return 0;
    }
    

    main関数。んー見事に何も無いw アプリケーションクラスを作ってRunするだけーw とっても簡単w

  3. コンパイルだー

    ファイル名をtest2.cppで保存してと。コンパイルは、

    gcc test2.cpp -lbe
    

    "-lbe"忘れてて、暫く悩みましたw 結果はこんな感じですよ↓

    
    

    実機じゃねーのかよって?いやー今んとこは仮想マシンでw Terminalが日本語処理で駄目なのはまあしょうがない?あと解説があやふやなのもしょうがないですね。3ヶ月も前の話など覚えとらんw

  4. おわりだー

    WindowsよりはAPIが系統立っていて分かりやすいかと思います。そうそう、Haiku OSの不満…窓が平気で画面外に表示されるのは何とかならんかね…w 後は多ボタンマウスに機能割り当て出来るようにしてくれ!

    Windowsがどんどん妙な方向へ向かっているような気がする現在、代替OSとして台頭してほしいところですね。