オートリピートボタン

元サイト

この記事は Langis Pitre の投稿です。

サンプルコード をダウンロードしてください。

どのようにダイアログのアクションから他のダイアログ中のエディットコントロールをアップデートするのかという質問に答えた後、CDプレーヤーアプリケーションのためにオーナードローのシークボタンを実装したことがあるのを思い出した。そのボタンを押すとボタンを離すまで値が増えるのだ。

ここでは簡単にしたバージョンの CSeekButton を紹介します。
押されたとき値が増える、または減るというシンプルなボタンです。その正負の方向、初期値、ステップ値、最小最大値が設定可能です。

値が変化すると CSeekButton はユーザー定義メッセージをウィンドウに送ります。メッセージを送ったボタンのIDとその値がメッセージとともに渡されます。

これを使うにはソースコードをダウンロードし、SeekButton.h と SeekButton.cpp をプロジェクトに追加し、適当なところで SeekButton.h をインクルードしてください。一般に、ウィンドウクラスで CSeekButton のインスタンスを定義し、ウィンドウの OnInitDialog または OnCreate でボタンコントロールを作成します。


	backwardBut.Create( "<<", WS_CHILD | WS_VISIBLE, CRect( 10, 10, 50, 30 ), this, IDC_BACKWARD_BUTTON );
	backwardBut.SetParameters( SomeCWnd.GetSafeHwnd(), 0, CSeekButton::BACKWARD, 1, 0, 10);

	forwardBut.Create( ">>", WS_CHILD | WS_VISIBLE, CRect( 50, 10, 90, 30 ), this, IDC_FORWARD_BUTTON );
	forwardBut.SetParameters( SomeCWnd.GetSafeHwnd(), 0, CSeekButton::FORWARD, 1, 0, 10);

SetParameters() の最初のパラメータは、ウィンドウのハンドルを指定します。このパラメータが NULL ならば、デフォルトでボタンの親ウィンドウとなります。

次にメッセージを受け取るウィンドウを作ります。例えば CEdit から派生した CMyEdit クラスにします。そのクラスの宣言で次の関数宣言を追加します。


	afx_msg LONG OnSeekButtonValueChanged( UINT id, LONG value );

メッセージマップにハンドラを追加


BEGIN_MESSAGE_MAP(CMyEdit, CEdit)
	//{{AFX_MSG_MAP(CMyEdit)
	... blah blah blah
	//}}AFX_MSG_MAP
	// add an entry for your message
	ON_MESSAGE( WM_SEEKBUTTONVALUECHANGED, OnSeekButtonValueChanged )
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyEdit message handlers

LONG CMyEdit::OnSeekButtonValueChanged( UINT /* id */, LONG value )
{
	static CString str;
	str.Format("%d", value );
	SetWindowText( str );
	RedrawWindow();

	return 0L;
}

上の例では、CEdit から CMyEdit を派生させてそれに WM_SEEKBUTTONVALUECHANGED メッセージを受け取らせています。同じことをほかのウィンドウタイプでもできますが、もちろんハンドラがすることは変更しなければなりません。

見ての通り、このボタンクラスはとてもシンプルです。値や範囲のチェックはしていませんし浮動小数点のサポートもしていません。あなたにおまかせします。

 

Last updated: 12 July 1998