<   2004年 09月 ( 2 )   > この月の画像一覧

[CoveredCalc for BeOS] 表示しないウィンドウ

ここ数日(と言っても 1 日に数十分しかかけてないけど)初期状態では表示しないウィンドウをどうやって生成したらいいのか悩んでました。
BWindow はコンストラクタで生成した時点では、ウィンドウも非表示だし、そもそもスレッドが開始しておらずメッセージループも回っていません。また、コンストラクタを呼び出したスレッドによってロックされた状態になっています。
初回の Show() を呼び出すことで、スレッドが開始し、それによってメッセージループが回ります。また、ロックも解除されます。

しかし、カバーブラウザウィンドウは生成したあと、すぐには表示したくなかったのです。
(ユーザの操作によって表示状態の切り替えを行うので。デフォルトは非表示です。)

1) 生成時、Show() を呼ばずに放っておく。

→ ユーザの操作で Show() を呼び出すと、ウィンドウを生成したスレッド(今回の場合、BApplication のスレッド)とユーザの操作によるメッセージを受信したウィンドウのスレッドが違うので、初回の Show() で行われるロック解除に失敗しました。

2) 生成時、Show() を呼ばずに、Unlock() してみる。

→ ユーザの操作で Show() を呼び出すと、結局、ユーザの操作によるメッセージを受信したウィンドウのスレッドがロックしてないので、初回の Show() で行われるロック解除に失敗しました。

3) 生成時、Show() を呼ばずに、Unlock() して、Show() するときに初回であればロックする。

→ 初回の Show() かどうかを自分で判断しなければならないわけで、…それはイヤ。(試してません)

4) 生成時、Show() を呼ばずに、Run() を呼んでやる。(呼ぶなと Be Book に書いてあった気がするが)

→ ユーザの操作で Show() を呼び出してもうまくいった。…かのように見えたのですが、そのウィンドウのスレッド名に "w>" がついてません。通常は初回の Show() が何かやってるに違いありません。他の影響もまだ見えてないだけで、いずれ問題になりそうなので却下。

5) 【解決】生成時、一度 Hide() を呼んでから Show() を呼んでやる。

→ Hide() と Show() はカウンタを持っているので、Hide() → Show() だと、それをする前と同じ状態になります。つまり、非表示状態のままです。でも、その Show() は初回の Show() として認識されるようで、"w>" 付きのスレッドも生成されるし、ロックも解除されたようです。

とりあえず、これで解決できた、と思っています。
[PR]
by hironytic | 2004-09-16 13:06 | 開発状況

[CoveredCalc for BeOS] UI をどうしようかな

ビルドは少し前に通るようになりました。
ビルドが通ったからといって、ウィンドウやビューにやってきたメッセージをハンドリングする部分を実装しないと意味がないのでした。

というわけで、キーボードのハンドリングとマウス右クリックのハンドリングを行うことで、キーボードによる電卓上のキーの入力とマウス右クリックのコンテキストメニューが出るようになりました。
コンテキストメニューの方は、[最小化] と [閉じる] は動きますが、[カバーブラウザ] や [バージョン情報] が動きません。

ここで、カバーブラウザもバージョン情報もウィンドウの UI を作る必要があるので、InterfaceElements などのツールを使いたいところです。さて何を使おうかと…。

さらに、Windows 版のカバーブラウザでは、カバーの一覧部分に列のあるリスト(OS 標準の List-View Control)を使っているんですが、BeOS だと標準では提供されていません。
自分で一から実装するのは大変なので、ググってみると Santa's gift bag の ColumnListView を使うか、Vision のソースに含まれている BColumnListView を使うという選択肢があるようです。
それと、もう一つ、カバー名と説明くらいしか表示してないんだから、幅固定で単なる BListView を使うというのもあります。
ちょっとこのあたりで悩み中…。
[PR]
by hironytic | 2004-09-06 21:12 | 開発状況