EditBoxやComboBoxなどのフィールドを"Tab"キーで順に移動する場合
はどのような制御が必要ですか?
また、EditBoxで"Ctrl" + "A"の全て選択は、どのようにすれば選択されますか?コピーとペーストは、デフォルトで動作しますが...
Edit Boxのキー操作
とりあえず参考に
お世話になります。
質問①のみです
昔、2.62時代に作成したフォーカスチェックの参考を贈ります。
コンボとか等作ったことがないので、質問に対して、該当しているのかは不明ですが、
今では、旧ウインドウ制御の一員で、最新版では動かないと思いますが、
後から他の方がすごいのを出してくるでしょうから、安心をしていてください。
追伸:コメントを追加しました。
当時は必要なキーをセンスして番号を取得した覚えがあります。
ヘルプで見ると、今ではKeydown等のイベントがあるようですね。
質問①のみです
昔、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等のイベントがあるようですね。
Re: Edit Boxのキー操作
制御と言うより、専用のAPIが用意されていますのでkino さんが書きました:> EditBoxやComboBoxなどのフィールドを"Tab"キーで順に移動する場合
> はどのような制御が必要ですか?
それを組み込むだけで実現できます。
※各コントロールのスタイルに「タブストップ」の追加をお忘れなく。。。
プロジェクト中(拡張子が.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
次の2つのメッセージを使えば「すべて選択」を実装できます。kino さんが書きました:> また、EditBoxで"Ctrl" + "A"の全て選択は、どのようにすれば選択されますか?コピーとペーストは、デフォルトで動作しますが...
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)