LoginSignup
0
1

More than 3 years have passed since last update.

オーバーレイのアイコンの取得と表示

Posted at

TortoiseGitをインストールした際にエクスプローラーなどに表示されるアイコンを取得表示する。

アイコン情報を取得するには、
SHGetFileInfo
を使用します。

フラグに
SHGFI_OVERLAYINDEX
を追加するよ!

ハンドルを取得出来たら
DestroyIcon(shfi.hIcon)
でアイコンは開放しておく。

例)
アイコンのハンドルとインデックス番号を取得する関数

#include <shellapi.h>

#pragma comment(lib, "Shell32.lib")

HANDLE get_icon_handle(const TCHAR *entry, DWORD *d_no)
{
  SHFILEINFO  shfi;
  HANDLE      handle;

  handle = (HIMAGELIST)::SHGetFileInfo(entry,
                                       FILE_ATTRIBUTE_ARCHIVE,
                                      &shfi,
                                       sizeof( SHFILEINFO ),
                                         SHGFI_SMALLICON
                                       | SHGFI_SYSICONINDEX
                                       | SHGFI_OVERLAYINDEX
                                       | SHGFI_ICON);
  if (handle)
    {
      *d_no = shfi.iIcon;

      ::DestroyIcon(shfi.hIcon);
    }

  return handle;
}

アイコンを表示するには、
ImageList_DrawEx
を使います。

sub_indexにオーバーレイのインデックス番号が入ります。
オーバーレイされたファイルのアイコンが表示できます。

フラグに指定する、
INDEXTOOVERLAYMASK(sub_index)
これが重要!

例)
上で取得したハンドルとアイコンインデックスを使ってアイコンを表示する関数

void draw_icon(HDC hDC, HANDLE handle, int x, int y, int d_no)
{
  DWORD       index;
  DWORD       sub_index;

  index     =  d_no & 0x00FFFFFF;
  sub_index = (d_no & 0x0F000000) >> 24;

  ImageList_DrawEx(handle,
                   index,
                   hDC,
                   x,
                   y,
                   16,
                   16,
                   CLR_NONE,
                   CLR_NONE,
                   INDEXTOOVERLAYMASK(sub_index) | ILD_NORMAL);
}
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1