※自鯖に置いてた奴を引っ張ってきました。
やあ。Haiku OSのα3版ですってよ?むかーしBeOS触ってた時を思い出しますな。アプリケーションしか触ってなかったけどな!あの当時は最も素敵なOSでしたよ…。そんな過去を思い出すような中々素敵なOSに仕上がってます。現状でもそこそこ使えますね。いやでもWindows(しかも色々カスタマイズ)に慣れまくってしまった体にはUIの違いは中々に厳しいw
では少し遊んでみましょう(遊ぶ = プログラムを組む)。とりあえず窓を出してみましょうかね。コンソールから文字列を指定して表示させます。
#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
ファイル名をtest2.cppで保存してと。コンパイルは、
gcc test2.cpp -lbe
"-lbe"忘れてて、暫く悩みましたw 結果はこんな感じですよ↓
実機じゃねーのかよって?いやー今んとこは仮想マシンでw Terminalが日本語処理で駄目なのはまあしょうがない?あと解説があやふやなのもしょうがないですね。3ヶ月も前の話など覚えとらんw
WindowsよりはAPIが系統立っていて分かりやすいかと思います。そうそう、Haiku OSの不満…窓が平気で画面外に表示されるのは何とかならんかね…w 後は多ボタンマウスに機能割り当て出来るようにしてくれ!
Windowsがどんどん妙な方向へ向かっているような気がする現在、代替OSとして台頭してほしいところですね。