ページ 11

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

Posted: 2016年5月08日(日) 22:03
by あんずちゃん

コード:

		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のところで半角英数字のみ入力できるようにしたいのですが、コントロールで設定することはできないのでしょうか?

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

Posted: 2016年5月08日(日) 22:45
by みけCAT
あんずちゃん さんが書きました:WS_TABSTOPを付けているのですが、タブキーによるフォーカス移動ができません。
どうすればいいのですか?
IsDialogMessage()関数をメッセージループに入れるといいかもしれません。
IsDialogMessageとTabキーによるフォーカス移動など - Programming Field

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

Posted: 2016年5月08日(日) 23:02
by あんずちゃん
みけ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;

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

Posted: 2016年5月09日(月) 01:54
by だんごさん
半角英数字のみの入力方法は、エディットのメッセージ処理を行うことで可能です。

コード:

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);
}

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

Posted: 2016年5月09日(月) 14:21
by あんずちゃん
だんごさん さんが書きました:半角英数字のみの入力方法は、エディットのメッセージ処理を行うことで可能です。

コード:

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);
}
ありがとうございます。
入力はボタンを押した後の処理で入力チェックで処理することにしました。
わざわざ書いていただいたのに、すみませんでした。


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

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

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

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

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