Edit Boxのキー操作

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
kino

Edit Boxのキー操作

#1 投稿記事 by kino »

EditBoxやComboBoxなどのフィールドを"Tab"キーで順に移動する場合
はどのような制御が必要ですか?

また、EditBoxで"Ctrl" + "A"の全て選択は、どのようにすれば選択されますか?コピーとペーストは、デフォルトで動作しますが...
omasu
記事: 96
登録日時: 2005年9月02日(金) 22:15
連絡する:

とりあえず参考に

#2 投稿記事 by omasu »

お世話になります。

 質問①のみです
 昔、2.62時代に作成したフォーカスチェックの参考を贈ります。

コンボとか等作ったことがないので、質問に対して、該当しているのかは不明ですが、
今では、旧ウインドウ制御の一員で、最新版では動かないと思いますが、
後から他の方がすごいのを出してくるでしょうから、安心をしていてください。

コード: 全て選択

'
'**************************************************************************
'*     フォーカスチェック(共通プロシージャ)
'**************************************************************************
'
Sub Forcus_check(ByVal a As Long) ' 項目が4個以内
    Forcus_Flag=0
    If KeyState(31) Or KeyState(13) Then Forcus_Flag=1 ' 「↓」また「エンター」キー
    If KeyState(30) Then Forcus_Flag=-1 ' 「↑」キー
    If Forcus_Flag Then
       Forcus=Forcus+Forcus_Flag
       If Forcus=0 Or Forcus>a Then ' 一番下または一番上に言った場合
          Forcus=Abs(Forcus-a)
       End If
       Forcus_Set(Forcus)
       Sleep 200 ' 当時、なぜか必要だった
    End If
EndSub
'
'**************************************************************************
'*     フォーカスセット(共通プロシージャ)
'**************************************************************************
'
Sub Forcus_Set(ByVal a As Long)
    Forcus=a
    Select Case Forcus
           Case 1
                SendWndMsg hParamBox1,WM_ACTIVATE,MAKELONG(WA_ACTIVE,0),hParamBox1
           Case 2
                SendWndMsg hParamBox2,WM_ACTIVATE,MAKELONG(WA_ACTIVE,0),hParamBox2
           Case 3
                SendWndMsg hParamBox3,WM_ACTIVATE,MAKELONG(WA_ACTIVE,0),hParamBox3
           Case 4
                SendWndMsg hParamBox4,WM_ACTIVATE,MAKELONG(WA_ACTIVE,0),hParamBox4
    End Select
EndSub
追伸:コメントを追加しました。
   当時は必要なキーをセンスして番号を取得した覚えがあります。
   ヘルプで見ると、今ではKeydown等のイベントがあるようですね。
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: Edit Boxのキー操作

#3 投稿記事 by NoWest »

kino さんが書きました:> EditBoxやComboBoxなどのフィールドを"Tab"キーで順に移動する場合
> はどのような制御が必要ですか?
制御と言うより、専用のAPIが用意されていますので
それを組み込むだけで実現できます。
※各コントロールのスタイルに「タブストップ」の追加をお忘れなく。。。


プロジェクト中(拡張子が.abp)または自作のメッセージループを次のように改良します。

コード: 全て選択

Declare Function IsDialogMessage Lib "user32" Alias "IsDialogMessageA" (hDlg As HWND, ByRef lpMsg As MSG) As Long

'---------------------------
'  Window Message Loop
'---------------------------
Dim msgMain As MSG, iResult As Long
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
kino さんが書きました:> また、EditBoxで"Ctrl" + "A"の全て選択は、どのようにすれば選択されますか?コピーとペーストは、デフォルトで動作しますが...
次の2つのメッセージを使えば「すべて選択」を実装できます。

WM_GETTEXTLENGTH テキストの長さを取得
EM_SETSEL 選択開始点と終了点を指定してテキストを選択する。


と、まぁこれくらいは分かっているとして
「Ctrl + A」のショートカットキーをどうやって実装するのかだと存じます。

となりますと、
エディットボックスをサブクラス化するという強引な手法を除けば
普通にアクセラレータテーブルを実装することになると思います。


先ほど改造したメッセージループにさらに改良を加えます。
※メニューに「全て選択:IDM_ALLSELECT」なんぞを準備してください。

コード: 全て選択

Declare Function IsDialogMessage Lib "user32" Alias "IsDialogMessageA" (hDlg As HWND, ByRef lpMsg As MSG) As Long

Const FVIRTKEY = TRUE
Const FNOINVERT = &H02
Const FSHIFT = &H04
Const FCONTROL = &H08
Const FALT = &H10

TypeDef HACCEL = DWord

Type ACCEL
	fVirt As Word
	key As Word
	cmd As Word
End Type

Declare Function CreateAcceleratorTable Lib "user32" Alias "CreateAcceleratorTableA" (ByRef lpacl As ACCEL, i As Long) As HACCEL
Declare Function TranslateAccelerator Lib "user32" Alias "TranslateAcceleratorA" (hWnd As HWND, hAccTable As HACCEL, ByRef lpMsg As MSG) As Long
Declare Function DestroyAcceleratorTable Lib "user32" (hAccel As HACCEL) As Long

Dim acl[0] As ACCEL

acl[0].fVirt=FVIRTKEY or FCONTROL
acl[0].key=Asc("A")
acl[0].cmd=IDM_ALLSELECT

Dim hAccel As HACCEL
hAccel = CreateAcceleratorTable(acl[0],1)

'---------------------------
'  Window Message Loop
'---------------------------
Dim msgMain As MSG, iResult As Long
Do
	iResult=GetMessage(msgMain,0,0,0)
	If iResult=0 or iResult=-1 Then Exit Do
	If TranslateAccelerator(hMainWnd,hAccel,msgMain)=FALSE Then
		If IsDialogMessage(hMainWnd, msgMain)=FALSE Then
			TranslateMessage(msgMain)
			DispatchMessage(msgMain)
		End If
	End If
Loop
DestroyAcceleratorTable(hAccel)
ExitProcess(0)
kino

#4 投稿記事 by kino »

皆さん参考になります。。。
早速実装しましたが...tabを押すと..EditBoxが移動してくれましたが
いろんな方向に飛んで行きます。Priorityってあるんですか?
高信期

#5 投稿記事 by 高信期 »

StyleにWS_TABSTOPを持つウィンドウが作成された順番でフォーカスが移動する…はずです。
それ以外でもMainWndProc関数内でWM_NEXTDLGCTLを捕まえてlParamには1を、
wParamには次にフォーカスを与えるコントロールのハンドルをセットしてからEventCall_MainWnd関数を呼び出す、
という方法もあります。
返信する