ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月27日(土) 21:25

全ての表示時間は UTC+09:00 です




返信する
ユーザー名:
件名:
メッセージ本文:
メッセージを入力してください。60000 字まで入力できます。 

フォントサイズ:
フォントカラー
オプション:
BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF
BBCode を無効にする
URL を自動的にパースしない
クイズ
お手数ですがカタカナで「エービー」と4文字を入力してください。:
答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。
   

トピックのレビュー - SetFocusしたCommandButtonをENTERキ-で押すには
作成者 メッセージ
  記事の件名:  非常に有益な  引用付きで返信する
私が探していたものを、ありがとう
投稿記事 Posted: 2011年9月11日(日) 06:06
  記事の件名:   引用付きで返信する
イグトランスさん、アドバイスありがとうございます。
やってみて上手く動きました(ただ、目的のボタンにはSetFocus以外にSendMessageでBS_DEFPUSHBUTTONを送り、またFocusを当ててないボタンはクリックするとサイクリックでBS_DEFPUSHBUTTONに変化するようなので、SendMessageでただのBS_PUSHBUTTONにしないといけませんが)

Flagを使ってのEnterKeyスレッドでやる方法にしろ、IsDialogMessageを使う方法にしろ、FocusのあるボタンをENTERキ-で押す方法が判りましたし、またそれぞれの注意点も判りました。
FocusのないSendMessageでBS_DEFPUSHBUTTONのみのやり方も含めて色々やってみたいと思います。
投稿記事 Posted: 2011年7月09日(土) 14:24
  記事の件名:   引用付きで返信する
通常のウィンドウで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で作られるダイアログが本物のダイアログでないためと考えています。
投稿記事 Posted: 2011年6月22日(水) 02:36
  記事の件名:   引用付きで返信する
そのあたりの挙動はダイアログボックスのほうが一般によく見かける挙動にするのが容易です。

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

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

すみません。今日はとりあえずここまで。
投稿記事 Posted: 2011年6月21日(火) 02:08
  記事の件名:   引用付きで返信する
アドバイスありがとうございます。
初心者ゆえあっちこっちぶつかりやっています。
他にも色々な方法があるようですが、以下内容で動いています。
(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)
とすると、ボタンが押された感じが出ますが、同時にマウスを動かしているとエラ-を起こすのでやめました。
投稿記事 Posted: 2011年6月12日(日) 13:36
  記事の件名:   引用付きで返信する
ボタンのプロパティで通知にチェックし
親ウインドウのプロシージャで取るか

サブクラス化で対応したらどうでしょうか。
投稿記事 Posted: 2011年6月03日(金) 17:43
  記事の件名:  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キ-を指定した場合は押せません。
投稿記事 Posted: 2011年6月02日(木) 15:45

全ての表示時間は UTC+09:00 です


ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean