@node VObjectSubclass, Variable Index, VObjectClass, Top
@comment  node-name,  next,  previous,  up
@chapter VObjectの各種サブクラス

この章では，@code{VObject}の各種サブクラスに固有の機能について説明する。

@menu
* VDisplay::                    
* VWindow::                     
* VAlignView_VHAlignView_VVAlignView::  
* VButton::             
* VRadioButton::       
* VDraw::                       
* VSlider::                       
* VScrollView::                       
@end menu

@node VDisplay, VWindow, VObjectSubclass, VObjectSubclass
@comment  node-name,  next,  previous,  up
@section VDisplay

@deftypemethod VDisplay {static VDisplay*} get_main_display ()
@code{VDisplay}は一つのみインスタンス化される。このメソッドは，そのインスタンスを返す。
@end deftypemethod

@deftypemethod VDisplay {virtual VError} accept_child_ex (long type, VObject* obj)
@code{VDisplay}に追加できる子は@code{VWindow}のみ。
@end deftypemethod

@node VWindow, VAlignView_VHAlignView_VVAlignView, VDisplay, VObjectSubclass
@comment  node-name,  next,  previous,  up
@section VWindow

@deftypemethod VWindow {virtual bool} attempt_close ()
ユーザがウィンドウを閉じようとした際，OS / ツールキットから呼び出される。
コールバックが登録されていれば，それを呼び出す。されていなければtrueを返す。
OS/ツールキット側は，この関数が@var{true}を返せばウィンドウをそのまま閉じてよいが，@var{false}の場合はウィンドウを閉じるのを中止する。
@end deftypemethod

@deftypemethod VWindow {virtual void} set_window_close_handler (VWindowCloseHandler(handler), void* user_arg)
ウィンドウが閉じられるときに，@code{attempt_close}から呼び出されるコールバック関数を登録する。
@code{VWindowCloseHandler(handler)}はマクロで，@code{bool(*handler)(const VWindow*, void* user_arg)} という型を表す。この型を持つ関数に@code{VWindow}へのポインタ(this)と@var{user_arg}が渡される。
コールバック関数が@var{true}を返せばウィンドウはそのまま閉じるが，@var{false}の場合はウィンドウを閉じるのが中止される。
@end deftypemethod

@emph{VWindowAttr}
@example
enum VWindowAttr @{
    resizable = 0x1,
    floating = 0x2,
    modal = 0x4
@};
@end example
@code{VWindow}のステータス@var{attr}には，上記の定数のOR値が指定できる。定数の意味は下記の通り。

@var{resizable}：ウィンドウサイズをユーザが可変にする（そうでなければ@var{min_size}に固定）

@var{floating}：フローティングウィンドウにする

@var{modal}：モーダルウィンドウにする（もっとも手前にあり，このウィンドウが閉じるまで他のウィンドウが操作できなくなる）

@node VAlignView_VHAlignView_VVAlignView, VButton, VWindow, VObjectSubclass
@comment  node-name,  next,  previous,  up
@section VAlignViewとVHAlignView, VVAlignView

@code{VAlignView}クラスは，@code{VHAlignView}と@code{VVAlignView}のスーパークラスである。この2つのサブクラスはウィンドウの生成だけを担い，あとはスーパークラスで処理している。

@node VButton, VRadioButton, VAlignView_VHAlignView_VVAlignView, VObjectSubclass
@comment  node-name,  next,  previous,  up
@section VButton

@code{VButton}クラスは，@code{VPushButton}など，ボタン類のスーパークラスである。それらに共通な処理だけを扱い，それ以外はサブクラスで実行される。

各サブクラスのset_status, get_statusは，サブクラスに特有な処理以外はVButtonクラスに任せている。

@node VRadioButton, VDraw, VButton, VObjectSubclass
@comment  node-name,  next,  previous,  up
@section VRadioButton

@deftypemethod VRadioButton {virtual void} set_radio_group (VRadioButton* group)
ラジオボタンのグループを設定する。所属させたいグループに含まれるボタンの一つをgroupに渡せばよい。
同一グループに含まれているボタンが全てオフになっている場合、このラジオボタンはオンになる。逆に、グループ内にすでにオンになっているボタンがあれば、このボタンはオフになる。
所属しているグループを記録するために、VRadioGroupInfoという機種依存の型がv_m.hで定義され、VRadioButtonオブジェクトのメンバ変数@var{radio_group}になっている。
@end deftypemethod

@deftypemethod VRadioGroupInfo {virtual void} get_radio_group ()
protectedメソッド。このボタンが所属するグループの情報を返す。

VRadioGroupInfoは、v_m.hで定義される機種依存の値である。扱いも機種によって異なる。。
この型の情報は、このメソッドとset_radio_groupメソッド以外では使用されない。
@end deftypemethod

@node VDraw, VSlider, VRadioButton, VObjectSubclass
@comment  node-name,  next,  previous,  up
@section VDraw

セットされた@code{VImage}を操作するためのメソッド，マウスイベントを取り扱うためのメソッドを持つ。

@deftypemethod VDraw {virtual VError} set_image (VImage* img)
イメージをセットする。@var{img}の参照カウントを1増やす。また，もしすでに保持しているイメージがあれば，その参照カウントを1減らす（0になれば解放される）。
@end deftypemethod

@deftypemethod VDraw {virtual VImage*} draw_start (bool img_draw_start=true)
セットされたイメージを引数にv_image_begin_drawを呼び出し，またVDrawオブジェクトをロックする。
@end deftypemethod

@deftypemethod VDraw {virtual void} draw_end (bool img_draw_end=true)
セットされたイメージを引数にv_image_end_drawを呼び出し，またVDrawオブジェクトをアンロックする。
@end deftypemethod

@deftypemethod VDraw {virtual void} set_mouse_event_handler (VMouseEventHandler(handler), void *user_arg)
@code{VDraw}に対して行われたマウス操作イベントを扱うイベントハンドラを登録する。
@code{VMouseEventHandler(handler)}はマクロで，

@example
bool (*handler)(VObject* object, VMouseEvent* event, void* user_arg)
@end example

というコールバック関数の型を表す。
@code{VMouseEvent}構造体は下記のように定義されている。

@example
struct VMouseEvent
@{
    VMouseEventType type;
    long            time;
    VPoint          point;
    short           button;
    short           modifiers;
@};
@end example

@var{type}はイベントタイプを示し，

@example
enum VMouseEventType @{
    V_EV_MOUSE_DOWN,
    V_EV_MOUSE_UP,
    V_EV_MOUSE_MOVE,
    V_EV_MOUSE_ENTER,
    V_EV_MOUSE_LEAVE,
    V_EV_MOUSE_DOUBLE_CLICK
@};
@end example

が定義されている。
@var{time}はイベントが発生した時刻（OS/ツールキットによって単位などが異なる）である。
@var{point}はイベントが発生したときのオブジェクトの左上の点からのカーソルの相対位置である。
@var{button}は押された／離された／押されているボタンの種類で，@code{v_types.h}で定義される@var{V_BUTTON_1}といった値（のOR値）である。
@var{modifiers}は，押されているモディファイアキーに該当する，@code{v_types.h}で定義される@var{V_MODKEY_XXX}のOR値である。

V_EV_MOUSE_MOVE，V_EV_MOUSE_UPイベントは，ユーザがドラッグ中は，オブジェクトの外にポインタが出た場合でもドラッグを開始した位置のオブジェクトが取り扱うので注意。
@end deftypemethod

@deftypemethod VDraw bool mouse_event (VMouseEvent *event)
@code{VDraw}に対応する場合は，OS / ツールキット側からのコールバックなどで上記のような@code{VMouseEvent}構造体を作り，該当するオブジェクトのこのメソッドを呼び出す。
@end deftypemethod

@node VSlider, VScrollView, VDraw, VObjectSubclass
@comment  node-name,  next,  previous,  up
@section VSlider

@deftypemethod VSlider {static VSlider*} create (const VObjectStatus *s, int flags, int min, int max, int steps, int* err=0)
@var{min} : スライダーによって設定される値(@var{value})の最小値

@var{max} : スライダーによって設定される値の最大値

@var{steps} : スライダーによって設定される値の最小単位

スライダーの作成時に、上記の値を渡すことが必要である。
@end deftypemethod

@node VScrollView, , VSlider, VObjectSubclass
@comment  node-name,  next,  previous,  up
@section VScrollView

@deftypemethod VScrollView {virtual void*} set_internal_size (const VSize size)
スクロールビュー内に配置する子のサイズを設定する。

スクロールビュー自体がこの大きさよりも小さくなった時のみスクロール可能になる。
スクロールビューの方が大きいと，子の大きさはスクロールビューのサイズに合わせて設定値よりも大きくなる。
@end deftypemethod

@deftypemethod VScrollView {virtual VSize} get_internal_size ()
スクロールビュー内に配置する子のサイズを取得する。
スクロールビューの方がset_internal_sizeで設定した値よりも大きくなると，設定値よりも大きい値を返す。
@end deftypemethod

@emph{VScrollViewAttr}
@example
enum VWindowAttr @{
                h_always = 0x0,
                h_automatic = 0x1,
                h_never = 0x2,
                v_always = 0x00,
                v_automatic = 0x10,
                v_never = 0x020
@};
@end example
@code{VScrollView}のステータス@var{attr}には，作成時に上記の定数のOR値が指定できる。定数の意味は下記の通り。

@var{h_always}：水平方向のスクロールバーを常に表示する

@var{h_always}：水平方向のスクロールバーを，内側の大きさの設定値の方がビューよりも大きい場合のみ表示する

@var{h_always}：水平方向のスクロールバーを常に表示しない。（内側の大きさは上記の場合と同様であるため，子の一部が表示できなくなることがある）

@var{v_always}：垂直方向のスクロールバーを常に表示する

@var{v_always}：垂直方向のスクロールバーを，内側の大きさの設定値の方がビューよりも大きい場合のみ表示する

@var{v_always}：垂直方向のスクロールバーを常に表示しない。（内側の大きさは上記の場合と同様であるため，子の一部が表示できなくなることがある）
