Grid Control 5

  

サブメニュー


ここに紹介するプログラムは、WIN XP 2003/Windows 7 (32bits) - OS 環境でマイクロソフトのVisual Studio 2010 で作ったものです。

Windows XP/ Windows 7(32bits) での動作は確認済みですが…


マウスのクリックを拾う関数

FlexGrid上でマウスをクリックした時、駆動する関数は数種類ありますが、右・左ボタンに対応する関数は2つのみです。

OnMouseDown, OnMouseUp関数です。  ここでは前者を使いました。

 

この関数は void CWallDlg::OnMouseDownWalldataGrid(short Button, short Shift, long x, long y) の引数を持っておりクリックするとBottonの左・右の区別Shiftには、シフトキーが押されているどうか,X、Yにはマウスのある座標 が返されます。

 

しかし、座標は行番号と直接対応していません。更にFlexGridContolの標準メンバー関数のGetRowやGetColを関数内部で書いてもマウスをクリックした時の値ではなく、クリックする前の値しか取得できません。

 

クリックした直後の値が取得出来ないと思い通りの機能がコーディング出来ませんので多少工夫する必要があります。

各行の高さは通常固定されますので、事前にGetRowHeight関数で高さを取得しておきます。  表示されている最上部の行番号をGetTopRow関数で取得しておき、X・Yの値を高さで割ってクリックした行を計算する方法としました。

 

///////////////////////////////////////
// グリッドでマウスボタンダウンした時
void CWallDlg::OnMouseDownWalldataGrid(short Button, short Shift, long x, long y)
{
   CGridControl gc;
   long row = m_grid.GetRow(); //    long col = m_grid.GetCol();  // マウスの右クリックでは、値が更新されない
   int data = m_nFixedRows + m_ArrayWall.GetSize();

   switch (Button) {
      case 1: // マウス左クリック
      // データの入力
         if( col<=6 && col>0 && row<=data && row>=m_nTopRow) {

             m_rc = gc.SetCurrentCel( &m_grid, m_nMaxRow, row, col );
         }

         m_ctrWallDataInput.SetFocus();

         EditBoxRedraw( &m_grid, &m_rc );
         break;

      case 2:

         if( row>=m_nTopRow && row<=data && col==1 ){ // マウス右クリック(Orient入力)

            m_rc = gc.SetCurrentCel( &m_grid, m_nMaxRow, row, 1 );

            m_ctrWallDataInput.SetFocus();

            EditBoxRedraw( &m_grid, &m_rc );

            ShowOrientDlg();

            break;

         }

      if( row>=m_nTopRow && row <= data && x>66 &&

         m_rc = gc.SetCurrentCel( &m_grid, m_nMaxRow, row, 2 );

         m_ctrWallDataInput.SetFocus();

         EditBoxRedraw( &m_grid, &m_rc );

         ShowTypeDlg();

         break;
      }
   }
}

 

このコードで、m_col, m_nToprow は、着目行や表示列最上行などを ダイアログクラスのメンバ変数に保持するものです。ほかの機能で使いますので重要な変数となります。  これで、マウスクリックで着目セルがハイライトし、すぐにEditBoxにフォーカスが移動することになります。

 

ハイライトされているセルをクリックした場合は、ハイライトが移動する必要がないので、EditBoxにフォーカスが移動するだけの動作です。右クリックのときは、必要な動作をコーディングする必要があります。

 

FlexGridのスクロール対応

 

FlexGridをスクロールしたことを、何らかの方法で保存しておかなければいろいろと面倒なことが起こります。

特に、MouseDown関数での処理では行数を m_toprow より計算していますので以下の関数が必携です。

ClassWizardで下の関数をオーバーライドし、m_toprow の値を拾うようにして下さい。

 

void CWallDlg::OnScrollWalldataGrid()
{
    m_toprow = m_grid.GetTopRow();
}

 

前ページに戻る

次のページへ


ページ先頭に戻る
最終更新日: 2020/02/04