More ... | HSP3標準ライブラリ:image.as
イメージ操作 image.as/*
* image.as
*
* イメージ操作モジュール
*/
#ifndef IMAGE_HSP_INCLUDED
#define global IMAGE_HSP_INCLUDED
#module Image
#uselib "comctl32"
#func InitCommonControls "InitCommonControls"
#func ImageList_Create "ImageList_Create" int, int, int, int, int
#func ImageList_AddMasked "ImageList_AddMasked" int, int, int
#func ImageList_Destroy "ImageList_Destroy" int
#func ImageList_Draw "ImageList_Draw" int, int, int, int, int, int
#func ImageList_GetIcon "ImageList_GetIcon" int,int,int
#uselib "user32"
#func DestroyIcon "DestroyIcon" int
#func DrawIconEx "DrawIconEx" int, int, int, int, int, int, int, int, int
#func LoadCursor "LoadCursorA" int, int
#func LoadCursorFromFile "LoadCursorFromFileA" sptr
#func SetCursor "SetCursor" int
#func SetClassLong "SetClassLongA" int, int, int
#uselib "shell32"
#func ExtractIconEx "ExtractIconExA" sptr, int, int, int, int
#uselib "gdi32"
#func CreateCompatibleBitmap "CreateCompatibleBitmap" int, int, int
#func CreateCompatibleDC "CreateCompatibleDC" int
#func SelectObject "SelectObject" int, int
#func DeleteObject "DeleteObject" int
#func BitBlt "BitBlt" int, int, int, int, int, int, int, int, int
#func DeleteDC "DeleteDC" int
// カーソル ID
#const global IDC_APPSTARTING 0x00007F8A // 砂時計付き矢印カーソル
#const global IDC_ARROW 0x00007F00 // 標準矢印カーソル
#const global IDC_CROSS 0x00007F03 // 十字カーソル
#const global IDC_HAND 0x00007F89 // Windows 98/Me/2000/XP:ハンドカーソル
#const global IDC_HELP 0x00007F8B // クエスチョンマーク付き矢印カーソル
#const global IDC_IBEAM 0x00007F01 // アイビーム (縦線) カーソル
#const global IDC_NO 0x00007F88 // 禁止カーソル
#const global IDC_SIZEALL 0x00007F86 // 4 方向矢印カーソル
#const global IDC_SIZENESW 0x00007F83 // 斜め左下がりの両方向矢印カーソル
#const global IDC_SIZENS 0x00007F85 // 上下両方向矢印カーソル
#const global IDC_SIZENWSE 0x00007F82 // 斜め右下がりの両方向矢印カーソル
#const global IDC_SIZEWE 0x00007F84 // 左右両方向矢印カーソル
#const global IDC_UPARROW 0x00007F04 // 垂直の矢印カーソル
#const global IDC_WAIT 0x00007F02 // 砂時計カーソル
#const ILC_MASK 0x00000001
#const ILC_COLOR24 0x00000018
#const ILD_TRANSPARENT 0x00000001
/*
* extract_icon filename, index, size
* filename : アイコンのあるファイル名
* index : アイコンのインデックス
* size : アイコンのサイズ(1=大きいアイコン/0=小さいアイコン)
*
* filenameのファイルから、アイコンを読み込みます。
* 成功した場合は、statにアイコンのハンドルが返ります。
* 失敗した場合は、statの値は0になります。
* なお、読み込んだハンドルは、必ずdestroy_iconで破棄する必要があります。
*/
#deffunc extract_icon str filename, int index, int size, local hicon
if size {
ExtractIconEx filename, index, varptr(hicon), 0, 1
} else {
ExtractIconEx filename, index, 0, varptr(hicon), 1
}
if stat > 0 {
return hicon
}
return 0
/*
* draw_icon hicon, w, h
* hicon : アイコンのハンドル
* w : アイコンの幅
* h : アイコンの高さ
*
* 現在の画面のカレントポジションに、アイコンを描画します。
* この描画は、redraw 1 を行うまで画面には反映されません。
*/
#deffunc draw_icon int hicon, int w, int h
DrawIconEx hdc, ginfo_cx, ginfo_cy, hicon, w, h, 0, 0, 3
return
/*
* destroy_icon hicon
* hicon : アイコンのハンドル
*
* アイコンのハンドルを破棄します。
*/
#deffunc destroy_icon int hicon
DestroyIcon hicon
return
#deffunc change_cursor@Image int hcursor
SetClassLong hwnd, -12, hcursor
SetCursor hcursor
return
/*
* set_cursor filename
* filename : カーソルファイル名
*
* カーソルファイルを読み込み、カーソルを変更します。
*/
#deffunc set_cursor str filename
LoadCursorFromFile filename
if stat : change_cursor stat
return
/*
* set_syscursor id
* id : カーソルID
*
* システム定義のカーソルを読み込み、カーソルを変更します。
* カーソルIDには、このファイルで定義されているIDC_*の定数を使用してください。
*/
#deffunc set_syscursor int id
LoadCursor 0, id
if stat : change_cursor stat
return
#deffunc create_dib@Image int x, int y, int w, int h, local hbitmap, local hdcmem
CreateCompatibleBitmap hdc, w, h
hbitmap = stat
CreateCompatibleDC hdc
hdcmem = stat
SelectObject hdcmem, hbitmap
BitBlt hdcmem, 0, 0, w, h, hdc, x, y, 0xcc0020
DeleteDC hdcmem
return hbitmap
/*
* create_imagelist w, h, count
* w : イメージの幅
* h : イメージの高さ
* count : イメージの枚数
*
* イメージリストを作成し、そのハンドルをstatに返します。
* なお、作成したイメージリストは、必ずdestroy_imagelistで破棄する必要があります。
*/
#deffunc create_imagelist int w, int h, int count
InitCommonControls
ImageList_Create w, h, ILC_COLOR24 | ILC_MASK, count, 0
return
/*
* add_imagelist himagelist, x, y w, h, mask
* himagelist : イメージリストのハンドル
* x : 追加するイメージの左上X座標
* y : 追加するイメージの左上Y座標
* w : 追加するイメージの幅
* h : 追加するイメージの高さ
* mask : 透過色(0xRRGGBBの形式)
*
* 現在の画面のイメージをイメージリストに追加し、statにイメージのインデックスを返します。
*/
#define global add_imagelist(%1, %2 = ginfo_cx, %3 = ginfo_cy, %4 = 0, %5 = 0, %6 = 0x000000) \
add_imagelist@Image %1, %2, %3, %4, %5, %6
#deffunc add_imagelist@Image int himagelist, int x, int y, int w, int h, int mask, local hbitmap, local index
create_dib x, y, w, h
hbitmap = stat
ImageList_AddMasked himagelist, hbitmap, ((mask << 16) & $FF0000) | ((mask << 8) & $FF00) | (mask & $FF)
index = stat
DeleteObject hbitmap
return index
/*
* draw_imagelist himagelist, index
* himagelist : イメージリストのハンドル
* index : 描画するイメージのインデックス
*
* 現在の画面のカレントポジションに、イメージを描画します。
* この描画は、redraw 1 を行うまで画面には反映されません。
*/
#deffunc draw_imagelist int himagelist, int index
ImageList_Draw himagelist, index, hdc, ginfo_cx, ginfo_cy, ILD_TRANSPARENT
return
/*
* geticon_imagelist himagelist, index
* himagelist : イメージリストのハンドル
* index : 取得するイメージのインデックス
*
* イメージをアイコンとして取得します。
* 使い終わったアイコンは destroy_icon で削除してください。
*/
#deffunc geticon_imagelist int himagelist, int index
ImageList_GetIcon himagelist, index, ILD_TRANSPARENT
return stat
/*
* destroy_imagelist himangelist
* himangelist : イメージリストのハンドル
*
* イメージリストのハンドルを破棄します。
*/
#deffunc destroy_imagelist int himangelist
ImageList_Destroy himangelist
return
#global
#endif
image_sample.hsp
#include "image.as"
dialog "ico", 16
if stat == 0 : end
extract_icon refstr, 0, 1
hicon = stat
if hicon == 0 {
dialog "アイコンの読み込みに失敗しました"
end
}
pos 0, 0
draw_icon hicon, 32, 32
destroy_icon hicon
set_syscursor IDC_WAIT
await 500
redraw
set_syscursor IDC_ARROW
|