SDKです。
アイコンをウィンドウのクライアント領域に表示させたい場合、通常DrawIconやDrawIconExを使いますが、StretchBlt関数を使ってBitmapの拡大縮小のようなことをしようと思いつきまして壁に当たってしまいました。
(拡大縮小はDrawIconExでできることも承知です。)
下のようなコードで実現できると思ったんですが、表示したアイコンの背景が黒くなってしまいます。
どこがおかしいんでしょうか?
static iRate; //縮尺
HDC hdc, hdc_mem;
HBITMAP hBM_mem;
static int w = GetSystemMetrics(SM_CXICON);
static int h = GetSystemMetrics(SM_CYICON);
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
hdc_mem = CreateCompatibleDC(hdc);
hBM_mem = CreateCompatibleBitmap(hdc, w, h);
SelectObject(hdc_mem, hBM_mem);
DrawIcon(hdc_mem, 0, 0, hIcon);
StretchBlt(hdc, 0, 0, (w * iRate) / 100, (h * iRate) / 100, hdc_mem, 0, 0, w, h, SRCCOPY);
DeleteObject(hBM_mem);
DeleteDC(hdc_mem);
EndPaint(hwnd, &ps);
return 0;
> DrawIcon(hdc_mem, 0, 0, hIcon);
によってhIconの透過情報を使って描画されますが。
hdc_mem自体が透過情報を持つわけではありません。
そもそもデバイスコンテキストに透過情報という概念はありません。
Regionを使って透過処理ができなくもないと思いますがお勧めしません。
DrawIconExに任せるのがベストだと思います。
ツイート | ![]() |