※自鯖に置いてた奴を引っ張ってきました。
やあ。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として台頭してほしいところですね。