|
スピンコントロールの基本
今回はスピンコントロールを実装します。スピンコントロールは、次のようなエディットボックスなどにくっついている矢印ボタンです。エディットボックスだけでなく、スタティックテキストなどにつけることもできます。

では、まずリソースエディタでスピンコントロールを追加しましょう。今回はスピンコントロールとエディットボックスとボタン1つを追加しました。
次は、どのスピンコントロールがどのエディットボックスにくっつくのかを設定しないといけません。これはタブオーダーで決まります。スピンコントロールの直前のエディットボックスやスタティックテキストに関連付けされます。タブオーダーで目的のエディットボックスとスピンコントロールが連続するように設定してください。

次にスピンコントロールのプロパティを設定します。ここではリソースIDを設定し、「Auto Buddy」をTrueにします。こうすると、タブオーダーに従ってスピンコントロールが他のコントロールと連動して動作するようになります。
そして、「Set Buddy Integer」をTrueにします。こうすると、スピンコントロールを操作したときに、自動的に関連付けられているコントロールの見た目が更新されます。次に、「Alignment」をRight Alignにします。これは、スピンコントロールを、関連付けられているコントロールのどこに配置するのかの設定です。Right Alignにすると、右側に配置されます。他はデフォルトのままでOKです。

次は、エディットボックスのプロパティですが、「Number」をTrueにします。こうすると、数値以外の入力ができなくなります。

スピンコントロールの操作は、CSpinButtonCtrlクラスの関数を使って行うので、Control型のDDX変数を追加すると操作が楽になります。スピンコントロールを右クリックし、「変数の追加」を選択します。
アクセスはprivate、「コントロール変数」をチェックし、カテゴリにControlを選択します。変数のデータ型はCSpinButtonCtrlにします。
変数名はメンバ変数となるのでm_で始まる名前にしましょう。さらにDDXのControl変数であることがわかるようにm_xcで始まる名前にすると分かりやすくなります。この辺は好みで決めましょう。

スピンコントロールに変数を追加したら、さらにボタンにBN_CLICKEDのメッセージハンドラを追加します。(ボタンのイベントハンドラの追加方法は、「ボタンの基本」を見てください。)
では、コードのほうを見ていきましょう。OnInitDialog()で、次のように処理します。CSpinButtonCtrl::SetRange32()関数で、スピンコントロールで指定できる範囲を設定します。CSpinButtonCtrl::SetPos32()関数で、現在位置を設定します。
BOOL CSpinDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE); // 大きいアイコンの設定
SetIcon(m_hIcon, FALSE); // 小さいアイコンの設定
// TODO: 初期化をここに追加します。
{
m_xcSpin.SetRange32(0, 1000); // 範囲の設定
m_xcSpin.SetPos32(500); // 現在位置の設定
}
return TRUE;
} |
"取得"ボタン押下時のハンドラの内容は次のようにしました。CSpinButtonCtrl::GetPos32()関数で現在位置を取得し、メッセージボックスに現在の値のメッセージを表示します。
// "取得"ボタン押下
void CSpinDlg::OnBnClickedBtnGet()
{
CString str;
str.Format(_T("現在値は%dです。"), m_xcSpin.GetPos32());
MessageBox(str);
} |
では、ビルドして実行してみましょう。スピンコントロールを操作すると、自動的にエディットボックスの値が変わります。取得ボタンを押すと、現在値が表示されます。

エディットボックスには何もコードを追加していないところに注目してください。スピンコントロールが現在の値を保持しているので、エディットボックスからテキストを取得したり、逆にテキストを設定したりする必要はありせん。エディットボックスに数値を手入力しても、スピンコントロールの値は、ちゃんと更新されます。
|