今回は、ダイアログボックスにトラックバー(スライダー)を付けます。
テキストの表示 - インコの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」を選択
Auto Ticks (TBS_AUTOTICKS)、Tick Marks (TBS_NOTICKS)をtrueにする。
ソースコードの入力
ソースコードは下記のように入れてください。
#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; }
上記の太線で示している箇所のみ追加です。
#define IDC_STATIC1 100
#define IDC_SLIDER1 1002
#ifndef IDC_STATIC
#define IDC_STATIC -1
#endif
Reseditで作成した場合は、これとは異なるソースコードになります。
上記の太線で示している箇所のみ追加です。
#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で作成した場合は、これとは異なるソースコードになります。
上記の太線で示している箇所のみ追加です。