ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月28日(木) 17:36

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




新しいトピックを投稿する  トピックへ返信する  [ 7 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2011年6月02日(木) 15:45 
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月03日(金) 17:43 
ボタンのプロパティで通知にチェックし
親ウインドウのプロシージャで取るか

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


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 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)
とすると、ボタンが押された感じが出ますが、同時にマウスを動かしているとエラ-を起こすのでやめました。


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2011年6月21日(火) 02:08 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
そのあたりの挙動はダイアログボックスのほうが一般によく見かける挙動にするのが容易です。

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

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

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


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2011年6月22日(水) 02:36 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
通常のウィンドウで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年7月09日(土) 14:24 
イグトランスさん、アドバイスありがとうございます。
やってみて上手く動きました(ただ、目的のボタンにはSetFocus以外にSendMessageでBS_DEFPUSHBUTTONを送り、またFocusを当ててないボタンはクリックするとサイクリックでBS_DEFPUSHBUTTONに変化するようなので、SendMessageでただのBS_PUSHBUTTONにしないといけませんが)

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


通報する
ページトップ
   
 記事の件名: 非常に有益な
投稿記事Posted: 2011年9月11日(日) 06:06 
私が探していたものを、ありがとう


通報する
ページトップ
   
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 7 件の記事 ] 

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


オンラインデータ

このフォーラムを閲覧中のユーザー: Ahrefs [Bot] & ゲスト[15人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

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