hscallbk.dllを利用したイベントの監視。
ステータスバーに捕まえたイベントを報告します。
切り取りやアンドゥなどのショートカットキー(ctrl+A,C,V,X,Y,Z)をonkeyで実装しています。#include "Footy2.as"
#include "hscallbk.as"
#include "user32.as"
#func Focus "" int, int, int, int
#func MoveCaret "" int, int, int, int
#func TextModified "" int, int, int
#func InsertModeChanged "" int, int, int
*init
gosub *createGUIObjects
gosub *setCallBackFunctions
onkey gosub *onPushKey
stop
*createGUIObjects
// ステータスバー作成
// 参考:http://lhsp.s206.xrea.com/hsp_object8.html
// :http://yokohama.cool.ne.jp/chokuto/urawaza/statusbar.html
winobj "msctls_statusbar32", "ready", , $50000000
statusbar_id = stat
if statusbar_id == -1 {
dialog "ウィンドウオブジェクトが正常に生成されませんでした", 1
end
}
// ステータスバーの高さを取得
dim rect, 4
GetWindowRect objinfo_hwnd(statusbar_id), varptr(rect)
if stat == 0 {
dialog "ステータスバーの座標取得に失敗しました", 1
end
}
statusbar_height = rect(3) - rect(1)
// Footyエディタコントロール設置
Footy2Create hwnd, 0, 0, ginfo_winx, ginfo_winy - statusbar_height, 0
footy_id = stat
if footy_id < 0 {
dialog "Error : type " + stat, 1
end
}
return
// コールバック関数の登録
*setCallBackFunctions
setcallbk proc_Focus, Focus, *onFocus
setcallbk proc_MoveCaret, MoveCaret, *onMoveCaret
setcallbk proc_TextModified, TextModified, *onTextModified
setcallbk proc_InsertModeChanged, InsertModeChanged, *onInsertModeChanged
Footy2SetFuncFocus footy_id, varptr(proc_Focus), 0
Footy2SetFuncMoveCaret footy_id, varptr(proc_MoveCaret), 0
Footy2SetFuncTextModified footy_id, varptr(proc_TextModified), 0
Footy2SetFuncInsertModeChanged footy_id, varptr(proc_InsertModeChanged), 0
return
// フォーカスを得た/失った
*onFocus
if callbkarg(3) & $FF {
message = "Footyコントロールがフォーカスを得ました"
} else {
message = "Footyコントロールがフォーカスを失いました"
}
sendmsg objinfo_hwnd(statusbar_id), $401, 0, message
return
// キャレットが移動した
*onMoveCaret
sendmsg objinfo_hwnd(statusbar_id), $401, 0, "キャレット位置が変更されました(" + callbkarg(2) + ":" + callbkarg(3) + ")"
return
// テキストが編集された
*onTextModified
switch callbkarg(2)
case MODIFIED_CAUSE_CHAR
message = "文字が入力されました(IMEオフ)"
swbreak
case MODIFIED_CAUSE_IME
message = "文字が入力されました(IMEオン)"
swbreak
case MODIFIED_CAUSE_DELETE
message = "Deleteキーが押されました"
swbreak
case MODIFIED_CAUSE_BACKSPACE
message = "BackSpaceキーが押されました"
swbreak
case MODIFIED_CAUSE_ENTER
message = "Enterキーが押されました"
swbreak
case MODIFIED_CAUSE_UNDO
message = "元に戻す処理が実行されました"
swbreak
case MODIFIED_CAUSE_REDO
message = "やり直し処理が実行されました"
swbreak
case MODIFIED_CAUSE_CUT
message = "切り取り処理が行われました"
swbreak
case MODIFIED_CAUSE_PASTE
message = "貼り付け処理が行われました"
swbreak
case MODIFIED_CAUSE_INDENT
message = "インデント処理が行われました"
swbreak
case MODIFIED_CAUSE_UNINDENT
message = "逆インデント処理が行われました"
swbreak
case MODIFIED_CAUSE_TAB
message = "タブキーが押されました"
swbreak
default
message = "テキストが編集されました(UNKNOWN)"
swbreak
swend
sendmsg objinfo_hwnd(statusbar_id), $401, 0, message
return
// 挿入/上書モードの変更
*onInsertModeChanged
if callbkarg(2) & $FF {
message = "挿入モードに変更されました"
} else {
message = "上書モードに変更されました"
}
sendmsg objinfo_hwnd(statusbar_id), $401, 0, message
return
// ショートカットキー
*onPushKey
keycode = iparam
getkey ctrl, 17
if ctrl {
switch keycode
case 'A'
Footy2SelectAll footy_id
swbreak
case 'C'
Footy2Copy footy_id
swbreak
case 'V'
Footy2Paste footy_id
swbreak
case 'X'
Footy2Cut footy_id
swbreak
case 'Y'
Footy2Redo footy_id
swbreak
case 'Z'
Footy2Undo footy_id
swbreak
swend
}
return
アクセラレータキーを利用したスクリプトがこちら。
ウィンドウの最大化にも対応しています。// アクセラレータキーを使用
// Footy2付属のC++サンプルとほぼ同等
#include "Footy2.as"
#include "hscallbk.as"
#include "user32.as"
#func Focus "" int, int, int, int
#func MoveCaret "" int, int, int, int
#func TextModified "" int, int, int
#func InsertModeChanged "" int, int, int
#const FVIRTKEY 0x0001
#const FNOINVERT 0x0002
#const FSHIFT 0x0004
#const FCONTROL 0x0008
#const FALT 0x0010
#const WM_SIZE 0x0005
#const WM_COMMAND 0x0111
#enum IDM_UNDO = 1
#enum IDM_REDO
#enum IDM_CUT
#enum IDM_COPY
#enum IDM_PASTE
#enum IDM_SELECTALL
// 初期化作業
*init
gosub *createGUIObjects
gosub *createAccelTable
gosub *setCallBackFunctions
oncmd gosub *on_resize, WM_SIZE
oncmd gosub *on_command, WM_COMMAND
onexit goto *on_exit
dim msg, 7
Footy2SetFocus footy_id
// メッセージループ
*msg_loop
GetMessage varptr(msg), 0, 0, 0
ret = stat
if (ret == 0)|(ret == -1) {
goto *on_exit
}
TranslateAccelerator hwnd, haccel, varptr(msg)
if stat == 0 {
TranslateMessage varptr(msg)
DispatchMessage varptr(msg)
}
goto *msg_loop
#define WS_MAXIMIZEBOX 0x00010000
#define WS_SIZEBOX 0x00040000
*createGUIObjects
// ウィンドウ初期化
screen 0, ginfo_dispx, ginfo_dispy
GetWindowLong hwnd, -16
SetWindowLong hwnd, -16, stat | WS_MAXIMIZEBOX | WS_SIZEBOX
title "Footy2サンプル on Footy2 ver." + GetFooty2Ver()
width 640, 480
// ステータスバー作成
// 参考:http://lhsp.s206.xrea.com/hsp_object8.html
// :http://yokohama.cool.ne.jp/chokuto/urawaza/statusbar.html
winobj "msctls_statusbar32", "ready", , $50000000
statusbar_id = stat
if statusbar_id == -1 {
dialog "ウィンドウオブジェクトが正常に生成されませんでした", 1
end
}
// ステータスバーの高さを取得
dim rect, 4
GetWindowRect objinfo_hwnd(statusbar_id), varptr(rect)
if stat == 0 {
dialog "ステータスバーの座標取得に失敗しました", 1
end
}
statusbar_height = rect(3) - rect(1)
// Footyエディタコントロール設置
Footy2Create hwnd, 0, 0, ginfo_winx, ginfo_winy - statusbar_height, 0
footy_id = stat
if footy_id < 0 {
dialog "Error : type " + stat, 1
end
}
return
// アクセラレータテーブルの作成
// 参考:「アクセラレータ - HSP開発wiki」
// http://hspdev-wiki.net/?%A5%A2%A5%AF%A5%BB%A5%E9%A5%EC%A1%BC%A5%BF
*createAccelTable
sdim accel, 6*6
key = 'Z', 'Y', 'X', 'C', 'V', 'A'
repeat 6
poke accel, cnt*6+0, FCONTROL | FVIRTKEY
wpoke accel, cnt*6+2, key(cnt)
wpoke accel, cnt*6+4, cnt+1
loop
CreateAcceleratorTable varptr(accel), 6
haccel = stat
if haccel == 0 {
dialog "アクセラレータテーブル作成に失敗しました", 1
}
return
// コールバック関数の登録
*setCallBackFunctions
setcallbk proc_Focus, Focus, *onFocus
setcallbk proc_MoveCaret, MoveCaret, *onMoveCaret
setcallbk proc_TextModified, TextModified, *onTextModified
setcallbk proc_InsertModeChanged, InsertModeChanged, *onInsertModeChanged
Footy2SetFuncFocus footy_id, varptr(proc_Focus), 0
Footy2SetFuncMoveCaret footy_id, varptr(proc_MoveCaret), 0
Footy2SetFuncTextModified footy_id, varptr(proc_TextModified), 0
Footy2SetFuncInsertModeChanged footy_id, varptr(proc_InsertModeChanged), 0
return
// フォーカスを得た/失った
*onFocus
if callbkarg(3) & $FF {
message = "Footyコントロールがフォーカスを得ました"
} else {
message = "Footyコントロールがフォーカスを失いました"
}
sendmsg objinfo_hwnd(statusbar_id), $401, 0, message
return
// キャレットが移動した
*onMoveCaret
sendmsg objinfo_hwnd(statusbar_id), $401, 0, "キャレット位置が変更されました(" + callbkarg(2) + ":" + callbkarg(3) + ")"
return
// テキストが編集された
*onTextModified
switch callbkarg(2)
case MODIFIED_CAUSE_CHAR
message = "文字が入力されました(IMEオフ)"
swbreak
case MODIFIED_CAUSE_IME
message = "文字が入力されました(IMEオン)"
swbreak
case MODIFIED_CAUSE_DELETE
message = "Deleteキーが押されました"
swbreak
case MODIFIED_CAUSE_BACKSPACE
message = "BackSpaceキーが押されました"
swbreak
case MODIFIED_CAUSE_ENTER
message = "Enterキーが押されました"
swbreak
case MODIFIED_CAUSE_UNDO
message = "元に戻す処理が実行されました"
swbreak
case MODIFIED_CAUSE_REDO
message = "やり直し処理が実行されました"
swbreak
case MODIFIED_CAUSE_CUT
message = "切り取り処理が行われました"
swbreak
case MODIFIED_CAUSE_PASTE
message = "貼り付け処理が行われました"
swbreak
case MODIFIED_CAUSE_INDENT
message = "インデント処理が行われました"
swbreak
case MODIFIED_CAUSE_UNINDENT
message = "逆インデント処理が行われました"
swbreak
case MODIFIED_CAUSE_TAB
message = "タブキーが押されました"
swbreak
default
message = "テキストが編集されました(UNKNOWN)"
swbreak
swend
sendmsg objinfo_hwnd(statusbar_id), $401, 0, message
return
// 挿入/上書モードの変更
*onInsertModeChanged
if callbkarg(2) & $FF {
message = "挿入モードに変更されました"
} else {
message = "上書モードに変更されました"
}
sendmsg objinfo_hwnd(statusbar_id), $401, 0, message
return
// WM_COMMANDメッセージを受け取った
*on_command
switch wparam & $FFFF
case IDM_UNDO
Footy2Undo footy_id
swbreak
case IDM_REDO
Footy2Redo footy_id
swbreak
case IDM_CUT
Footy2Cut footy_id
swbreak
case IDM_COPY
Footy2Copy footy_id
swbreak
case IDM_PASTE
Footy2Paste footy_id
swbreak
case IDM_SELECTALL
Footy2SelectAll footy_id
swbreak
swend
return
// WM_SIZEメッセージを受け取った
#const SIZE_RESTORED 0
#const SIZE_MAXIMIZED 2
*on_resize
if (wparam == SIZE_RESTORED) | (wparam == SIZE_MAXIMIZED) {
Footy2Move footy_id, 0, 0, ginfo_winx, ginfo_winy - statusbar_height
sendmsg objinfo_hwnd(id_statusbar), WM_SIZE, SIZE_RESTORED, 0
}
return 0
// アクセラレータテーブルの削除
*destroyAccelTable
if haccel != 0 {
DestroyAcceleratorTable haccel
}
return
// 終了時処理
*on_exit
gosub *destroyAccelTable
end
2008年1月8日火曜日
Footy2の「イベントの監視」機能を利用する
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿