4

IImageListと を使用して、特定のパスのジャンボ アイコンを抽出していSHGetFileInfoます。それができたら、GDI+とオブジェクトを使用した最終的なレンダリングHICONHBITMAP使用してレンダリングします。DrawIconExBitmapGraphics

これで、ビットマップの最終的なレンダリングを行うと、常に左端に黒いアーティファクトが表示されることを除いて、これはすべてうまく機能します。これは、私が取得するほとんどすべてのアイコンに当てはまり、常に左端です。

左の explorer.exe に表示されているもの、右に描画したアイコンの外観

ダークラインがどこから来ているのか、何か考えはありますか?

私が使用しているコードはおおよそ次のとおりです。

1. アイコンの抽出:

// Get the image list index of the icon
SHFILEINFO sfi;
if (!SHGetFileInfo(pszPath, 0, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX)) return NULL;

// Get the jumbo image list
IImageList *piml;
if (FAILED(SHGetImageList(SHIL_JUMBO, IID_PPV_ARGS(&piml)))) return NULL;

// Extract an icon
HICON hicon;
piml->GetIcon(sfi.iIcon, ILD_SCALE|ILD_TRANSPARENT, &hicon);
return hicon;

2.ビットマップを生成する

HDC hDC = GetDC(NULL);
HDC hMemDC = CreateCompatibleDC(hDC);
HBITMAP hMemBmp = CreateCompatibleBitmap(hDC, x, y);
HBITMAP hResultBmp = NULL;
HGDIOBJ hOrgBMP = SelectObject(hMemDC, hMemBmp);

HBRUSH hbr = CreateSolidBrush(bg);

RECT rr = { 0, 0, 256, 256 }; // jumbo icons
FillRect(hMemDC, &rr, hbr);
DeleteBrush(hbr);
DrawIconEx(hMemDC, 0, 0, hicon, size, size, 0, NULL, DI_NORMAL);

hResultBmp = hMemBmp;
hMemBmp = NULL;

SelectObject(hMemDC, hOrgBMP);
return hResultBitmap;

3. GDI+ ビットマップを「ウィンドウ ビットマップ」にレンダリングします。

Bitmap *b = ::New Bitmap(hResultBitmap, NULL);

Graphics    graphics(hdc);
graphics.SetTextRenderingHint(TextRenderingHintClearTypeGridFit);

SolidBrush  bgbrush(Color(255, 255, 255, 255));
Rect r(0, 0, hwnd_w, hwnd_h);
graphics.FillRectangle(&bgbrush, r);

graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic);
Rect r(5, 5, 128, 128);
graphics.DrawImage(dpd->image_to_draw, r);
4

1 に答える 1

4

うわー、私は昨夜それで遊んでいる間、別の時間を過ごしました. ILD_SCALEインですIImageList::GetIcon

それを取り除くと、すべてが再び完全に正常に機能します。図を見てください…</p>

1. アイコンの抽出:

// Get the image list index of the icon
SHFILEINFO sfi;
if (!SHGetFileInfo(pszPath, 0, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX)) return NULL;

// Get the jumbo image list
IImageList *piml;
if (FAILED(SHGetImageList(SHIL_JUMBO, IID_PPV_ARGS(&piml)))) return NULL;

// Extract an icon
HICON hicon;
piml->GetIcon(sfi.iIcon, ILD_TRANSPARENT, &hicon);
return hicon;
于 2012-09-19T02:37:34.887 に答える