アップダウンコントロール

数値を入力させるとき、最低値未満または最大値を超える数値は
入力してほしくないものです。
その処理をさせることはさほど難しくはありませんが
自動でやってくれたほうが便利です。今回もAPIだけで作ってみました。
注:AddressOf演算子が必要なためVB5以上でのみ実現できます
全 体 の 流 れ
@Formにアップダウンコントロールウィンドウを作成
AFormのウィンドウプロシージャを設定
BWM_VSCROLLメッセージを受信したら表示
これだけでカウントできます。しかも最大・最小値などの監視も全部やってくれます。
アップダウンコントロールの作成
アップダウンコントロールを作成するにはCreateWindowEx()関数でもできますが
CreateUpDownControls()関数のがまとめられていて便利です。
アップダウンコントロールのスタイル
CreateUpDownControls()関数でウィンドウを作成するとき
スタイルにWS_CHILD,WS_VISIBLE,WS_BORDERのいずれかの
標準メッセージを一つ含めなければないません。サンプルでは全部指定しています。
(そのほうが便利だし...。)
またこれに加えて以下のスタイルを同時に複数指定することができます。
スタイル内容
UDS_ALIGNLEFTバディウィンドウの左側に
アップダウンコントロールを配置する
UDS_ALIGNRIGHTバディウィンドウの右側に
アップダウンコントロールを配置する
UDS_ARROWKEYS矢印キーを有効にする
(矢印キーを使って移動可能にする)
UDS_AUTOBUDYZオーダーにおける前のウィンドウをバディウィンドウとする
UDS_HORZ = &H40アップダウンコントロールを水平に置く
(デフォルトでは垂直に置かれる)
UDS_NOTHOUSANDS = &H80大きい値をバディウィンドウに表示するとき
コンマを表示しない
(スピンコントロールのときのみ有効)
UDS_SETBUDDYINT = &H2コントロールの位置が変化したとき
バディウィンドウ内のテキストを自動的に設定する
これによりアップダウンコントロールの
現在位置をバディウィンドウに表示することができる
UDS_WRAP = &H1端に達したときアップダウンコントロールの位置を折り返す
メッセージの受信
アップダウンコントロールの矢印のうちどちらかをクリックすると
WM_VSCROLLまたはWM_HSCROLLが親ウィンドウに送られます。
lParamにはアップダウンコントロールのウィンドウハンドルが格納されるので
しっかり調べてから判断するようにしましょう。
メッセージの送信
アップダウンコントロールにメッセージを送るにはSendMessage()関数を使います。
基本的に送るメッセージは以下のとおりです(全部ではないです)。
メッセージ意味wParamlParam戻り値
UDM_GETBUDDYバディウィンドウのハンドル取得00バディウィンドウのハンドル
UDM_GETPOS現在の位置(カウント)を取得00下位ワードに格納されている
UDM_GETRANGE現在の範囲を取得00下位ワードに最大値
上位ワードに最小値
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