Mesoscopic Programming

タコさんプログラミング専門

ヌメロン製作講座第12回:プレイ情報グリッドの作成

前回で設定画面がほぼ完成しましたので、今回からプレイ画面の作成に入りたいと思います。プレイ画面には以下に示す3つのグリッド派生クラスがあります。

  1. プレイ情報グリッド
  2. 棋譜データグリッド
  3. 分析データグリッド

このうち今回はプレイ情報グリッドを作成します。

プレイ情報画面

f:id:hidakas1961:20120921184633j:plain:w200

  • 修正ソースファイル
  1. Numer0n.h
  2. Numer0n.cpp
  3. main.h
  4. main.cpp


アプリケーションクラス

プレイ画面に対応したことで、設定画面とプレイ画面の2つのモードを使い分ける必要が出てきました。そこで実行モードという概念を導入し、モードによる処理の振り分けに対応しました。

  • 追加変数
  1. InfoGrid infoGrid;
    • プレイ情報グリッドです。
  2. Grid * focus;
    • 現在フォーカスを所有しているグリッドのアドレスです。
  3. ModeID mode;
    • 実行モードです。
  • 追加メソッド
  1. VOID SetMode( ModeID newMode );
    • 実行モードを設定します。
  2. VOID OnSetFocus();
    • メインウィンドウがフォーカスを受け取ったとき、グリッドのコントロールにフォーカスを渡します。
  • 修正メソッド
  1. BOOL Init( HINSTANCE hInstance, int nCmdShow );
    • 追加された変数を初期化し、実行モードを設定画面モードに設定しました。
  2. VOID Draw( HDC hdc = NULL );
  3. VOID OnCommand();
  4. VOID OnKeyDown();
  5. VOID OnKeyUp();
  6. VOID OnNotify();
  7. VOID OnLbuttonDown();
  8. VOID OnLbuttonUp();
  9. VOID OnLbuttonDblClk();
    • setGrid 固定で処理していたのものを focus 経由で処理するように変更しました。
  10. VOID OnSwitchMode();
    • 画面モードの切り替え処理を実装しました。

VOID Application :: SetMode()

実行モードを設定します。

VOID Application :: SetMode( ModeID newMode )
{
    if ( focus != NULL )
    {
        focus->Cursor( FALSE );
    }

    mode = newMode;

    if ( mode == MODE_SET )
    {
        focus = & setGrid;
    }
    else
    {
        focus = & infoGrid;
    }

    focus->Cursor( TRUE );

    InvalidateRect( hwnd, NULL, TRUE );
}

直前までフォーカスを所有していたグリッドのカーソルをオフにし、フォーカス対象を指定モードのグリッドに変更します。そしてそのグリッドのカーソルをオンにします。

VOID Application :: OnSetFocus()

フォーカスをグリッドへ渡します。

VOID Application :: OnSetFocus()
{
    if ( focus != NULL && focus->hctrl != NULL )
    {
        SetFocus( focus->hctrl );

        lresult = 0;
    }
}

編集作業中に他のウィンドウズアプリケーションを実行して戻ってきた場合など、アプリケーションが非アクティブ状態からアクティブ状態に遷移したときに必要となります。

  • その他の修正個所
  1. enum ModeID
    • 実行モード型を追加しました。


プレイ情報グリッドクラス

プレイ画面の対戦情報を表示するグリッドです。また分析データを表示する「分析」ボタンと、設定画面に戻るための「戻る」ボタンも管理します。

class InfoGrid

プレイ情報グリッドです。

class InfoGrid : public Grid
{
public :

    static Cell cells[];

    Cell        * GetCells() { return cells; }
    VOID        Init( HWND hWnd );
};

表示座標の調整と初期選択項目の設定のために Init() をオーバーライドしています。

Cell InfoGrid :: cells[]

プレイ情報画面のセル定義データです。

Cell InfoGrid :: cells[] =
{
    { CELL_LABEL,       _T( "タイトル" ),                       W1, 0, 0, 8 },
    { CELL_NOEDIT,      ( LPVOID ) PARAM_TITLE,                 W2 },
    { CELL_BUTTON,      ( LPVOID ) PARAM_ANAL_BUTTON,           0, 0, L3, 6 },
    { CELL_BUTTON,      ( LPVOID ) PARAM_RETURN_BUTTON },
    { CELL_SEPARATOR },

    { CELL_LABEL,       _T( "プレイヤー名" ),                   W1 },
    { CELL_NOEDIT,      ( LPVOID ) PARAM_NAME_FIRST,            W2 },
    { CELL_NOEDIT,      ( LPVOID ) PARAM_NAME_SECOND,           W2, 0, L2 },
    { CELL_NEWLINE2 },

    { CELL_LABEL,       _T( "ロストカード" ),                   W1 },
    { CELL_NOEDIT,      ( LPVOID ) PARAM_LOST_FIRST,            W2 },
    { CELL_NOEDIT,      ( LPVOID ) PARAM_LOST_SECOND,           W2, 0, L2 },
    { CELL_NEWLINE2 },

    { CELL_LABEL,       _T( "アイテム" ),                       W1 },
    { CELL_NOEDIT,      ( LPVOID ) PARAM_ITEM_FIRST,            W2 },
    { CELL_NOEDIT,      ( LPVOID ) PARAM_ITEM_SECOND,           W2, 0, L2 },
    { CELL_NEWLINE2 },

    { CELL_LABEL,       _T( "設定ナンバー" ),                   W1 },
    { CELL_NOEDIT,      ( LPVOID ) PARAM_NUMBER_FIRST,          W2 },
    { CELL_NOEDIT,      ( LPVOID ) PARAM_NUMBER_SECOND,         W2, 0, L2 },
    { CELL_SEPARATOR },
    { CELL_NULL }
};

ここで新しいセルの種類である CELL_NOEDIT を追加しました。これは初期状態で編集不可能な CELL_EDIT です。このセルは選択不可能です。


グリッドクラス

追加された新しいセルの種類である CELL_NOEDIT に対応しました。

class Grid

  • 追加メソッド
  1. virtual VOID SetOffset()
    • オフセット座標を指定するメソッドです。offset 変数に代入するだけなので説明は省略します。
  • 修正メソッド
  1. virtual VOID MakeGrid();
    • 追加されたセルの種類の CELL_NOEDIT に対応しました。
  2. virtual BOOL CanSelectCell( Cell & cell );
    • 編集禁止状態のセルに対応しました。

VOID Grid :: MakeGrid()

VOID Grid :: MakeGrid()
{
    ~中略~
    if ( cell.cid == CELL_NOEDIT )
    {
        cell.state  |= STATE_DISABLE;
        cell.cid    = CELL_EDIT;
    }
    ~中略~
}

定義データのセルの種類が CELL_NOEDIT だった場合、編集禁止フラグである STATE_DISABLE を立てて種類を CELL_EDIT に変更します。

BOOL Grid :: CanSelectCell()

BOOL Grid :: CanSelectCell( Cell & cell )
{
    if ( cell.cid >= CELL_BUTTON && ( cell.state & STATE_DISABLE ) == 0 )
    {
        return TRUE;
    }

    return FALSE;
}

STATE_DISABLE フラグが立っていたら選択不可能とします。


セル構造体

プレイ情報画面に必要な表示処理を追加しました。

  • 修正メソッド
  1. BOOL DrawFrame( HDC hdc, RECT rc );
    • 編集禁止状態の編集セルの描画処理を追加。
  2. BOOL GetText( PTCHAR text );
    • プレイ情報画面の表示情報の取得に対応しました。
  • その他の修正個所
  1. LPCTSTR itemNames[ MAX_ITEM ]
    • アイテム名称文字列を追加しました。
  2. enum CellID
    • CELL_NOEDIT を追加しました。
  3. enum ParamID
    • 以下の項目を追加しました。
    1. PARAM_LOST_FIRST,
    2. PARAM_LOST_SECOND,
    3. PARAM_ITEM_FIRST,
    4. PARAM_ITEM_SECOND,
    5. PARAM_NUMBER_FIRST,
    6. PARAM_NUMBER_SECOND,
  4. enum StateMask
    • STATE_DISABLE を追加しました。

以上です。

次回はいよいよ棋譜データ処理を実装します。
おたのしみに。