ab.com コミュニティ
https://www.activebasic.com/forum/

SetFocusしたCommandButtonをENTERキ-で押すには
https://www.activebasic.com/forum/viewtopic.php?t=2676
ページ 11

作成者:  ゲスト [ 2011年6月02日(木) 15:45 ]
記事の件名:  SetFocusしたCommandButtonをENTERキ-で押すには

MainWndに置いたCommandButtonにSetFocus関数でFocusすると、SPACEキ-では押せますがENTERキ-では押せません。
どうしたら押せますか?
(Ver 4.24.00を使用)

ちなみにMessageBox関数でuTypeをMB_OKとした場合などや、他のアプリソフトでは画面に配置したFocusのあるCommandButtonはSPACEキ-でもENTERキ-でも押せています。
また、Focusしないで
SendMessage(hCommandButton1, BM_SETSTYLE, BS_DEFPUSHBUTTON, 1)
として、MainWnd_KeyPressイベント内のIf条件でスタイルを指定し、ENTERとSPACEキ-を指定した場合は押せています。(これもFocusするとNG)
しかし、FocusしてMainWnd_KeyPressイベント内でGetFocus関数でもってきて、If条件でボタンにFocusがあるか?、 ENTERとSPACEキ-を指定した場合は押せません。

作成者:  HSABP [ 2011年6月03日(金) 17:43 ]
記事の件名: 

ボタンのプロパティで通知にチェックし
親ウインドウのプロシージャで取るか

サブクラス化で対応したらどうでしょうか。

作成者:  ゲスト [ 2011年6月12日(日) 13:36 ]
記事の件名: 

アドバイスありがとうございます。
初心者ゆえあっちこっちぶつかりやっています。
他にも色々な方法があるようですが、以下内容で動いています。
(MessageBox関数でuTypeをMB_OKとした場合などや、他の方のアプリソフトでもSPACEキ-とENTERキ-では動きが違い、ENTERキ-では押された感じを出さないようなのでこれでやっています)

MainWnd_Createイベントで、
コード:
	hEnterKey =CreateThread(ByVal NULL, 0, AddressOf(EnterKey), 0, 0, VarPtr(dwDummy))
でEnterKeyスレッドを生成し、ActivateFlagやCmdButton1_FocusFlagは別イベントで決めておき、
コード:
Function EnterKey(hWnd As DWord) As DWord
	While 1
		If ActivateFlag =1 Then				'ウィンドウがアクティブならスレッド処理
			If CmdButton1_FocusFlag =1 Then
				If GetAsyncKeyState(&h0d) and &H8000 Then		'&h0d =ENTERキーでキーが押された
					SendMessage(hCommandButton1, BM_CLICK, 0, 0)	'これだと押された感じが出ない
				End If
			End If
		Sleep(20)
		End If
	Wend
	CloseHandle(hEnterKey)
End Function
とスレッド処理。
コード:
SendMessage(hCommandButton1, BM_CLICK, 0, 0)
の代わりに
コード:
SendMessage(hCommandButton1, WM_LBUTTONDOWN, 0, 0)
Sleep(30)
SendMessage(hCommandButton1, WM_LBUTTONUP, 0, 0)
とすると、ボタンが押された感じが出ますが、同時にマウスを動かしているとエラ-を起こすのでやめました。

作成者:  イグトランス [ 2011年6月21日(火) 02:08 ]
記事の件名: 

そのあたりの挙動はダイアログボックスのほうが一般によく見かける挙動にするのが容易です。

具体的には、モーダルダイアログ上で、「タブストップ」のチェックを入れたコマンドボタンを配置します。そうすると、TabやShift+Tab、上下左右のカーソルキーなどでボタンを選択してEnterを叩くことで、そのボタンがマウスクリックと同様に「押す」ことが可能になります。

ただし、これでもSetFocusで直接フォーカスを当てた場合はEnterキーで「押す」反応は得られません。これをどうにかするには一工夫しないといけません。

すみません。今日はとりあえずここまで。

作成者:  イグトランス [ 2011年6月22日(水) 02:36 ]
記事の件名: 

通常のウィンドウでTabキーなどによる移動、Enterでの実行を実現するには、(プロジェクト名).abpのDo Loopの中を次のように書き換えます。
コード:
Do
	iResult=GetMessage(msgMain,0,0,0)
	If iResult=0 or iResult=-1 Then Exit Do
	If IsDialogMessage(hMainWnd, msgMain) = FALSE Then
		TranslateMessage(msgMain)
		DispatchMessage(msgMain)
	End If
Loop
TranslateMessageとDispatchMessageの前にIsDialogMessageを呼ぶようにしています。

ただ、これらが結局何をやっているかというと、おそらくはゲストさんが最初に書いているBS_DEFPUSHBUTTONとSetFocusの両方を制御しているといったところだと思います。なので、個人的にはBS_DEFPUSHBUTTONの方法(をダイアログまたはIsDigalogMessage併用のウィンドウで用いる)が良いと思います。

以下余談: WM_NEXTDLGCTLというメッセージがあって、これをSetFocusの代わりに使えば良さそうとは思ったのですが、動きませんでした。おそらくAB4で作られるダイアログが本物のダイアログでないためと考えています。

作成者:  ゲスト [ 2011年7月09日(土) 14:24 ]
記事の件名: 

イグトランスさん、アドバイスありがとうございます。
やってみて上手く動きました(ただ、目的のボタンにはSetFocus以外にSendMessageでBS_DEFPUSHBUTTONを送り、またFocusを当ててないボタンはクリックするとサイクリックでBS_DEFPUSHBUTTONに変化するようなので、SendMessageでただのBS_PUSHBUTTONにしないといけませんが)

Flagを使ってのEnterKeyスレッドでやる方法にしろ、IsDialogMessageを使う方法にしろ、FocusのあるボタンをENTERキ-で押す方法が判りましたし、またそれぞれの注意点も判りました。
FocusのないSendMessageでBS_DEFPUSHBUTTONのみのやり方も含めて色々やってみたいと思います。

作成者:  syclarsescevy [ 2011年9月11日(日) 06:06 ]
記事の件名:  非常に有益な

私が探していたものを、ありがとう

ページ 11 全ての表示時間は UTC+09:00 です
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/