ダイアログボックスにトラックバーを付ける

トラックバー1

今回は、ダイアログボックスにトラックバー(スライダー)を付けます。

テキストの表示 - インコのWindowsSDK で作成したソースを修正します。

ここでは、Reseditで作成する方法も説明します。

流れ

commctrl.hをインクルード

comctl32.lib を読み込む

WM_INITDIALOG

WM_INITDIALOGは、ダイアログが作成されたときに一度だけ実行されます。

1.InitCommonControls()でコモンコントロールの初期化

2.TBM_SETRANGEメッセージで、トラックバーの範囲(レンジ)を設定

lResult = SendMessage(
    (HWND) hWnd,        // トラックバーのハンドル
    (UINT) TBM_SETRANGE,
    (WPARAM) wParam,    // 再描画をするときはtrue、しないときはfalse
    (LPARAM) lParam     // 下位ワードに最小値、上位ワードに最大値
);

3.TBM_SETTICFREQメッセージで、トラックバーの目盛りの間隔を設定

lResult = SendMessage(
    (HWND) hWnd,        // トラックバーのハンドル
    (UINT) TBM_SETTICFREQ,
    (WPARAM) wParam,    // 目盛りの間隔
    0
);

4.TBM_SETPOSメッセージで、スライダの位置を設定
ここでは、lParamに10を入れ、10(%)の位置に設定します。

lResult = SendMessage(
    (HWND) hWnd,        // トラックバーのハンドル
    (UINT) TBM_SETPOS,
    (WPARAM) wParam,    // 再描画をするときはtrue、しないときはfalse
    (LPARAM) lParam     // スライダの位置
);

5.TBM_SETPAGESIZEメッセージで、クリック時の移動量を設定
スライダの右側をクリックすると、スライダが右に移動しますが、この移動量を決めます。

lResult = SendMessage(
    (HWND) hWnd,        // トラックバーのハンドル
    (UINT) TBM_SETPAGESIZE,
    0,                  // 目盛りの位置
    (LPARAM) lParam     // クリック時の移動量
);

6.SetWindowText()で、現在のスライダの位置を表示します。

WM_HSCROLL

ユーザーがトラックバーにアクセスすると、 水平トラックバーのときはWM_HSCROLLメッセージが、 垂直スクロールバーのときはWM_VSCROLLメッセージが発生します。

1.TBM_GETPOSメッセージで、スライダーの位置を取得します。
SendMessage関数の戻り値が、スライダの位置になります。

lResult = SendMessage(
    (HWND) hWnd,        // トラックバーのハンドル
    (UINT) TBM_GETPOS,
    NULL,
    NULL
);

2.SetWindowText()で、現在のスライダーの位置を表示します。

リソースファイル

1.トラックバーを使用するため、commctrl.hをインクルード。

2.トラックバー[TRACKBAR_CLASS]を追加。

TRACKBAR_CLASSの代わりに、"msctls_trackbar32"と記述することができます。「" "」を忘れないで下さい。
この場合は、リソースファイルで、commctrl.hをインクルードする必要はありません。
ただし、"msctls_trackbar32"と記述した場合でも、Cソースファイルでは、commctrl.hのインクルードが必要です。

CONTROL  "", id, TRACKBAR_CLASS, style, x0, y0, width, height

idトラックバーのID
styleトラックバーのスタイル
ウインドウスタイルと、トラックバーのスタイルが指定可能
x0トラックバー左上のx座標
y0トラックバー左上のy座標
widthトラックバーの幅
heightトラックバーの高さ

・Visual Studioのリソース ビュー、ResEditでの設定
ツールボックス(Toolbox)ウインドウの「Slider Cntrol」を選択

ResEdit1

Auto Ticks (TBS_AUTOTICKS)、Tick Marks (TBS_NOTICKS)をtrueにする。

ResEdit2 ResEdit3

ソースコードの入力

ソースコードは下記のように入れてください。

test.cpp
#include <windows.h>
#include <commctrl.h>
#include <stdio.h>
#include <tchar.h>
#include "resource.h"

#pragma comment(lib, "comctl32.lib")

// このコード モジュールに含まれる関数の宣言を転送します:
BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
          PSTR lpCmdLine, int nCmdShow )
{
    DialogBox(hInstance, TEXT("DIALOG_BOX"), NULL, DialogProc);
    return 0;
}

BOOL CALLBACK DialogProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    HWND hBar;
    int Pos;
    TCHAR str[10];
    hBar = GetDlgItem(hWnd,IDC_SLIDER1);
    Pos = 10;
    switch (msg)
    {
        case WM_INITDIALOG:
            InitCommonControls(); 
            SendMessage(hBar, TBM_SETRANGE, TRUE, MAKELPARAM(0, 100)); // レンジを指定
            SendMessage(hBar, TBM_SETTICFREQ, 10, 0);   // 目盛りの増分
            SendMessage(hBar, TBM_SETPOS, TRUE, Pos);  // 位置の設定
            SendMessage(hBar, TBM_SETPAGESIZE, 0, 10); // クリック時の移動量
            _stprintf_s(str,10,TEXT("%d %"), Pos);
            SetWindowText(GetDlgItem(hWnd, IDC_STATIC1), (LPCTSTR)str);
            break;
        case WM_HSCROLL:
            if(GetDlgItem(hWnd, IDC_SLIDER1) == (HWND)lParam)
            {
                Pos = SendMessage(hBar, TBM_GETPOS, NULL, NULL); // 現在の値の取得
            }
            _stprintf_s(str,10,TEXT("%d %"), Pos);
            SetWindowText(GetDlgItem(hWnd, IDC_STATIC1), (LPCTSTR)str); 
            break;
        case WM_CLOSE:
            EndDialog(hWnd, IDOK);
            break;
        default:
            break;
    }
    return FALSE;
}

上記の太線で示している箇所のみ追加です。

resource.h

#define IDC_STATIC1 100
#define IDC_SLIDER1 1002
#ifndef IDC_STATIC
#define IDC_STATIC -1
#endif

Reseditで作成した場合は、これとは異なるソースコードになります。
上記の太線で示している箇所のみ追加です。

test.rc

#include <windows.h>
#include <commctrl.h>
#include "resource.h"

/////////////////////////////////////////////////////////////////////////////
//
// ダイアログ
//

DIALOG_BOX DIALOG 0, 0, 170, 62
FONT 9, "MS UI Gothic"
CAPTION "ダイアログ"
BEGIN
    LTEXT           "",IDC_STATIC1,42,10,114,8
    CONTROL         "", IDC_SLIDER1, TRACKBAR_CLASS,
      WS_TABSTOP | TBS_BOTH | TBS_AUTOTICKS, 5, 30, 160, 28
END

Reseditで作成した場合は、これとは異なるソースコードになります。
上記の太線で示している箇所のみ追加です。