Spin でレコードを選択する

VC++ で EditBox に表示するレコードを Spin で選択します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの設定

  1. 新規プロジェクト(Spin)を作成します。
  2. ページ先頭の画像を参考にして DialogBox を作成して下さい。
    キャプションとIDの設定です。
    BOX キャプション ID
    DialogBox Dialog IDD_DIALOG1
    EditBox IDC_EDIT1
    Spin IDC_SPIN1
  3. 次のファイルをフォルダーに格納して下さい。
    seiseki.txt は Edit Box に表示する TEXT ファイルです。
    内容は問いませんが、1レコードを改行コード(CR/LF)を含めて34バイトで作成して下さい。
    ファイル名 説明
    Spin.cpp 後の説明を参考にして完成させて下さい
    seiseki.txt Edit Box に表示する TEXT ファイルです
  4. 私は my.lib に登録されている DATAFILE Object Class を使っています。
    my.lib を使うときは、メニューバーから [プロジェクト] [プロパティ] [リンカ] [入力] で追加する依存関係から my.lib を取り込みます。
    読者諸氏が作成するときは Object Class Library から次のファイルを取得してプロジェクトに組み込んで下さい。
    ファイル名 説明
    datafile.h DATAFILE Object Class のヘッダファイル
    datafile.cpp DATAFILE Object Class のプログラムファイル
  5. ビルドに続いて実行を行います。
    Spin をクリックして、表示されるレコードを操作できたら完成です。

プログラムの説明

  1. コモンダイアログを使うときは commdlg.h が必要ですが、これは my.h(または datafile.h)の中で取り込んでいます。
    g_hSpin; は Spin の Handle です。
    DataFile; は DATAFILE Object Class の定義です。
    g_buf[100][34]; に最大100件のレコードを格納します。
        #include    <windows.h>
        #include    <commctrl.h>
        #include    "my.h"
        #include    "resource.h"
    
        HWND        g_hSpin;            // Spin Handle
        DATAFILE    DataFile;           // DATAFILE Object
        char        g_buf[100][34];     // Input Record Area
        
  2. WM_INITDIALOG: でアプリケーションを初期化します。
    SetDlgItemText() で最初に先頭のレコードを表示します。
        {   case WM_INITDIALOG:
                InitDlgProc(hDlg,"seiseki.txt");
                SetDlgItemText(hDlg,IDC_EDIT1,g_buf[0]);
                break;
        
  3. Spin がクリックされると WM_VSCROLL: がポストされてきます。
    Spin のハンドルを確認して、現在の値を pos に取得して、レコードを EditBox に表示します。
    Spin の値はボタンをクリックすると自動的にアップ(ダウン)されます。
            case WM_VSCROLL:
                if ((HWND)lParam==g_hSpin)
                {   pos= HIWORD(wParam);
                    SetDlgItemText(hDlg,IDC_EDIT1,g_buf[pos]);
                }
                break;
        
  4. Application の初期化です。
    GetDlgItem(hDlg,IDC_SPIN1) で Spin のハンドルをグローバル領域に格納します。
    ReadData() で TEXT File を g_buf[] に読み込みます。
    cnt は入力したレコードの件数です。
    各レコードの末尾に '\0' を設定します。
    UDM_SETRANGE で Spin の最大値と最小値を設定します。
    Spin のボタンをクリックすると設定した範囲で自動的にアップ(ダウン)されます。
    MAKELPARAM(0L,cnt-1) にするとアップとダウンが逆になります。
    UDM_SETPOS で Spin の初期値をゼロに設定しています。
        //★ Application の初期化
        int InitDlgProc(HWND hDlg, char fname[])
        {   int     i,cnt;
            DWORD   leng;
    
            g_hSpin= GetDlgItem(hDlg,IDC_SPIN1);
            leng= DataFile.ReadData(fname,g_buf[0],2000);
            cnt= leng/34;
            for(i=0; i<cnt; i++)
            {   g_buf[i][32]= '\0';
            }
            SendMessage(g_hSpin,UDM_SETRANGE,0,MAKELPARAM(cnt-1,0L));
            SendMessage(g_hSpin,UDM_SETPOS,0,0);
            return cnt;
        }
        

超初心者のプログラム入門(Win32API C++)