お待たせしました、画面サイズに合わせて表示範囲が変更されるように変更する
手順は以下の通りです
( No.3 でお話したような『機能の無効化』はしていませんでした )
例として『Stage Editor』の『オブジェクト一覧』をクリックすると表示される項目の
『オブジェクト一覧』のリストと『オブジェクトモデル一覧』のリストの表示の縦の範囲を
画面のサイズに合わせて変化するようにする場合は
1.まず StageEditor.cpp の 82行目あたりに以下の記述を追加して
SetWindowSizeChangeEnableFlag( TRUE, FALSE ) ;
『ウインドウのサイズは変更できるが、表示はサイズに合わせて拡縮されないようにする』設定を行います
2.StageEditor_Object.cpp の 132行目付近の『オブジェクト一覧』リストの初期化を行っている
以下の関数 ToolWindow_Create 呼び出しの
g_OEData.ListTWindow = ToolWindow_Create(
g_OEData.TSpaceManage, false, true, false, "オブジェクト一覧",
LIST_X, LIST_Y, LIST_W, LIST_H, LIST_W, LIST_H );
第3引数 LockSpace を true から false に変更します
g_OEData.ListTWindow = ToolWindow_Create(
g_OEData.TSpaceManage, false, false, false, "オブジェクト一覧",
LIST_X, LIST_Y, LIST_W, LIST_H, LIST_W, LIST_H );
( LockSpace を true にすると、画面サイズが変化しても表示範囲は変化させない設定になるので )
3.StageEditor_Object.cpp の 307行目付近の『オブジェクトモデル一覧』リストの初期化を行っている
以下の関数 ToolWindow_Create 呼び出しの
g_OEData.ModelListTWindow = ToolWindow_Create(
g_OEData.TSpaceManage, false, true, false, "オブジェクトモデル一覧",
MODEL_LIST_X, MODEL_LIST_Y,
MODEL_LIST_W, MODEL_LIST_H,
MODEL_LIST_W, MODEL_LIST_H
);
第3引数 LockSpace も true から false に変更します
g_OEData.ModelListTWindow = ToolWindow_Create(
g_OEData.TSpaceManage, false, false, false, "オブジェクトモデル一覧",
MODEL_LIST_X, MODEL_LIST_Y,
MODEL_LIST_W, MODEL_LIST_H,
MODEL_LIST_W, MODEL_LIST_H
);
4.StageEditor_Object.cpp の 499行目から始まる関数 StageEditor_Object_Step の冒頭に
以下のコードを追加します
// ウインドウのクライアント領域のサイズを取得
int ClientW, ClientH ;
GetWindowSize( &ClientW, &ClientH ) ;
// スペースマネージャにスペースの縦サイズを設定する
ToolSpaceManage_ChangeTotalSpace( g_OEData.TSpaceManage, ClientH ) ;
// ボタンを再配置する
ToolButton_SetPosition( g_OEData.AddTButton, BUTTONS_X + 4, BUTTONS_Y + 0 );
ToolButton_SetPosition( g_OEData.DelTButton, BUTTONS_X + 89, BUTTONS_Y + 0 );
ToolButton_SetPosition( g_OEData.AngleResetTButton, BUTTONS_X + 162, BUTTONS_Y + 26 );
ToolButton_SetPosition( g_OEData.AngleXPlusTButton, BUTTONS_X + 4, BUTTONS_Y + 26 );
ToolButton_SetPosition( g_OEData.AngleXMinusTButton, BUTTONS_X + 4, BUTTONS_Y + 46 );
ToolButton_SetPosition( g_OEData.AngleYPlusTButton, BUTTONS_X + 56, BUTTONS_Y + 26 );
ToolButton_SetPosition( g_OEData.AngleYMinusTButton, BUTTONS_X + 56, BUTTONS_Y + 46 );
ToolButton_SetPosition( g_OEData.AngleZPlusTButton, BUTTONS_X + 108, BUTTONS_Y + 26 );
ToolButton_SetPosition( g_OEData.AngleZMinusTButton, BUTTONS_X + 108, BUTTONS_Y + 46 );
ToolButton_SetPosition( g_OEData.ScaleResetTButton, BUTTONS_X + 214, BUTTONS_Y + 68 );
ToolButton_SetPosition( g_OEData.ScaleXPlusTButton, BUTTONS_X + 4, BUTTONS_Y + 68 );
ToolButton_SetPosition( g_OEData.ScaleXMinusTButton, BUTTONS_X + 4, BUTTONS_Y + 88 );
ToolButton_SetPosition( g_OEData.ScaleYPlusTButton, BUTTONS_X + 56, BUTTONS_Y + 68 );
ToolButton_SetPosition( g_OEData.ScaleYMinusTButton, BUTTONS_X + 56, BUTTONS_Y + 88 );
ToolButton_SetPosition( g_OEData.ScaleZPlusTButton, BUTTONS_X + 108, BUTTONS_Y + 68 );
ToolButton_SetPosition( g_OEData.ScaleZMinusTButton, BUTTONS_X + 108, BUTTONS_Y + 88 );
ToolButton_SetPosition( g_OEData.ScaleAllPlusTButton, BUTTONS_X + 160, BUTTONS_Y + 68 );
ToolButton_SetPosition( g_OEData.ScaleAllMinusTButton, BUTTONS_X + 160, BUTTONS_Y + 88 );
MoveButton_SetPosition( &g_OEData.MoveButton, MOVE_X, MOVE_Y ) ;
GetWindowSize でメインウインドウのクライアント領域のサイズを取得して、ToolSpaceManager_ChangeTotalSpace で
クライアント領域の縦サイズを設定します
これで『オブジェクト一覧』リストと『オブジェクトモデル一覧』リストは画面サイズに合わせて縦幅と表示位置が
変化するのですが、ボタンは ToolButton_SetPosition で一つ一つ設定してやる必要があるので、
上記のように位置を個別に再設定しています( 位置の記述は ToolButton_Create で指定しているものと同じです )
上記の記述の BUTTONS_Y は #define で (4 + TOOL_SCROLLBAR_WIDTH + g_OEData.ButtonSpace.SpaceStart) と
定義されていて、この内の g_OEData.ButtonSpace.SpaceStart の値が関数 ToolSpaceManage_ChangeTotalSpace の
呼び出しによって変化して、ボタンの表示すべき Y位置を示しています
何故ボタンは個別に指定しなければならないのか、ですが、各スペースの情報は ToolSpaceManage_AddSpace を
使用して追加するのですが、『オブジェクト一覧』リストなどが使用している ToolWindow_Create などのウインドウ機能では
自前で ToolSpaceManage_AddSpace を使用してスペース情報を追加して、ウインドウ処理の内部で SpaceStart の情報を元に
描画位置を決めているので ToolSpaceManage_ChangeTotalSpace を呼ぶたびに位置を設定し直す必要は無いのですが、
ボタンの場合はスペース情報を自前では持っていないので、ボタンの内部処理ではどのスペースに属しているか判断できず、
結果として ToolSpaceManage_ChangeTotalSpace を呼んでスペース情報に変化がある度に外部から位置を再設定してやる
必要があるというわけです
この辺りは ToolButton_Create の引数にスペース情報のハンドルを渡して、どのスペースに属しているかを
ボタン処理内部で判断できるようにして、毎回位置を再設定してやる必要が無いようにするなどの改良の余地がありますが、
当時はそれをしなかったようです…
そして最後の行の
MoveButton_SetPosition( &g_OEData.MoveButton, MOVE_X, MOVE_Y ) ;
ですが、この関数は存在しないので StageEditor_MoveButton.h と StageEditor_MoveButton.cpp に記述を追加する
必要があります
5.StageEditor_MoveButton.h の 39行目付近に以下の記述を追加して MoveButton_SetPosition を追加します
// 移動ボタン情報の位置を変更する
extern void MoveButton_SetPosition(
// 移動ボタン情報構造体のアドレス
SMoveButtonData *MBData,
// 変更後のボタンの座標
int x,
int y
);
6.StageEditor_MoveButton.cpp の 80行目付近に以下の記述を追加して MoveButton_SetPosition を追加します
// 移動ボタン情報の位置を変更する
extern void MoveButton_SetPosition(
// 移動ボタン情報構造体のアドレス
SMoveButtonData *MBData,
// 変更後のボタンの座標
int x,
int y
)
{
ToolButton_SetPosition( MBData->FrontTButton, x + FRONT_X, y + FRONT_Y );
ToolButton_SetPosition( MBData->BackTButton, x + BACK_X, y + BACK_Y );
ToolButton_SetPosition( MBData->LeftTButton, x + LEFT_X, y + LEFT_Y );
ToolButton_SetPosition( MBData->RightTButton, x + RIGHT_X, y + RIGHT_Y );
ToolButton_SetPosition( MBData->UpTButton, x + UP_X, y + UP_Y );
ToolButton_SetPosition( MBData->DownTButton, x + DOWN_X, y + DOWN_Y );
}
先ほどの記述と同じようにボタンの位置を再設定しているだけです
これでウインドウのサイズを変更すると、それに合わせて『オブジェクト一覧』リスト、オブジェクトの位置や
向きを設定するボタン、『オブジェクトモデル一覧』リストの表示範囲や位置が変化するようになります
よろしければお試しください m(_ _)m