〜 グラフィック 〜
ファイルアイコンを描画 (要USER32.DLL, SHELL32.DLL)

実行ファイルやDLLに入っているアイコンをHSPウィンドウ内に描画するには、
API関数ExtractIconで特定のアイコンリソースを抽出しましょう。
ExtractIconのパラメータには「インスタンスハンドル」「ファイルパス」「インデクス」を指定します。
インスタンスハンドルにはBMSCR構造体の要素14に格納されている値を指定、
ファイルパスはアイコンの格納されたファイルパスを格納した変数ポインタを指定、
インデクスは一番初めを0としたアイコン番号を指定します。
ファイルに幾つアイコンが含まれているかわからない場合はインデクスに−1を指定することで、
格納されているアイコン数を取得することが出来ます。
尚、API関数ExtractIconはアイコンのハンドル(管理番号)を取得するだけのものであるため、
ウィンドウ内に描画するにはAPI関数DrawIconまたはDrawIconExを使う必要があります。
また、アイコンが不要になればAPI関数DestroyIconでハンドルを解放してください。
ココで紹介するAPI関数DrawIconのパラメータには第1引数から順に
「デバイスコンテキスト」「描画基点X座標」「描画基点Y座標」「アイコンハンドル」を指定します。
デバイスコンテキストは描画先であるHSPのhdc(HSP2はBMSCR構造体要素4の値)を指定、
描画基点XY座標はウィンドウ左上を(0,0)としたpos同様の座標を指定、
アイコンハンドルにAPI関数ExtractIconで取得したハンドルを指定します。

API関数DrawIconは小さいアイコンを取得しても大きいアイコンサイズで取得されてしまうので、
サイズ指定または実際のサイズで描画する場合はコチラで紹介しているDrawIconExを使ってください。
また、ファイルに含まれている複数のアイコンを一度に取得したい場合、
1ファイルに含まれているアイコン数を取得する場合もコチラを参考にしてください。
	

drawicon アイコンパス, インデクス
アイコンパス描画対象アイコンファイルのパスを指定する
インデクスマルチプルアイコンのインデクスを指定する

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
	ll_libload user, "user32.dll"
	ll_getproc DestroyIcon, "DestroyIcon", user
	ll_getproc DrawIconAPI, "DrawIcon", user // 関数名に使いたいので末尾にAPIを付けた
	ll_libload shell, "shell32.dll"
	ll_getproc ExtractIcon, "ExtractIconA", shell

#module
#deffunc drawicon str, int
	mref file, 32 : mref no, 1
	mref bmscr, 67
	prm = bmscr.14, 0, no
	ll_getptr file : ll_ret prm.1
	ll_callfunc prm, 3, ExtractIcon@ : ll_ret h
	if h {
		prm = bmscr.4, csrx, csry, h
		ll_callfunc prm, 4, DrawIconAPI@
		ll_callfunc h, 1, DestroyIcon@
		redraw 1 // APIから直接描画した場合は画面を更新しなければならない
	}
	return
#global

	dialog "ico", 16, "読み込むアイコン"
	if stat : pos 50, 50 : drawicon refstr // アイコン読込
	stop

drawicon アイコンパス, インデクス
アイコンパス描画対象アイコンファイルのパスを指定する
インデクスマルチプルアイコンのインデクスを指定する

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#uselib "user32.dll"
#func  global DestroyIcon "DestroyIcon" int
#func  global DrawIconAPI "DrawIcon" int, int, int, int // 関数名に使いたいので末尾にAPIを付けた
#uselib "shell32.dll"
#cfunc global ExtractIcon "ExtractIconA" int, str, int

#module
#deffunc drawicon str file, int no
	mref bmscr, 67
	h = ExtractIcon(bmscr.14, file, no)
	if h {
		DrawIconAPI bmscr.4, ginfo_cx, ginfo_cy, h
		DestroyIcon h
		redraw 1 // APIから直接描画した場合は画面を更新しなければならない
	}
	return
#global

	dialog "ico", 16, "読み込むアイコン"
	if stat : pos 50, 50 : drawicon refstr // アイコン読込