数値を入力させるとき、最低値未満または最大値を超える数値は 入力してほしくないものです。 その処理をさせることはさほど難しくはありませんが 自動でやってくれたほうが便利です。今回もAPIだけで作ってみました。 注:AddressOf演算子が必要なためVB5以上でのみ実現できます全 体 の 流 れ
| @Formにアップダウンコントロールウィンドウを作成 |
| AFormのウィンドウプロシージャを設定 |
| BWM_VSCROLLメッセージを受信したら表示 |
| これだけでカウントできます。しかも最大・最小値などの監視も全部やってくれます。 |
アップダウンコントロールを作成するにはCreateWindowEx()関数でもできますが CreateUpDownControls()関数のがまとめられていて便利です。アップダウンコントロールのスタイル
CreateUpDownControls()関数でウィンドウを作成するとき スタイルにWS_CHILD,WS_VISIBLE,WS_BORDERのいずれかの 標準メッセージを一つ含めなければないません。サンプルでは全部指定しています。 (そのほうが便利だし...。) またこれに加えて以下のスタイルを同時に複数指定することができます。
| スタイル | 内容 |
| UDS_ALIGNLEFT | バディウィンドウの左側に アップダウンコントロールを配置する |
| UDS_ALIGNRIGHT | バディウィンドウの右側に アップダウンコントロールを配置する |
| UDS_ARROWKEYS | 矢印キーを有効にする (矢印キーを使って移動可能にする) |
| UDS_AUTOBUDY | Zオーダーにおける前のウィンドウをバディウィンドウとする |
| UDS_HORZ = &H40 | アップダウンコントロールを水平に置く (デフォルトでは垂直に置かれる) |
| UDS_NOTHOUSANDS = &H80 | 大きい値をバディウィンドウに表示するとき コンマを表示しない (スピンコントロールのときのみ有効) |
| UDS_SETBUDDYINT = &H2 | コントロールの位置が変化したとき バディウィンドウ内のテキストを自動的に設定する これによりアップダウンコントロールの 現在位置をバディウィンドウに表示することができる |
| UDS_WRAP = &H1 | 端に達したときアップダウンコントロールの位置を折り返す |
アップダウンコントロールの矢印のうちどちらかをクリックすると WM_VSCROLLまたはWM_HSCROLLが親ウィンドウに送られます。 lParamにはアップダウンコントロールのウィンドウハンドルが格納されるので しっかり調べてから判断するようにしましょう。メッセージの送信
アップダウンコントロールにメッセージを送るにはSendMessage()関数を使います。 基本的に送るメッセージは以下のとおりです(全部ではないです)。
| メッセージ | 意味 | wParam | lParam | 戻り値 |
| UDM_GETBUDDY | バディウィンドウのハンドル取得 | 0 | 0 | バディウィンドウのハンドル |
| UDM_GETPOS | 現在の位置(カウント)を取得 | 0 | 0 | 下位ワードに格納されている |
| UDM_GETRANGE | 現在の範囲を取得 | 0 | 0 | 下位ワードに最大値 上位ワードに最小値 |
| UDM_SETBUDDY | 新しいバディウィンドを指定 | 新しいハンドル | 0 | 以前のバディウィンドウのハンドル |
| UDM_SETPOS | 現在の位置(カウント)を設定 | 0 | 新しい位置 | 以前の位置 |
| UDM_SETRANGE | 現在の範囲を設定 | 0 | 下位ワードに最大値 上位ワードに最小値 | 以前の範囲 |
バディウィンドウとは相互にリンク付けられたウィンドウのことです。 つまりテキストボックスなどの表示するウィンドウなどです。 このサンプルでは使用していませんが、スピンコントロールでは使用しています。サンプル
ダウンロード(CreateUpDownControl1.lzh 7.24KB)
Private Sub Form_Load()
'アップダウンコントロールを作成する
hUpDownWnd = CreateUpDownControl(WS_CHILD Or WS_BORDER Or WS_VISIBLE, _
10, 10, 50, 50, Me.hWnd, 100, App.hInstance, 0, 100, 0, 50)
'現在位置表示
Me.Label1.Caption = Str(LWORD(SendMessage(hUpDownWnd, UDM_GETPOS, 0, 0)))
'ウィンドウプロシージャのアドレスを変更する
gOrgWndProc = SetWindowLong(Me.hWnd, GWL_WNDPROC, AddressOf WndProc)
End Sub
Private Sub Form_Unload(Cancel As Integer)
'ウィンドウプロシージャのアドレスを元に戻す
Call SetWindowLong(Me.hWnd, GWL_WNDPROC, gOrgWndProc)
End Sub