2013年9月21日土曜日

256*256pixlのアイコンを取得する方法

環境:windows7 x64 Visual C++ 2012

サンプル載せておきます。例によってhttp://www.wgag.net/winapi/のスケルトンプログラムをベースにします。

実行風景
Cドライブのアイコンなのですが、人のアイコンも一緒に表示されるのは、なんとかできたような気もするのですが、もう覚えていないのでそのままにして載せました。

では、サンプルをどうぞ。

#include 

#define _AFXDLL
#include //AfxGetInstanceHandle

#include 

#include 
#include //ExtractIconに必要//「#include 」より下に書かないとエラー……。
#include 





const TCHAR szWndClass[] = _T("TestProgram");

LRESULT CALLBACK WndProc(
    HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

// The entry point for the application
int WINAPI WinMain(
    HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASS wc;
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = szWndClass;

    if (!RegisterClass(&wc)) return FALSE;

    HWND hWnd = CreateWindow(
        szWndClass, _T("Title"),
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT,
        CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, NULL,
        hInstance, NULL);

    if (!hWnd) return FALSE;

    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
 {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return (int) msg.wParam;
}

// Processes messages for the main window
LRESULT CALLBACK WndProc(
    HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 HDC hdc;
    PAINTSTRUCT ps;
    switch (msg) {
 case WM_PAINT:

  SHFILEINFO sfi;
  if (!SHGetFileInfo(_T("C:\\"), 0, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX))//「SHGFI_SYSICONINDEX」iIconの取得に必要
   return NULL;
  

  // 画像リストを取得する
  IImageList *pImageList;
  if (SHGetImageList(SHIL_LAST , IID_IImageList, (void**)&pImageList) != S_OK)//下位互換性を考えるなら「SHIL_JUMBO」と直接指定するよりも「SHIL_LAST」なのかな?(まあもうXPはサポートが切れるが……)
   return NULL;

  // アイコンを取得する
  if (pImageList->GetIcon(sfi.iIcon, SHGFI_ICON|SHGFI_SELECTED, &sfi.hIcon) != S_OK)//ここのフラグをきちんと設定しないと「SHIL_JUMBO」の時に正しい?マスクを取得できない?ためにバグる。
   sfi.hIcon = NULL;

  // 画像リストを解放する
  pImageList->Release();

  hdc = BeginPaint(hWnd, &ps);
  
  DrawIconEx(hdc,0,0,sfi.hIcon,256,256,0,NULL, DI_MASK);
  DrawIconEx(hdc,256,0,sfi.hIcon,256,256,0,NULL, DI_IMAGE);
  DrawIconEx(hdc,0,256,sfi.hIcon,256,256,0,NULL, DI_NORMAL);
  DrawIconEx(hdc,256,256,sfi.hIcon,256,256,0,NULL,DI_IMAGE | DI_MASK);
  
  EndPaint(hWnd, &ps);

  DestroyIcon(sfi.hIcon);
  
  break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, msg, wParam, lParam);
    }

    return 0;
}
 なんか微妙に表示がバグっているのでファイルでも置いておきます。(Web系は分からないのです。)
http://ux.getuploader.com/ADMIS/download/2/File_Manager_ICON_Ver0.4.zip

0 件のコメント:

コメントを投稿