WinAPIのエディトコントロールについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
あんずちゃん

WinAPIのエディトコントロールについて

#1

投稿記事 by あんずちゃん » 9年前

コード:

		case WM_CREATE:
			top_name = CreateWindow(TEXT("EDIT"),NULL,WS_OVERLAPPED | WS_TABSTOP | WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_MULTILINE,150,10,100,20,hwnd,(HMENU)REGIST_TOP_NAME,((LPCREATESTRUCT)(lp))->hInstance,NULL);
			ander_name = CreateWindow(TEXT("EDIT"),NULL,WS_OVERLAPPED | WS_TABSTOP | WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_MULTILINE,150,40,100,20,hwnd,(HMENU)REGIST_ANDER_NAME,((LPCREATESTRUCT)(lp))->hInstance,NULL);
			pass = CreateWindow(TEXT("EDIT"),NULL,WS_OVERLAPPED | WS_TABSTOP | WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_MULTILINE,150,70,100,20,hwnd,(HMENU)REGIST_PASS,((LPCREATESTRUCT)(lp))->hInstance,NULL);
			check = CreateWindow(TEXT("BUTTON"),TEXT("確認"), DS_CENTER | WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,200,100,50,25,hwnd,(HMENU)3,((LPCREATESTRUCT)(lp))->hInstance,NULL);
WS_TABSTOPを付けているのですが、タブキーによるフォーカス移動ができません。
どうすればいいのですか?
それとpassのところで半角英数字のみ入力できるようにしたいのですが、コントロールで設定することはできないのでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: WinAPIのエディトコントロールについて

#2

投稿記事 by みけCAT » 9年前

あんずちゃん さんが書きました:WS_TABSTOPを付けているのですが、タブキーによるフォーカス移動ができません。
どうすればいいのですか?
IsDialogMessage()関数をメッセージループに入れるといいかもしれません。
IsDialogMessageとTabキーによるフォーカス移動など - Programming Field
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

あんずちゃん

Re: WinAPIのエディトコントロールについて

#3

投稿記事 by あんずちゃん » 9年前

みけCAT さんが書きました:
あんずちゃん さんが書きました:WS_TABSTOPを付けているのですが、タブキーによるフォーカス移動ができません。
どうすればいいのですか?
IsDialogMessage()関数をメッセージループに入れるといいかもしれません。
IsDialogMessageとTabキーによるフォーカス移動など - Programming Field
回答ありがとうございます。
メインウィンドウ内での処理なのですが、IsDialogMessageで処理するのですか?
下記のようにしてみたところ、TAB入力はなくなりましたが、フォーカスの移動はされませんでした。

コード:

	while(GetMessage(&msg,NULL,0,0))
	{
		if(!IsDialogMessage(main_hwnd,&msg))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

コード:

		case WM_CREATE:
			top_name = CreateWindow(TEXT("EDIT"),NULL,WS_OVERLAPPED | WS_TABSTOP | WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_MULTILINE,150,10,100,20,hwnd,(HMENU)REGIST_TOP_NAME,((LPCREATESTRUCT)(lp))->hInstance,NULL);
			ander_name = CreateWindow(TEXT("EDIT"),NULL,WS_OVERLAPPED | WS_TABSTOP | WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_MULTILINE,150,40,100,20,hwnd,(HMENU)REGIST_ANDER_NAME,((LPCREATESTRUCT)(lp))->hInstance,NULL);
			pass = CreateWindow(TEXT("EDIT"),NULL,WS_OVERLAPPED | WS_TABSTOP | WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_MULTILINE,150,70,100,20,hwnd,(HMENU)REGIST_PASS,((LPCREATESTRUCT)(lp))->hInstance,NULL);
			check = CreateWindow(TEXT("BUTTON"),TEXT("確認"), DS_CENTER | WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,200,100,50,25,hwnd,(HMENU)3,((LPCREATESTRUCT)(lp))->hInstance,NULL);

			break;

だんごさん
記事: 273
登録日時: 13年前

Re: WinAPIのエディトコントロールについて

#4

投稿記事 by だんごさん » 9年前

半角英数字のみの入力方法は、エディットのメッセージ処理を行うことで可能です。

コード:

case WM_CREATE:
		pass = CreateWindow(TEXT("EDIT"),NULL,WS_OVERLAPPED | WS_TABSTOP | WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_MULTILINE,
			150,70,100,20,hwnd,(HMENU)REGIST_PASS,((LPCREATESTRUCT)(lp))->hInstance,NULL);
		DefEditProc= (WNDPROC)GetWindowLong(pass , GWL_WNDPROC);
		SetWindowLong(pass , GWL_WNDPROC , (LONG)EditProc);

コード:

WNDPROC DefEditProc;

LRESULT CALLBACK EditProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
	switch(msg) {
	case WM_CHAR:
		if(!(wp>='a'&& wp<='z') && !(wp>='A' && wp<='Z') && !(wp>='0'&& wp<='9'))
			return 0;
	}
	return CallWindowProc(DefEditProc , hwnd , msg , wp , lp);
}
 Dango San

あんずちゃん

Re: WinAPIのエディトコントロールについて

#5

投稿記事 by あんずちゃん » 9年前

だんごさん さんが書きました:半角英数字のみの入力方法は、エディットのメッセージ処理を行うことで可能です。

コード:

case WM_CREATE:
		pass = CreateWindow(TEXT("EDIT"),NULL,WS_OVERLAPPED | WS_TABSTOP | WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_MULTILINE,
			150,70,100,20,hwnd,(HMENU)REGIST_PASS,((LPCREATESTRUCT)(lp))->hInstance,NULL);
		DefEditProc= (WNDPROC)GetWindowLong(pass , GWL_WNDPROC);
		SetWindowLong(pass , GWL_WNDPROC , (LONG)EditProc);

コード:

WNDPROC DefEditProc;

LRESULT CALLBACK EditProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
	switch(msg) {
	case WM_CHAR:
		if(!(wp>='a'&& wp<='z') && !(wp>='A' && wp<='Z') && !(wp>='0'&& wp<='9'))
			return 0;
	}
	return CallWindowProc(DefEditProc , hwnd , msg , wp , lp);
}
ありがとうございます。
入力はボタンを押した後の処理で入力チェックで処理することにしました。
わざわざ書いていただいたのに、すみませんでした。


タブキーによるフォーカス移動がいまだに解決しないのですが、そちらの方はご存じないでしょうか?

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: WinAPIのエディトコントロールについて

#6

投稿記事 by YuO » 9年前

ES_MULTILINEは必須ですか。
複数行テキストボックスは,TABによる移動ができなくなります。
できるようにするには,自分でフォーカス移動を行う必要があるようです。
オフトピック
サブクラス化してWM_GETDLGCODEの戻り値からDLGC_WANTALLKEYSを消す,という方法はあるものの,改行ごと無効化されてしまいます。
パスワードなどは,ES_MULTILINEは不要ですし,ES_PASSWORD付けた方がよいですね。

あんずちゃん

Re: WinAPIのエディトコントロールについて

#7

投稿記事 by あんずちゃん » 9年前

YuO さんが書きました:ES_MULTILINEは必須ですか。
複数行テキストボックスは,TABによる移動ができなくなります。
できるようにするには,自分でフォーカス移動を行う必要があるようです。
オフトピック
サブクラス化してWM_GETDLGCODEの戻り値からDLGC_WANTALLKEYSを消す,という方法はあるものの,改行ごと無効化されてしまいます。
パスワードなどは,ES_MULTILINEは不要ですし,ES_PASSWORD付けた方がよいですね。
ご指摘ありがとうございます。
ES_MULTILINEはまったく不要でした。
以前使用していたソースをそのままコピーして使っていたので、気づきませんでした。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る