FAQ11-2

Q. エディットコントロールで,数値だけを入力できるようにするには

 エディットコントロールで,数値だけを入力できるようにしたり,アルファベットだけを入力できるようにするにはどうしたらいいのでしょうか.


A. ウィンドウのサブクラス化をする

サブクラス化

 こういう場合は,ウィンドウのサブクラス化をします.
 サブクラス化とは,ウィンドウプロシージャを無理矢理書き換えてしまうことです.
 ウィンドウプロシージャを書き換えて,自分でウィンドウプロシージャを管理できるようになれば,エディットコントロールの文字の制限など,なんでもできてしまいます.
 ウィンドウのウィンドウプロシージャを書き換えるには,SetWindowLong()を使います.SetWindowLong()の使い方をリスト11-4に示します.

[リスト11-4] :

FARPROC pfnOldProc = (FARPROC)SetWindowLong( hwnd, GWL_WNDPROC, (LONG)MyWindowProc );
 このウィンドウプロシージャの書き換えは,書き換えた一つのウィンドウだけに対して有効なので,他への影響を心配する必要はありません.
 サブクラス化のルールとして,新しいウィンドウプロシージャでは,処理の必要のないメッセージなどは元のウィンドウプロシージャを呼び直すようにします(リスト11-5).

[リスト11-5] :

LRESULT MyWindowProc(HWND hwnd,UINT message, WPARAM wParam, LPARAM lParam ) {
	switch( message ) {
		 :
	}
	return
	CallWindowProc(pfnOldProc,hwnd,message,wParam,lParam );
}
 このようにしないと,元々のエディットコントロールの機能が働かないためです.
 こうしてできた新しいウィンドウプロシージャで,必要な処理だけを処理すればできあがりです.質問の数値だけ入力する場合にはリスト11-6のようにします.

[リスト11-6] :

LRESULT MyWindowProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) {
	switch( message ) {
		case WM_CHAR:
			if( wParam >= '0' && wParam <= '9' ) {
				break;
			} else {
				return 0;
			}
	}
	return
	CallWindowProc(pfnOldProc,hwnd,message,wParam,lParam );
}

ES_NUMBERスタイル

 Windows95の場合,エディットコントロールで数値だけを入力したい場合は,ES_NUMBERスタイルというウィンドウスタイルがあります.
 このスタイルはエディットコントロールだけに対して有効で,これを指定しておけばサブクラス化しないでも数値だけ入力が可能になります.

Back to FAQ main page