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