ScrollBar でレコードを選択する

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

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

プロジェクトの設定

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

プログラムの説明

  1. コモンダイアログを使うときは commdlg.h が必要ですが、これは my.h(または datafile.h)の中で取り込んでいます。
    DataFile; は DATAFILE Object Class の定義です。
    g_buf[100][34] に最大100件のレコードを格納します。
    g_cnt は入力されたレコードの件数です。
    g_pos は現在表示中のレコード番号です。
        #include    "my.h"
    
        DATAFILE    DataFile;           // DATAFILE Object
        char        g_buf[100][34];     // Input Record
        int         g_cnt;              // Input Data Count
        int         g_pos= 0;           // Display Posion
        
  2. WM_INITDIALOG: でアプリケーションを初期化します。
        {   case WM_INITDIALOG:
                g_cnt= InitDlgProc(hDlg,"seiseki.txt");
                ShowScroll(hDlg);
                break;
        
  3. ScrollBar を操作したときに WM_HSCROLL: に制御が渡されます。
    縦方向の ScrollBar を使ったときは WM_VSCROLL: を指定します。
    SB_LINELEFT: と SB_LINERIGHT: は左右の黒い矢印をクリックしたときです。
    SB_PAGELEFT: と SB_PAGERIGHT: はバーの中をクリックしたときです。
    SB_THUMBTRACK: は直接ドラッグしたときです。
    ShowScroll(hDlg); で ScrollBar の値を更新して、EditBox にレコードを表示します。
            case WM_HSCROLL:
                switch(LOWORD(wParam))
                {   case SB_LINELEFT:
                        g_pos--;
                        break;
                    case SB_LINERIGHT:
                        g_pos++;
                        break;
                    case SB_PAGELEFT:
                        g_pos-= 10;
                        break;
                    case SB_PAGERIGHT:
                        g_pos+= 10;
                        break;
                    case SB_THUMBTRACK:
                        g_pos= (int)(HIWORD(wParam));
                        break;
                }
                ShowScroll(hDlg);
                break;
        
  4. Application の初期化です。
    ReadData() で TEXT File を g_buf[] に読み込みます。
    cnt は入力したレコードの件数です。
    各レコードの末尾に '\0' を設定します。
    SetScrollRange() で ScrollBar の範囲(0~cnt-1)を設定します。
    SetScrollPos() で ScrollBar の表示位置を設定します。
        int InitDlgProc(HWND hDlg, char fname[])
        {   int     i,cnt;
            DWORD   leng;
    
            leng= DataFile.ReadData(fname,g_buf[0],2000);
            cnt= leng/34;
        DMsg("Data Count=", cnt);
            for(i=0; i<cnt; i++)
            {   g_buf[i][32]= '\0';
            }
            SetScrollRange(GetDlgItem(hDlg,IDC_SCROLLBAR1),SB_CTL,0,cnt-1,TRUE);
            SetScrollPos(GetDlgItem(hDlg,IDC_SCROLLBAR1),SB_CTL,0,TRUE);
            return cnt;
        }
        
  5. ScrollBar が操作されたときに、位置を更新して EditBox にレコードを表示する関数です。
    g_pos が範囲外に出たときは範囲内に収めます。
        int ShowScroll(HWND hDlg)
        {
            if (g_pos<0)        g_pos = 0;
            if (g_pos>=g_cnt)   g_pos = g_cnt-1;
            SetScrollPos(GetDlgItem(hDlg,IDC_SCROLLBAR1),SB_CTL,g_pos,TRUE);
            SetDlgItemText(hDlg,IDC_EDIT1,g_buf[g_pos]);
            return g_pos;
        }
        

超初心者の方のために全ソースコードを掲載します。 (^_^;)
全ソースコード

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