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)