More ... | HSP3標準ライブラリ:tasktray.as
タスクトレイ操作 tasktray.as/*
* tasktray.as
*
* タスクトレイ操作モジュール
* ※image.as を先に読み込んでおいてください
*/
#module "tasktray"
#uselib "shell32.dll"
#func Shell_NotifyIcon "Shell_NotifyIconA" int, sptr
#define WM_APP $8000 ; ※重複を防ぐためグローバルになっていないので注意
#define global WM_APP_TASKTRAY (WM_APP + 100)
#define NIM_ADD 0
#define NIM_MODIFY 1
#define NIM_DELETE 2
#define NIF_MESSAGE 1
#define NIF_ICON 2
#define NIF_TIP 4
#define TRAY_ICON_SX 16
#define TRAY_ICON_SY 16
; 外から呼ばないでください
#deffunc tasktray_core int uMsg, int wnd, int uID, int uFlags, int uCallbackMessage, int hIcon, str szTip
; NOTIFYICONDATA構造体に設定
dim nid,22
nid.0 = 88
nid.1 = wnd
nid.2 = uID
nid.3 = uFlags
nid.4 = uCallbackMessage
nid.5 = hIcon
if uFlags & NIF_TIP {
sdim _tip,64
_tip = szTip
memcpy nid,_tip,63,24
}
Shell_NotifyIcon uMsg, varptr(nid)
; 忘れずにアイコンを削除
if uFlags & NIF_ICON {
destroy_icon nid.5
}
return
/*
* tasktray_create id, tip, x, y, mask, wid
* id : 追加するタスクトレイアイコンに関連付けるID
* tip : ツールチップ
* x : 追加するイメージの左上X座標
* y : 追加するイメージの左上Y座標
* mask : 透過色(0xRRGGBBの形式)
* wid : 追加するイメージの描画されているウインドウID
*
* 指定の画面のイメージをタスクトレイに追加します。
* アイコンのサイズは 16x16 固定です。
*/
#deffunc tasktray_create int id, str tip, int x, int y, int mask, int wid
sel_id = ginfo_sel
gsel wid, 0
; アイコン作成
create_imagelist TRAY_ICON_SX, TRAY_ICON_SY, 1 : hImgIcon = stat
add_imagelist hImgIcon, x, y, TRAY_ICON_SX, TRAY_ICON_SY, mask
geticon_imagelist hImgIcon, stat
gsel sel_id, 0
mref bmscr,67
tasktray_core NIM_ADD, bmscr.13, id, NIF_MESSAGE | NIF_ICON | NIF_TIP, WM_APP_TASKTRAY, stat, tip
destroy_imagelist hImgIcon
return
/*
* tasktray_modify_tip id, tip
* id : タスクトレイアイコンに関連付けられているID
* tip : ツールチップ
*
* タスクトレイアイコンのツールチップを変更します。
*/
#deffunc tasktray_modify_tip int id, str tip
mref bmscr,67
tasktray_core NIM_MODIFY, bmscr.13, id, NIF_TIP, 0, 0, tip
return
/*
* tasktray_modify_icon id, x, y, mask, wid
* id : タスクトレイアイコンに関連付けられているID
* tip : ツールチップ
* x : 追加するイメージの左上X座標
* y : 追加するイメージの左上Y座標
* mask : 透過色(0xRRGGBBの形式)
* wid : 追加するイメージの描画されているウインドウID
*
* タスクトレイアイコンに指定されているアイコンを変更します。
*/
#deffunc tasktray_modify_icon int id, int x, int y, int mask, int wid
sel_id = ginfo_sel
gsel wid, 0
; アイコン作成
create_imagelist TRAY_ICON_SX, TRAY_ICON_SY, 1 : hImgIcon = stat
add_imagelist hImgIcon, x, y, TRAY_ICON_SX, TRAY_ICON_SY, mask
geticon_imagelist hImgIcon, stat
gsel sel_id, 0
mref bmscr,67
tasktray_core NIM_MODIFY, bmscr.13, id, NIF_ICON, 0, stat, ""
destroy_imagelist hImgIcon
return
/*
* tasktray_delete id
* id : タスクトレイアイコンに関連付けられているID
*
* タスクトレイアイコンを削除します。
*/
#deffunc tasktray_delete int id
mref bmscr,67
tasktray_core NIM_DELETE, bmscr.13, id, 0, 0, 0, ""
return
#global
tasktray_sample.hsp#include "image.as"
#include "tasktray.as"
#define WM_APP $8000
#define WM_MOUSEMOVE 512
#define WM_LBUTTONDBLCLK 515
#define WM_LBUTTONDOWN 513
#define WM_LBUTTONUP 514
#define WM_MBUTTONDBLCLK 521
#define WM_MBUTTONDOWN 519
#define WM_MBUTTONUP 520
#define WM_RBUTTONDBLCLK 518
#define WM_RBUTTONDOWN 516
#define WM_RBUTTONUP 517
onexit goto *quit
font "MS ゴシック", 10
pos 0, -2 : mes "HSP"
pos 0, 6 : mes "3.0"
tasktray_create 1,"HSP 3.0",0,0,$FFFFFF,0
oncmd gosub *on_wm_app_tasktray,WM_APP_TASKTRAY
stop
*on_wm_app_tasktray
switch lParam
case WM_RBUTTONDOWN
dialog "右クリック"
swbreak
case WM_LBUTTONDBLCLK
dialog "左ダブルクリック"
swbreak
default
mes strf("%08X,", lParam) + strf("%08X", wParam)
swend
return
*quit
tasktray_delete 1
end
tasktray_sample2.hsp; タスクトレイスロット
#include "image.as"
#include "tasktray.as"
#define WM_APP $8000
#define WM_LBUTTONDBLCLK 515
#define WM_LBUTTONDOWN 513
#define WM_RBUTTONUP 517
#define SCROLL_Y 8
gsel 0, -1
onexit goto *quit
oncmd gosub *on_wm_app_tasktray,WM_APP_TASKTRAY
font "MS ゴシック", 16, 1
color 255,255,255 : boxf 0,0,16,11*16
color 255, 0, 0 : boxf 16,0,32,11*16
color 255,255, 0 : boxf 32,0,48,11*16
repeat 10+1
n = 9 - (cnt \ 10)
color 0, 0, 0 : pos 4,cnt * 16 : mes n
color 255,255,255 : pos 16+4,cnt * 16 : mes n
color 0, 0, 0 : pos 32+4,cnt * 16 : mes n
loop
tasktray_create 0,"",0,0,$FFFFFE,0
tasktray_create 1,"",0,0,$FFFFFE,0
tasktray_create 2,"",0,0,$FFFFFE,0
roll_count = 3
gosub *init_counter
*main
await 10
if(0 == roll_count) {
wait 100
goto *main
}
roll_count = 3
repeat 3
if f(cnt) {
num = cnt
info= 0
gosub *draw_counter
if 0 != n(cnt) \ SCROLL_Y {
f(cnt) |= 2
} else {
f(cnt) &= 1
}
n(cnt) = (n(cnt) + 1) \ (10 * SCROLL_Y)
} else {
roll_count--
}
loop
if 0 == roll_count {
repeat 3
n(cnt) = n(cnt) / SCROLL_Y * SCROLL_Y
loop
if n.0 == n.1 && n.1 == n.2 {
info = 2
} else {
info = 1
}
gosub *blink_counter
gosub *init_counter
}
goto *main
*init_counter
n = 0,0,0
f = 3,3,3
repeat 3
n(cnt) = rnd(10) * SCROLL_Y
loop
return
*draw_counter
y = (n(num) / SCROLL_Y \ 10) * 16
y+= n(num) \ SCROLL_Y * (16 / SCROLL_Y)
tasktray_modify_icon num, info * 16, 159 - y, $FFFFFE, 0
return
*blink_counter
oncmd 0 ; 割り込み(マウス移動)がかかるとうまくいかないので
info.1 = info
repeat 6
info = info.1 * (cnt \ 2)
repeat 3
num = cnt
gosub *draw_counter
loop
wait 25
loop
oncmd 1
return
*on_wm_app_tasktray
oncmd 0 ; 割り込み(マウス移動)がかかるとうまくいかないので
switch lParam
case WM_RBUTTONUP
goto *quit
swbreak
case WM_LBUTTONDBLCLK
roll_count = 3
swbreak
case WM_LBUTTONDOWN
if 0 < roll_count : f(wParam) &= $E
swbreak
swend
oncmd 1
return
*quit
tasktray_delete 0
tasktray_delete 1
tasktray_delete 2
end
|