環境: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; }
http://ux.getuploader.com/ADMIS/download/2/File_Manager_ICON_Ver0.4.zip
0 件のコメント:
コメントを投稿