EXE・DLLからアイコン取得(X) <TOP>
EXE・DLLからアイコンを取得し、ImageList_Drawで描画します。
SHGetFileInfo ファイルシステムオブジェクトの情報を取得
ImageList_Draw イメージを描画
ImageList_DrawEx デバイスコンテキストにイメージリストのアイテムを描画(オフセット・背景色・前景色を指定できる)
GetDC デバイスコンテキストのハンドルを取得
ReleaseDC デバイスコンテキストを解放
EXEから小さいアイコン、および大きいアイコンを取得し、それぞれをそのまま・透過・25%ブレンド・50%ブレンド描画しています。
'================================================================
'= EXE・DLLからアイコン取得(X)
'= (ImageList_Draw.bas)
'================================================================
#include "Windows.bi"
#define SHGFI_DISPLAYNAME &H200
'ディスプレイ名
#define SHGFI_EXEType &H2000
'EXEタイプ
#define SHGFI_LARGEICON &H0
'大きいアイコン
#define SHGFI_SHELLICONSIZE &H4
'シェルサイズアイコン
#define SHGFI_SMALLICON &H1
'小さいアイコン
#define SHGFI_SYSICONINDEX &H4000
'システムアイコンインデックス
#define SHGFI_TYPENAME &H400
'タイプ名
#define ILD_TRANSPARENT &H1
'マスクを使って表示(背景色を無視)
#define ILD_BLEND50 &H4
'システムハイライト色を50%ブレンド
#define ILD_BLEND25 &H2
'システムハイライト色を25%ブレンド
#define CLR_NONE &HFFFFFFFF
#define CLR_DEFAULT &HFF000000
#define MAX_PATH 260
Type SHFILEINFO
hIcon As Long
'アイコン
iIcon As Long
'アイコンインデックス
dwAttributes As Long
'属性
szDisplayName As String * MAX_PATH
'デスプレイ名(パス名)
szTypeName As Long
'タイプ名
End Type
' ファイルシステムオブジェクトの情報を取得
Declare Function Api_SHGetFileInfo& Lib "shell32" Alias "SHGetFileInfoA" (ByVal
pszPath$, ByVal dwFileAttributes&, psfi As SHFILEINFO, ByVal cbFileInfo&, ByVal
uFlags&)
' イメージを描画
Declare Function Api_ImageList_Draw& Lib "comctl32" Alias "ImageList_Draw"
(ByVal himl&, ByVal i&, ByVal hdcDst&, ByVal x&, ByVal y&, ByVal fStyle&)
' デバイスコンテキストにイメージリストのアイテムを描画(オフセット・背景色・前景色を指定できる)
Declare Function Api_ImageList_DrawEx& Lib "comctl32" Alias "ImageList_DrawEx"
(ByVal himl&, ByVal index&, ByVal hdcDst&, ByVal x&, ByVal y&, ByVal dx&, ByVal
dy&, ByVal rgbBk&, ByVal rgbFg&, ByVal fStyle&)
'
指定されたウィンドウのクライアント領域または画面全体を表すディスプレイデバイスコンテキストのハンドルを取得。その後、GDI
関数を使って、返されたデバイスコンテキスト内で描画を行える
Declare Function Api_GetDC& Lib "user32" Alias "GetDC" (ByVal hWnd&)
' デバイスコンテキストを解放
Declare Function Api_ReleaseDC& Lib "user32" Alias "ReleaseDC" (ByVal hWnd&,
ByVal hDC&)
Var Shared Button1 As Object
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14
'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
Var ePath As String
Var hDC As Long
Var hImage As Long
Var SFI As SHFILEINFO
Var Ret As Long
ePath = "C:\FBASICV63\BIN\FBASIC.exe"
hDC = Api_GetDC(GethWnd)
'小さいアイコンを含んでいるシステムイメージリストのハンドルを取得
hImage = Api_SHGetFileInfo(ePath, ByVal 0, SFI, Len(SFI),
SHGFI_SYSICONINDEX Or SHGFI_SMALLICON)
'小さいアイコン描画
Ret = Api_ImageList_Draw(hImage, SFI.iIcon, hDC, 10, 16, 0)
Ret = Api_ImageList_Draw(hImage, SFI.iIcon, hDC, 42, 16,
ILD_TRANSPARENT)
Ret = Api_ImageList_Draw(hImage, SFI.iIcon, hDC, 74, 16,
ILD_TRANSPARENT Or ILD_BLEND25)
Ret = Api_ImageList_Draw(hImage, SFI.iIcon, hDC, 106, 16,
ILD_TRANSPARENT Or ILD_BLEND50)
'大きいアイコンを含んでいるシステムイメージリストのハンドルを取得
hImage = Api_SHGetFileInfo(ePath, ByVal 0, SFI, Len(SFI),
SHGFI_SYSICONINDEX Or SHGFI_LARGEICON)
'大きいアイコン描画
Ret = Api_ImageList_Draw(hImage, SFI.iIcon, hDC, 10, 48, 0)
Ret = Api_ImageList_Draw(hImage, SFI.iIcon, hDC, 42, 48,
ILD_TRANSPARENT)
Ret = Api_ImageList_Draw(hImage, SFI.iIcon, hDC, 74, 48,
ILD_TRANSPARENT Or ILD_BLEND25)
Ret = Api_ImageList_Draw(hImage, SFI.iIcon, hDC, 106, 48,
ILD_TRANSPARENT Or ILD_BLEND50)
'背景色を指定
Ret = Api_ImageList_DrawEx(hImage, SFI.iIcon, hDC, 128, 16,
32, 32, &HFF, 0, ILD_BLEND50)
Ret = Api_ImageList_DrawEx(hImage, SFI.iIcon, hDC, 160, 16,
32, 32, &HFF00, 0, ILD_BLEND50)
Ret = Api_ImageList_DrawEx(hImage, SFI.iIcon, hDC, 192, 16,
32, 32, &HFF0000, 0, ILD_BLEND50)
Ret = Api_ReleaseDC(GwthWnd, hDC)
End Sub
'================================================================
'=
'================================================================
While 1
WaitEvent
Wend
Stop
End